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>
This commit is contained in:
205
internal/repositories/admin_repo_test.go
Normal file
205
internal/repositories/admin_repo_test.go
Normal file
@@ -0,0 +1,205 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user