Files
honeyDueAPI/internal/repositories/user_repo_test.go
Trey t 469f21a833 Add PDF reports, file uploads, admin auth, and comprehensive tests
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>
2025-11-27 23:36:20 -06:00

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)
}