i18n_test.go (4013B)
1 package web 2 3 import ( 4 "bufio" 5 "strings" 6 "testing" 7 ) 8 9 func TestParsePO(t *testing.T) { 10 po := ` 11 msgid "Hello " 12 "world" 13 msgstr "Hallo " 14 "Welt" 15 16 #, fuzzy 17 msgid "Ignored" 18 msgstr "Ignoriert" 19 ` 20 got := parsePO(po) 21 if got["Hello world"] != "Hallo Welt" { 22 t.Fatalf("translation = %q", got["Hello world"]) 23 } 24 if _, ok := got["Ignored"]; ok { 25 t.Fatal("fuzzy translation was loaded") 26 } 27 } 28 29 func TestResolveLocale(t *testing.T) { 30 supported := map[string]bool{"en": true, "de": true, "de_CH": true, "zh_Hant": true, "fr": false} 31 for _, test := range []struct{ requested, want string }{ 32 {"de-CH", "de_CH"}, {"DE_ch", "de_CH"}, {"de_AT", "de"}, 33 {"zh-Hant-TW", "zh_Hant"}, {"xx", ""}, {"fr", ""}, 34 {"de__CH", ""}, {"", ""}, {"../../../de", ""}, 35 } { 36 if got := resolveLocale(test.requested, supported); got != test.want { 37 t.Errorf("resolveLocale(%q) = %q, want %q", test.requested, got, test.want) 38 } 39 } 40 } 41 42 func TestBrowserLocaleMatching(t *testing.T) { 43 app, err := New(Options{Shop: "landing", Currency: "KUDOS"}) 44 if err != nil { 45 t.Fatal(err) 46 } 47 for _, test := range []struct{ header, want string }{ 48 {"DE-ch", "de"}, {"fr_CA", "fr"}, 49 {"xx;q=1,de_CH;q=0.8,fr;q=0.5", "de"}, 50 {"de;q=0,fr;q=1", "fr"}, {"xx", "en"}, 51 } { 52 if got := app.bestLanguage(test.header); got != test.want { 53 t.Errorf("bestLanguage(%q) = %q, want %q", test.header, got, test.want) 54 } 55 } 56 } 57 58 func TestFormatNamed(t *testing.T) { 59 if got := formatNamed("Pay {amount} to {receiver}", "amount", "KUDOS:1", "receiver", "GNUnet"); got != "Pay KUDOS:1 to GNUnet" { 60 t.Fatalf("formatted = %q", got) 61 } 62 if got := formatNamed("Pay {amount} to {receiver}", "amount", "{receiver}", "receiver", "GNUnet"); got != "Pay {receiver} to GNUnet" { 63 t.Fatalf("replacement value was formatted again: %q", got) 64 } 65 } 66 67 func TestSamePlaceholders(t *testing.T) { 68 for _, test := range []struct { 69 message string 70 translation string 71 want bool 72 }{ 73 {"Pay {amount} to {receiver}", "Zahle {amount} an {receiver}", true}, 74 {"Pay {amount} to {receiver}", "Zahle {betrag} an {receiver}", false}, 75 {"Use {} twice: {}", "Nutze {} zweimal: {}", true}, 76 {"Use {} twice: {}", "Nutze {} einmal", false}, 77 } { 78 if got := samePlaceholders(test.message, test.translation); got != test.want { 79 t.Errorf("samePlaceholders(%q, %q) = %v, want %v", test.message, test.translation, got, test.want) 80 } 81 } 82 } 83 84 func TestSameHTMLTags(t *testing.T) { 85 if !sameHTMLTags(`Read <a href="{url}"><em>this</em></a>.`, `Lies <a href="{url}"><em>dies</em></a>.`) { 86 t.Fatal("matching HTML tags were rejected") 87 } 88 if sameHTMLTags(`Read <a href="{url}">this</a>.`, `Lies <a href="{url}">dies.`) { 89 t.Fatal("missing closing HTML tag was accepted") 90 } 91 } 92 93 func TestSupportedCatalogsAreComplete(t *testing.T) { 94 catalogs, err := loadCatalogs(supportedLocales) 95 if err != nil { 96 t.Fatal(err) 97 } 98 if len(catalogs) != len(languages) { 99 t.Fatalf("loaded %d catalogs for %d languages", len(catalogs), len(languages)) 100 } 101 pot, err := Assets.ReadFile("assets/translations/messages.pot") 102 if err != nil { 103 t.Fatal(err) 104 } 105 reference := make(map[string]bool) 106 scanner := bufio.NewScanner(strings.NewReader(string(pot))) 107 for scanner.Scan() { 108 line := strings.TrimSpace(scanner.Text()) 109 if !strings.HasPrefix(line, "msgid ") { 110 continue 111 } 112 if message := poString(strings.TrimSpace(strings.TrimPrefix(line, "msgid"))); message != "" { 113 reference[message] = true 114 } 115 } 116 if err := scanner.Err(); err != nil { 117 t.Fatal(err) 118 } 119 for _, language := range languages { 120 if language.Code == "en" { 121 continue 122 } 123 catalog := catalogs[language.Code] 124 if len(catalog) != len(reference) { 125 t.Errorf("catalog %s contains %d usable translations, want %d", language.Code, len(catalog), len(reference)) 126 } 127 for message := range reference { 128 if catalog[message] == "" { 129 t.Errorf("catalog %s does not translate %q", language.Code, message) 130 } 131 } 132 } 133 if supportedLocales["ar"] || catalogs["ar"] != nil { 134 t.Fatal("unsupported Arabic catalog was loaded") 135 } 136 }