taler-merchant-demos

Python-based Frontends for the Demonstration Web site
Log | Files | Refs | README | LICENSE

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 }