- 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>
217 lines
6.8 KiB
Go
217 lines
6.8 KiB
Go
package repositories
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/treytartt/honeydue-api/internal/testutil"
|
|
)
|
|
|
|
func TestResidenceRepository_FindByIDSimple(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
residence := testutil.CreateTestResidence(t, db, user.ID, "Test House")
|
|
|
|
found, err := repo.FindByIDSimple(residence.ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, residence.ID, found.ID)
|
|
assert.Equal(t, "Test House", found.Name)
|
|
}
|
|
|
|
func TestResidenceRepository_FindByIDSimple_NotFound(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
_, err := repo.FindByIDSimple(9999)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestResidenceRepository_FindByIDSimple_InactiveNotFound(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
residence := testutil.CreateTestResidence(t, db, user.ID, "Test House")
|
|
|
|
db.Model(residence).Update("is_active", false)
|
|
|
|
_, err := repo.FindByIDSimple(residence.ID)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestResidenceRepository_FindResidenceIDsByUser(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
sharedUser := testutil.CreateTestUser(t, db, "shared", "shared@test.com", "Password123")
|
|
|
|
r1 := testutil.CreateTestResidence(t, db, owner.ID, "House 1")
|
|
r2 := testutil.CreateTestResidence(t, db, owner.ID, "House 2")
|
|
|
|
repo.AddUser(r1.ID, sharedUser.ID)
|
|
|
|
// Owner should see both
|
|
ownerIDs, err := repo.FindResidenceIDsByUser(owner.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, ownerIDs, 2)
|
|
|
|
// Shared user should see one
|
|
sharedIDs, err := repo.FindResidenceIDsByUser(sharedUser.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, sharedIDs, 1)
|
|
assert.Equal(t, r1.ID, sharedIDs[0])
|
|
|
|
_ = r2 // suppress unused
|
|
}
|
|
|
|
func TestResidenceRepository_FindResidenceIDsByOwner(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
otherOwner := testutil.CreateTestUser(t, db, "other", "other@test.com", "Password123")
|
|
|
|
testutil.CreateTestResidence(t, db, owner.ID, "House 1")
|
|
testutil.CreateTestResidence(t, db, owner.ID, "House 2")
|
|
testutil.CreateTestResidence(t, db, otherOwner.ID, "Other House")
|
|
|
|
ids, err := repo.FindResidenceIDsByOwner(owner.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, ids, 2)
|
|
}
|
|
|
|
func TestResidenceRepository_DeactivateShareCode(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
residence := testutil.CreateTestResidence(t, db, owner.ID, "Test House")
|
|
|
|
// Create a share code
|
|
created, err := repo.CreateShareCode(residence.ID, owner.ID, 24*60*60*1000*1000*1000) // 24h in ns
|
|
require.NoError(t, err)
|
|
assert.True(t, created.IsActive)
|
|
|
|
// Deactivate it
|
|
err = repo.DeactivateShareCode(created.ID)
|
|
require.NoError(t, err)
|
|
|
|
// FindShareCodeByCode should not find it
|
|
_, err = repo.FindShareCodeByCode(created.Code)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestResidenceRepository_GetActiveShareCode(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
residence := testutil.CreateTestResidence(t, db, owner.ID, "Test House")
|
|
|
|
// No active code initially
|
|
code, err := repo.GetActiveShareCode(residence.ID)
|
|
require.NoError(t, err)
|
|
assert.Nil(t, code)
|
|
|
|
// Create a share code
|
|
created, err := repo.CreateShareCode(residence.ID, owner.ID, 24*60*60*1000*1000*1000)
|
|
require.NoError(t, err)
|
|
|
|
// Should find the active code
|
|
code, err = repo.GetActiveShareCode(residence.ID)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, code)
|
|
assert.Equal(t, created.Code, code.Code)
|
|
}
|
|
|
|
func TestResidenceRepository_CreateShareCode_DeactivatesPrevious(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
residence := testutil.CreateTestResidence(t, db, owner.ID, "Test House")
|
|
|
|
// Create first code
|
|
first, err := repo.CreateShareCode(residence.ID, owner.ID, 24*60*60*1000*1000*1000)
|
|
require.NoError(t, err)
|
|
|
|
// Create second code (should deactivate first)
|
|
second, err := repo.CreateShareCode(residence.ID, owner.ID, 24*60*60*1000*1000*1000)
|
|
require.NoError(t, err)
|
|
|
|
assert.NotEqual(t, first.Code, second.Code)
|
|
|
|
// First code should no longer be findable
|
|
_, err = repo.FindShareCodeByCode(first.Code)
|
|
assert.Error(t, err)
|
|
|
|
// Second code should be active
|
|
found, err := repo.FindShareCodeByCode(second.Code)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, second.Code, found.Code)
|
|
}
|
|
|
|
func TestResidenceRepository_FindResidenceTypeByID(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
testutil.SeedLookupData(t, db)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
// Get first residence type
|
|
types, err := repo.GetAllResidenceTypes()
|
|
require.NoError(t, err)
|
|
require.NotEmpty(t, types)
|
|
|
|
found, err := repo.FindResidenceTypeByID(types[0].ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, types[0].Name, found.Name)
|
|
}
|
|
|
|
func TestResidenceRepository_FindResidenceTypeByID_NotFound(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
_, err := repo.FindResidenceTypeByID(9999)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestResidenceRepository_GetTasksForReport(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
user := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
residence := testutil.CreateTestResidence(t, db, user.ID, "Test House")
|
|
|
|
testutil.CreateTestTask(t, db, residence.ID, user.ID, "Task 1")
|
|
testutil.CreateTestTask(t, db, residence.ID, user.ID, "Task 2")
|
|
|
|
tasks, err := repo.GetTasksForReport(residence.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, tasks, 2)
|
|
}
|
|
|
|
func TestResidenceRepository_AddUser_Idempotent(t *testing.T) {
|
|
db := testutil.SetupTestDB(t)
|
|
repo := NewResidenceRepository(db)
|
|
|
|
owner := testutil.CreateTestUser(t, db, "owner", "owner@test.com", "Password123")
|
|
sharedUser := testutil.CreateTestUser(t, db, "shared", "shared@test.com", "Password123")
|
|
residence := testutil.CreateTestResidence(t, db, owner.ID, "Test House")
|
|
|
|
// Add same user twice (should not error due to ON CONFLICT DO NOTHING)
|
|
err := repo.AddUser(residence.ID, sharedUser.ID)
|
|
require.NoError(t, err)
|
|
|
|
err = repo.AddUser(residence.ID, sharedUser.ID)
|
|
require.NoError(t, err)
|
|
|
|
// Should still only count once
|
|
users, err := repo.GetResidenceUsers(residence.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, users, 2) // owner + sharedUser
|
|
}
|