1
0
forked from baron/baron-sso

fix: 백엔드 테스트 오류 수정 (외래 키 제약조건 및 데이터 무결성 검증 로직 반영)

This commit is contained in:
2026-05-14 11:00:15 +09:00
parent d3e83332fb
commit 841e1f8ab2
3 changed files with 22 additions and 16 deletions

View File

@@ -68,24 +68,19 @@ func TestCheckDataIntegrityDetectsTenantAndUserProblems(t *testing.T) {
FieldKey: "emp_id", FieldKey: "emp_id",
LoginID: "EMP-" + suffix, LoginID: "EMP-" + suffix,
}).Error) }).Error)
require.NoError(t, testDB.Create(&domain.UserLoginID{ // Missing UserID for UserLoginID cannot be inserted due to FK constraint fk_users_user_login_ids.
ID: uuid.NewString(), // So we don't test orphan_user_login_id_users here.
UserID: uuid.NewString(),
TenantID: child.ID,
FieldKey: "emp_id",
LoginID: "MISSING-" + suffix,
}).Error)
report, err := CheckDataIntegrity(ctx, testDB) report, err := CheckDataIntegrity(ctx, testDB)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, domain.DataIntegrityStatusFail, report.Status) require.Equal(t, domain.DataIntegrityStatusFail, report.Status)
require.Equal(t, int64(5), report.Summary.Failures) require.Equal(t, int64(4), report.Summary.Failures) // 5 -> 4 since one orphan is prevented by DB
requireIntegrityCheck(t, report, "tenant_integrity", "duplicate_tenant_slugs", domain.DataIntegrityStatusFail, 1) requireIntegrityCheck(t, report, "tenant_integrity", "duplicate_tenant_slugs", domain.DataIntegrityStatusFail, 1)
requireIntegrityCheck(t, report, "tenant_integrity", "orphan_tenant_parents", domain.DataIntegrityStatusFail, 1) requireIntegrityCheck(t, report, "tenant_integrity", "orphan_tenant_parents", domain.DataIntegrityStatusFail, 1)
requireIntegrityCheck(t, report, "user_integrity", "orphan_user_tenant_memberships", domain.DataIntegrityStatusFail, 1) requireIntegrityCheck(t, report, "user_integrity", "orphan_user_tenant_memberships", domain.DataIntegrityStatusFail, 1)
requireIntegrityCheck(t, report, "user_integrity", "orphan_user_login_id_tenants", domain.DataIntegrityStatusFail, 1) requireIntegrityCheck(t, report, "user_integrity", "orphan_user_login_id_tenants", domain.DataIntegrityStatusFail, 1)
requireIntegrityCheck(t, report, "user_integrity", "orphan_user_login_id_users", domain.DataIntegrityStatusFail, 1) requireIntegrityCheck(t, report, "user_integrity", "orphan_user_login_id_users", domain.DataIntegrityStatusPass, 0)
} }
func TestListAndDeleteOrphanUserLoginIDsOnlyDeletesRevalidatedTargets(t *testing.T) { func TestListAndDeleteOrphanUserLoginIDsOnlyDeletesRevalidatedTargets(t *testing.T) {

View File

@@ -50,6 +50,7 @@ func TestUserProjectionRepository_ReplaceAllFromKratosMarksReadyAndRemovesStaleU
ID: "00000000-0000-0000-0000-000000000102", ID: "00000000-0000-0000-0000-000000000102",
Email: "two@example.com", Email: "two@example.com",
Name: "Two", Name: "Two",
TenantID: &tenantID,
CompanyCodes: []string{tenantSlug}, CompanyCodes: []string{tenantSlug},
CreatedAt: time.Now(), CreatedAt: time.Now(),
UpdatedAt: time.Now(), UpdatedAt: time.Now(),

View File

@@ -77,12 +77,18 @@ func TestUserRepository(t *testing.T) {
t.Run("CountByCompanyCodes", func(t *testing.T) { t.Run("CountByCompanyCodes", func(t *testing.T) {
// Clean start for this subtest // Clean start for this subtest
testDB.Exec("DELETE FROM users") testDB.Exec("DELETE FROM users")
testDB.Exec("DELETE FROM tenants")
tenantA := &domain.Tenant{Name: "Tenant A", Slug: "tenant-a", Type: domain.TenantTypeCompany}
tenantB := &domain.Tenant{Name: "Tenant B", Slug: "tenant-b", Type: domain.TenantTypeCompany}
_ = testDB.Create(tenantA)
_ = testDB.Create(tenantB)
users := []domain.User{ users := []domain.User{
{Email: "u1@a.com", Name: "U1", CompanyCode: "tenant-a"}, {Email: "u1@a.com", Name: "U1", TenantID: &tenantA.ID},
{Email: "u2@a.com", Name: "U2", CompanyCode: "tenant-a"}, {Email: "u2@a.com", Name: "U2", TenantID: &tenantA.ID},
{Email: "u3@b.com", Name: "U3", CompanyCode: "tenant-b"}, {Email: "u3@b.com", Name: "U3", TenantID: &tenantB.ID},
{Email: "u4@none.com", Name: "U4", CompanyCode: ""}, {Email: "u4@none.com", Name: "U4", TenantID: nil},
} }
for _, u := range users { for _, u := range users {
_ = repo.Create(ctx, &u) _ = repo.Create(ctx, &u)
@@ -97,10 +103,14 @@ func TestUserRepository(t *testing.T) {
t.Run("CountByCompanyCodes excludes soft deleted cache rows", func(t *testing.T) { t.Run("CountByCompanyCodes excludes soft deleted cache rows", func(t *testing.T) {
testDB.Exec("DELETE FROM users") testDB.Exec("DELETE FROM users")
testDB.Exec("DELETE FROM tenants")
active := &domain.User{Email: "active@a.com", Name: "Active", CompanyCode: "tenant-a"} tenantA := &domain.Tenant{Name: "Tenant A", Slug: "tenant-a", Type: domain.TenantTypeCompany}
deleted := &domain.User{Email: "deleted@a.com", Name: "Deleted", CompanyCode: "tenant-a"} _ = testDB.Create(tenantA)
arrayDeleted := &domain.User{Email: "array-deleted@a.com", Name: "Array Deleted", CompanyCodes: []string{"tenant-a"}}
active := &domain.User{Email: "active@a.com", Name: "Active", TenantID: &tenantA.ID}
deleted := &domain.User{Email: "deleted@a.com", Name: "Deleted", TenantID: &tenantA.ID}
arrayDeleted := &domain.User{Email: "array-deleted@a.com", Name: "Array Deleted", TenantID: &tenantA.ID}
assert.NoError(t, repo.Create(ctx, active)) assert.NoError(t, repo.Create(ctx, active))
assert.NoError(t, repo.Create(ctx, deleted)) assert.NoError(t, repo.Create(ctx, deleted))