diff --git a/init.go b/init.go index c2a1af9..ccabb70 100644 --- a/init.go +++ b/init.go @@ -60,22 +60,26 @@ func NewConfig() (ConfigSection, error) { */ func NewI18n(mainlang string) (i18n gt.Strings, err error) { data, err := os.ReadFile(ZAS_I18N_FILE) - i18n = make(gt.Strings) if err != nil { if os.IsNotExist(err) { - err = nil - return + return make(gt.Strings), nil } - i18n = nil - return + return nil, err + } + i18n = make(gt.Strings) + if err = yaml.Unmarshal(data, &i18n); err != nil { + return nil, err } - err = yaml.Unmarshal(data, &i18n) for k, v := range i18n { + if v == nil { + v = make(map[string]string) + i18n[k] = v + } if _, ok := v[mainlang]; !ok { v[mainlang] = k } } - return + return i18n, nil } /* diff --git a/newi18n_test.go b/newi18n_test.go new file mode 100644 index 0000000..539901d --- /dev/null +++ b/newi18n_test.go @@ -0,0 +1,52 @@ +package zas + +import ( + "os" + "testing" +) + +// B4: NewI18n must not panic on an entry with no translations, and must +// check the yaml.Unmarshal error before the backfill loop runs. + +func TestNewI18nNoFile(t *testing.T) { + t.Chdir(t.TempDir()) + i18n, err := NewI18n("en") + if err != nil { + t.Fatalf("NewI18n() error = %v, want nil", err) + } + if len(i18n) != 0 { + t.Fatalf("NewI18n() = %v, want empty", i18n) + } +} + +func TestNewI18nNilMapEntry(t *testing.T) { + dir := t.TempDir() + t.Chdir(dir) + if err := os.MkdirAll(ZAS_DIR, 0o755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(ZAS_I18N_FILE, []byte("Some key:\n"), 0o644); err != nil { + t.Fatal(err) + } + i18n, err := NewI18n("en") + if err != nil { + t.Fatalf("NewI18n() error = %v, want nil", err) + } + if got := i18n["Some key"]["en"]; got != "Some key" { + t.Fatalf("i18n[%q][%q] = %q, want %q", "Some key", "en", got, "Some key") + } +} + +func TestNewI18nMalformedYAML(t *testing.T) { + dir := t.TempDir() + t.Chdir(dir) + if err := os.MkdirAll(ZAS_DIR, 0o755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(ZAS_I18N_FILE, []byte("not: valid: yaml: [\n"), 0o644); err != nil { + t.Fatal(err) + } + if _, err := NewI18n("en"); err == nil { + t.Fatal("NewI18n() with malformed YAML: want error, got nil") + } +}