package company import ( "os" "path/filepath" "regexp" "testing" ) func TestNormalizeLanguage(t *testing.T) { if got := NormalizeLanguage(" EN "); got != "en" { t.Fatalf("NormalizeLanguage: got %q", got) } } func TestParseLanguage_AllowedPopular(t *testing.T) { for _, code := range []string{"en", "es", "fr", "de", "it", "pt", "nl", "pl", "ja"} { got, err := ParseLanguage(code, false) if err != nil || got != code { t.Fatalf("ParseLanguage(%q): got=%q err=%v", code, got, err) } } } func TestParseLanguage_RejectsUnknown(t *testing.T) { if _, err := ParseLanguage("xx", false); err == nil { t.Fatal("expected error for unknown language") } } func TestParseLanguage_EmptyDefault(t *testing.T) { got, err := ParseLanguage("", true) if err != nil || got != DefaultLanguage { t.Fatalf("empty default: got=%q err=%v", got, err) } if _, err := ParseLanguage("", false); err == nil { t.Fatal("expected error for empty without default") } } func TestIsAllowedLanguage(t *testing.T) { if !IsAllowedLanguage("JA") { t.Fatal("ja should be allowed") } if IsAllowedLanguage("zh") { t.Fatal("zh not in allowlist yet") } } func TestLanguageLabel(t *testing.T) { if got := LanguageLabel("fr"); got != "French" { t.Fatalf("fr: got %q", got) } if got := LanguageLabel(""); got != "English" { t.Fatalf("empty: got %q", got) } if got := LanguageLabel("xx"); got != "English" { t.Fatalf("unknown: got %q", got) } } func TestContentLanguagesSyncWithWebAllowlist(t *testing.T) { root := findRepoRoot(t) tsPath := filepath.Join(root, "apps", "web", "src", "lib", "content-languages.ts") raw, err := os.ReadFile(tsPath) if err != nil { t.Fatalf("read %s: %v", tsPath, err) } webCodes := parseTSContentLanguageValues(string(raw)) if len(webCodes) == 0 { t.Fatal("no value: \"xx\" entries parsed from content-languages.ts") } if len(webCodes) != len(ContentLanguages) { t.Fatalf("length mismatch: web=%d go=%d\nweb=%v\ngo=%v", len(webCodes), len(ContentLanguages), webCodes, ContentLanguages) } for i, code := range ContentLanguages { if webCodes[i] != code { t.Fatalf("index %d: web=%q go=%q (keep content-languages.ts in sync with ContentLanguages)", i, webCodes[i], code) } if _, err := ParseLanguage(code, false); err != nil { t.Fatalf("ParseLanguage(%q): %v", code, err) } } } func findRepoRoot(t *testing.T) string { t.Helper() dir, err := os.Getwd() if err != nil { t.Fatal(err) } for i := 0; i < 10; i++ { candidate := filepath.Join(dir, "apps", "web", "src", "lib", "content-languages.ts") if _, err := os.Stat(candidate); err == nil { return dir } parent := filepath.Dir(dir) if parent == dir { break } dir = parent } t.Fatal("monorepo root not found (expected apps/web/src/lib/content-languages.ts)") return "" } func parseTSContentLanguageValues(src string) []string { re := regexp.MustCompile(`value:\s*"([a-z]{2})"`) matches := re.FindAllStringSubmatch(src, -1) out := make([]string, 0, len(matches)) for _, m := range matches { out = append(out, m[1]) } return out }