Features: - PDF service for generating task reports with ReportLab-style formatting - Storage service for file uploads (local and S3-compatible) - Admin authentication middleware with JWT support - Admin user model and repository Infrastructure: - Updated Docker configuration for admin panel builds - Email service enhancements for task notifications - Updated router with admin and file upload routes - Environment configuration updates Tests: - Unit tests for handlers (auth, residence, task) - Unit tests for models (user, residence, task) - Unit tests for repositories (user, residence, task) - Unit tests for services (residence, task) - Integration test setup - Test utilities for mocking database and services Database: - Admin user seed data - Updated test data seeds 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
190 lines
4.6 KiB
Go
190 lines
4.6 KiB
Go
package repositories
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/treytartt/mycrib-api/internal/models"
|
|
"github.com/treytartt/mycrib-api/internal/testutil"
|
|
)
|
|
|
|
func TestUserRepository_Create(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
user := &models.User{
|
|
Username: "testuser",
|
|
Email: "test@example.com",
|
|
IsActive: true,
|
|
}
|
|
user.SetPassword("password123")
|
|
|
|
err := repo.Create(user)
|
|
require.NoError(t, err)
|
|
assert.NotZero(t, user.ID)
|
|
}
|
|
|
|
func TestUserRepository_FindByID(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
// Create user
|
|
user := testutil.CreateTestUser(t, db, "testuser", "test@example.com", "password123")
|
|
|
|
// Find by ID
|
|
found, err := repo.FindByID(user.ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, user.ID, found.ID)
|
|
assert.Equal(t, "testuser", found.Username)
|
|
assert.Equal(t, "test@example.com", found.Email)
|
|
}
|
|
|
|
func TestUserRepository_FindByID_NotFound(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
_, err := repo.FindByID(9999)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestUserRepository_FindByUsername(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
// Create user
|
|
user := testutil.CreateTestUser(t, db, "testuser", "test@example.com", "password123")
|
|
|
|
// Find by username
|
|
found, err := repo.FindByUsername("testuser")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, user.ID, found.ID)
|
|
}
|
|
|
|
func TestUserRepository_FindByEmail(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
// Create user
|
|
user := testutil.CreateTestUser(t, db, "testuser", "test@example.com", "password123")
|
|
|
|
// Find by email
|
|
found, err := repo.FindByEmail("test@example.com")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, user.ID, found.ID)
|
|
}
|
|
|
|
func TestUserRepository_FindByUsernameOrEmail(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
// Create user
|
|
user := testutil.CreateTestUser(t, db, "testuser", "test@example.com", "password123")
|
|
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
expected uint
|
|
}{
|
|
{"find by username", "testuser", user.ID},
|
|
{"find by email", "test@example.com", user.ID},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
found, err := repo.FindByUsernameOrEmail(tt.input)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, tt.expected, found.ID)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUserRepository_Update(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
// Create user
|
|
user := testutil.CreateTestUser(t, db, "testuser", "test@example.com", "password123")
|
|
|
|
// Update user
|
|
user.FirstName = "John"
|
|
user.LastName = "Doe"
|
|
err := repo.Update(user)
|
|
require.NoError(t, err)
|
|
|
|
// Verify update
|
|
found, err := repo.FindByID(user.ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "John", found.FirstName)
|
|
assert.Equal(t, "Doe", found.LastName)
|
|
}
|
|
|
|
func TestUserRepository_ExistsByUsername(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
// Create user
|
|
testutil.CreateTestUser(t, db, "existinguser", "existing@example.com", "password123")
|
|
|
|
tests := []struct {
|
|
name string
|
|
username string
|
|
expected bool
|
|
}{
|
|
{"existing user", "existinguser", true},
|
|
{"non-existing user", "nonexistent", false},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
exists, err := repo.ExistsByUsername(tt.username)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, tt.expected, exists)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUserRepository_ExistsByEmail(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
// Create user
|
|
testutil.CreateTestUser(t, db, "existinguser", "existing@example.com", "password123")
|
|
|
|
tests := []struct {
|
|
name string
|
|
email string
|
|
expected bool
|
|
}{
|
|
{"existing email", "existing@example.com", true},
|
|
{"non-existing email", "nonexistent@example.com", false},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
exists, err := repo.ExistsByEmail(tt.email)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, tt.expected, exists)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUserRepository_GetOrCreateProfile(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewUserRepository(db)
|
|
|
|
// Create user
|
|
user := testutil.CreateTestUser(t, db, "testuser", "test@example.com", "password123")
|
|
|
|
// First call should create
|
|
profile1, err := repo.GetOrCreateProfile(user.ID)
|
|
require.NoError(t, err)
|
|
assert.NotZero(t, profile1.ID)
|
|
|
|
// Second call should return same profile
|
|
profile2, err := repo.GetOrCreateProfile(user.ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, profile1.ID, profile2.ID)
|
|
}
|