package bootstrap import ( "baron-sso-backend/internal/domain" "os" "path/filepath" "testing" ) func TestSeedTenantCSVDefinesWorksmobileDomainClassTenants(t *testing.T) { configs, err := loadSeedTenantConfigs() if err != nil { t.Fatalf("loadSeedTenantConfigs returned error: %v", err) } expected := []struct { name string slug string tenantType string parentSlug string domains []string }{ { name: "한맥가족", slug: "hanmac-family", tenantType: domain.TenantTypeCompanyGroup, }, { name: "삼안", slug: "saman", tenantType: domain.TenantTypeCompany, parentSlug: "hanmac-family", domains: []string{"samaneng.com"}, }, { name: "한맥기술", slug: "hanmac", tenantType: domain.TenantTypeCompany, parentSlug: "hanmac-family", domains: []string{"hanmaceng.co.kr"}, }, { name: "총괄기획&기술개발센터", slug: "gpdtdc", tenantType: domain.TenantTypeCompany, parentSlug: "hanmac-family", domains: []string{"baroncs.co.kr"}, }, { name: "바론그룹", slug: "baron-group", tenantType: domain.TenantTypeCompanyGroup, parentSlug: "hanmac-family", }, { name: "(주)장헌", slug: "jangheon", tenantType: domain.TenantTypeCompany, parentSlug: "baron-group", domains: []string{"jangheon.com"}, }, { name: "장헌산업", slug: "jangheon-sanup", tenantType: domain.TenantTypeCompany, parentSlug: "baron-group", domains: []string{"jangheon.co.kr"}, }, { name: "한라산업개발", slug: "hanlla", tenantType: domain.TenantTypeCompany, parentSlug: "baron-group", domains: []string{"hanllasanup.co.kr"}, }, { name: "(주)피티씨", slug: "ptc", tenantType: domain.TenantTypeCompany, parentSlug: "baron-group", domains: []string{"pre-cast.co.kr"}, }, { name: "Personal", slug: "personal", tenantType: domain.TenantTypePersonal, }, } if len(configs) != len(expected) { t.Fatalf("expected %d seed tenants, got %d", len(expected), len(configs)) } for i, want := range expected { got := configs[i] if got.Name != want.name { t.Fatalf("tenant[%d] name = %q, want %q", i, got.Name, want.name) } if got.Slug != want.slug { t.Fatalf("tenant[%d] slug = %q, want %q", i, got.Slug, want.slug) } if got.Type != want.tenantType { t.Fatalf("tenant[%d] type = %q, want %q", i, got.Type, want.tenantType) } if got.ParentSlug != want.parentSlug { t.Fatalf("tenant[%d] parent slug = %q, want %q", i, got.ParentSlug, want.parentSlug) } if len(got.Domains) != len(want.domains) { t.Fatalf("tenant[%d] domains = %#v, want %#v", i, got.Domains, want.domains) } for j, wantDomain := range want.domains { if got.Domains[j] != wantDomain { t.Fatalf("tenant[%d] domain[%d] = %q, want %q", i, j, got.Domains[j], wantDomain) } } } } func TestNormalizeSeedTenantTypeAllowsOrganization(t *testing.T) { if got := normalizeSeedTenantType("organization"); got != domain.TenantTypeOrganization { t.Fatalf("normalizeSeedTenantType(organization) = %q, want %q", got, domain.TenantTypeOrganization) } } func TestLoadSeedTenantConfigsUsesConfiguredCSVPath(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "seed-tenant.csv") csv := "name,type,parent_tenant_slug,slug,memo,email_domain\n" + "Root,COMPANY_GROUP,,root,Root memo,\n" + "Child,COMPANY,root,child,Child memo,child.example.com\n" if err := os.WriteFile(path, []byte(csv), 0o600); err != nil { t.Fatalf("failed to write seed csv: %v", err) } t.Setenv(seedTenantCSVPathEnv, path) configs, err := loadSeedTenantConfigs() if err != nil { t.Fatalf("loadSeedTenantConfigs returned error: %v", err) } if len(configs) != 2 { t.Fatalf("expected 2 configs, got %d", len(configs)) } if configs[1].ParentSlug != "root" { t.Fatalf("child parent slug = %q, want root", configs[1].ParentSlug) } if len(configs[1].Domains) != 1 || configs[1].Domains[0] != "child.example.com" { t.Fatalf("child domains = %#v, want child.example.com", configs[1].Domains) } } func TestIsSeedTenantSlugUsesConfiguredCSVPath(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "seed-tenant.csv") csv := "name,type,parent_tenant_slug,slug,memo,email_domain\n" + "Root,COMPANY_GROUP,,protected-root,Root memo,\n" if err := os.WriteFile(path, []byte(csv), 0o600); err != nil { t.Fatalf("failed to write seed csv: %v", err) } t.Setenv(seedTenantCSVPathEnv, path) if !IsSeedTenantSlug("protected-root") { t.Fatal("protected-root must be detected as seed tenant") } if IsSeedTenantSlug("normal-tenant") { t.Fatal("normal-tenant must not be detected as seed tenant") } }