116 lines
3.0 KiB
Go
116 lines
3.0 KiB
Go
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
|
||
|
|
}
|