From 841e1f8ab27cf2ced5def17b33702232ee38d9f4 Mon Sep 17 00:00:00 2001 From: chan Date: Thu, 14 May 2026 11:00:15 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B0=B1=EC=97=94=EB=93=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(=EC=99=B8=EB=9E=98=20=ED=82=A4=20=EC=A0=9C=EC=95=BD=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EB=B0=8F=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=AC=B4?= =?UTF-8?q?=EA=B2=B0=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B0=98=EC=98=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data_integrity_repository_test.go | 13 ++++------ .../user_projection_repository_test.go | 1 + .../repository/user_repository_test.go | 24 +++++++++++++------ 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/backend/internal/repository/data_integrity_repository_test.go b/backend/internal/repository/data_integrity_repository_test.go index f530e7ef..3605565c 100644 --- a/backend/internal/repository/data_integrity_repository_test.go +++ b/backend/internal/repository/data_integrity_repository_test.go @@ -68,24 +68,19 @@ func TestCheckDataIntegrityDetectsTenantAndUserProblems(t *testing.T) { FieldKey: "emp_id", LoginID: "EMP-" + suffix, }).Error) - require.NoError(t, testDB.Create(&domain.UserLoginID{ - ID: uuid.NewString(), - UserID: uuid.NewString(), - TenantID: child.ID, - FieldKey: "emp_id", - LoginID: "MISSING-" + suffix, - }).Error) + // Missing UserID for UserLoginID cannot be inserted due to FK constraint fk_users_user_login_ids. + // So we don't test orphan_user_login_id_users here. report, err := CheckDataIntegrity(ctx, testDB) require.NoError(t, err) 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", "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_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) { diff --git a/backend/internal/repository/user_projection_repository_test.go b/backend/internal/repository/user_projection_repository_test.go index c0f92041..786f42ae 100644 --- a/backend/internal/repository/user_projection_repository_test.go +++ b/backend/internal/repository/user_projection_repository_test.go @@ -50,6 +50,7 @@ func TestUserProjectionRepository_ReplaceAllFromKratosMarksReadyAndRemovesStaleU ID: "00000000-0000-0000-0000-000000000102", Email: "two@example.com", Name: "Two", + TenantID: &tenantID, CompanyCodes: []string{tenantSlug}, CreatedAt: time.Now(), UpdatedAt: time.Now(), diff --git a/backend/internal/repository/user_repository_test.go b/backend/internal/repository/user_repository_test.go index 0313c94d..90790591 100644 --- a/backend/internal/repository/user_repository_test.go +++ b/backend/internal/repository/user_repository_test.go @@ -77,12 +77,18 @@ func TestUserRepository(t *testing.T) { t.Run("CountByCompanyCodes", func(t *testing.T) { // Clean start for this subtest 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{ - {Email: "u1@a.com", Name: "U1", CompanyCode: "tenant-a"}, - {Email: "u2@a.com", Name: "U2", CompanyCode: "tenant-a"}, - {Email: "u3@b.com", Name: "U3", CompanyCode: "tenant-b"}, - {Email: "u4@none.com", Name: "U4", CompanyCode: ""}, + {Email: "u1@a.com", Name: "U1", TenantID: &tenantA.ID}, + {Email: "u2@a.com", Name: "U2", TenantID: &tenantA.ID}, + {Email: "u3@b.com", Name: "U3", TenantID: &tenantB.ID}, + {Email: "u4@none.com", Name: "U4", TenantID: nil}, } for _, u := range users { _ = 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) { testDB.Exec("DELETE FROM users") + testDB.Exec("DELETE FROM tenants") - active := &domain.User{Email: "active@a.com", Name: "Active", CompanyCode: "tenant-a"} - deleted := &domain.User{Email: "deleted@a.com", Name: "Deleted", CompanyCode: "tenant-a"} - arrayDeleted := &domain.User{Email: "array-deleted@a.com", Name: "Array Deleted", CompanyCodes: []string{"tenant-a"}} + tenantA := &domain.Tenant{Name: "Tenant A", Slug: "tenant-a", Type: domain.TenantTypeCompany} + _ = testDB.Create(tenantA) + + 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, deleted))