package repositories import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/treytartt/casera-api/internal/models" "github.com/treytartt/casera-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) }