forked from baron/baron-sso
fix: 백엔드 테스트 오류 수정 (외래 키 제약조건 및 데이터 무결성 검증 로직 반영)
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user