Files
honeyDueAPI/internal/repositories/admin_repo_test.go
Trey T bec880886b Coverage priorities 1-5: test pure functions, extract interfaces, mock-based handler tests
- Priority 1: Test NewSendEmailTask + NewSendPushTask (5 tests)
- Priority 2: Test customHTTPErrorHandler — all 15+ branches (21 tests)
- Priority 3: Extract Enqueuer interface + payload builders in worker pkg (5 tests)
- Priority 4: Extract ClassifyFile/ComputeRelPath in migrate-encrypt (6 tests)
- Priority 5: Define Handler interfaces, refactor to accept them, mock-based tests (14 tests)
- Fix .gitignore: /worker instead of worker to stop ignoring internal/worker/

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 20:30:09 -05:00

206 lines
5.7 KiB
Go

package repositories
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/honeydue-api/internal/testutil"
)
func TestAdminRepository_Create(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{
Email: "admin@test.com",
FirstName: "Test",
LastName: "Admin",
Role: models.AdminRoleAdmin,
IsActive: true,
}
require.NoError(t, admin.SetPassword("Password123"))
err := repo.Create(admin)
require.NoError(t, err)
assert.NotZero(t, admin.ID)
}
func TestAdminRepository_Create_Duplicate(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin1 := &models.AdminUser{Email: "admin@test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin1.SetPassword("Password123"))
err := repo.Create(admin1)
require.NoError(t, err)
admin2 := &models.AdminUser{Email: "admin@test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin2.SetPassword("Password123"))
err = repo.Create(admin2)
assert.ErrorIs(t, err, ErrAdminExists)
}
func TestAdminRepository_FindByID(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{Email: "admin@test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
found, err := repo.FindByID(admin.ID)
require.NoError(t, err)
assert.Equal(t, "admin@test.com", found.Email)
}
func TestAdminRepository_FindByID_NotFound(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
_, err := repo.FindByID(9999)
assert.ErrorIs(t, err, ErrAdminNotFound)
}
func TestAdminRepository_FindByEmail(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{Email: "admin@test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
found, err := repo.FindByEmail("admin@test.com")
require.NoError(t, err)
assert.Equal(t, admin.ID, found.ID)
}
func TestAdminRepository_FindByEmail_CaseInsensitive(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{Email: "Admin@Test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
found, err := repo.FindByEmail("admin@test.com")
require.NoError(t, err)
assert.Equal(t, admin.ID, found.ID)
}
func TestAdminRepository_FindByEmail_NotFound(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
_, err := repo.FindByEmail("nonexistent@test.com")
assert.ErrorIs(t, err, ErrAdminNotFound)
}
func TestAdminRepository_Update(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{Email: "admin@test.com", FirstName: "Old", Role: models.AdminRoleAdmin}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
admin.FirstName = "New"
err := repo.Update(admin)
require.NoError(t, err)
found, err := repo.FindByID(admin.ID)
require.NoError(t, err)
assert.Equal(t, "New", found.FirstName)
}
func TestAdminRepository_Delete(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{Email: "admin@test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
err := repo.Delete(admin.ID)
require.NoError(t, err)
_, err = repo.FindByID(admin.ID)
assert.ErrorIs(t, err, ErrAdminNotFound)
}
func TestAdminRepository_UpdateLastLogin(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{Email: "admin@test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
assert.Nil(t, admin.LastLogin)
err := repo.UpdateLastLogin(admin.ID)
require.NoError(t, err)
found, err := repo.FindByID(admin.ID)
require.NoError(t, err)
assert.NotNil(t, found.LastLogin)
}
func TestAdminRepository_List(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
for i := 0; i < 5; i++ {
admin := &models.AdminUser{
Email: "admin" + string(rune('0'+i)) + "@test.com",
Role: models.AdminRoleAdmin,
}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
}
// Page 1
admins, total, err := repo.List(1, 3)
require.NoError(t, err)
assert.Equal(t, int64(5), total)
assert.Len(t, admins, 3)
// Page 2
admins, total, err = repo.List(2, 3)
require.NoError(t, err)
assert.Equal(t, int64(5), total)
assert.Len(t, admins, 2)
}
func TestAdminRepository_ExistsByEmail(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{Email: "admin@test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
exists, err := repo.ExistsByEmail("admin@test.com")
require.NoError(t, err)
assert.True(t, exists)
exists, err = repo.ExistsByEmail("nonexistent@test.com")
require.NoError(t, err)
assert.False(t, exists)
}
func TestAdminRepository_ExistsByEmail_CaseInsensitive(t *testing.T) {
db := testutil.SetupTestDB(t)
repo := NewAdminRepository(db)
admin := &models.AdminUser{Email: "Admin@Test.com", Role: models.AdminRoleAdmin}
require.NoError(t, admin.SetPassword("Password123"))
require.NoError(t, repo.Create(admin))
exists, err := repo.ExistsByEmail("admin@test.com")
require.NoError(t, err)
assert.True(t, exists)
}