fix(langpack): sync WebK catalog alias support
This commit is contained in:
parent
9ef746d45e
commit
a785ae7491
7 changed files with 313 additions and 8 deletions
|
|
@ -2,11 +2,13 @@ package langpack
|
|||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"telesrv/internal/domain"
|
||||
"telesrv/internal/store/memory"
|
||||
)
|
||||
|
||||
|
|
@ -205,8 +207,8 @@ func TestSeedDirectoryReconcilesManifest(t *testing.T) {
|
|||
t.Fatalf("reconcile removed file = %d, %v", seeded, err)
|
||||
}
|
||||
languages, err = service.ListLanguages(ctx, "tdesktop")
|
||||
if err != nil || len(languages) != 0 {
|
||||
t.Fatalf("languages after removal = %+v, err %v", languages, err)
|
||||
if !errors.Is(err, domain.ErrLangPackInvalid) || len(languages) != 0 {
|
||||
t.Fatalf("languages after removal = %+v, err %v, want ErrLangPackInvalid", languages, err)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -70,6 +70,9 @@ func (s *Service) GetDifference(ctx context.Context, langPack, langCode string,
|
|||
if s == nil || s.packs == nil {
|
||||
return domain.LangPack{LangPack: packName, LangCode: code, FromVersion: fromVersion}, nil
|
||||
}
|
||||
if err := s.validateLanguage(ctx, packName, code); err != nil {
|
||||
return domain.LangPack{}, err
|
||||
}
|
||||
var (
|
||||
pack domain.LangPack
|
||||
err error
|
||||
|
|
@ -96,6 +99,9 @@ func (s *Service) GetStrings(ctx context.Context, langPack, langCode string, key
|
|||
if s == nil || s.packs == nil {
|
||||
return domain.LangPack{LangPack: packName, LangCode: code}, nil
|
||||
}
|
||||
if err := s.validateLanguage(ctx, packName, code); err != nil {
|
||||
return domain.LangPack{}, err
|
||||
}
|
||||
pack, err := s.effectivePack(ctx, packName, code)
|
||||
if err != nil {
|
||||
return domain.LangPack{}, err
|
||||
|
|
@ -123,7 +129,14 @@ func (s *Service) ListLanguages(ctx context.Context, langPack string) ([]domain.
|
|||
if s == nil || s.packs == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return s.cachedLanguages(ctx, packName)
|
||||
languages, err := s.cachedLanguages(ctx, packName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(languages) == 0 {
|
||||
return nil, domain.ErrLangPackInvalid
|
||||
}
|
||||
return languages, nil
|
||||
}
|
||||
|
||||
func normalizePack(langPack string) string {
|
||||
|
|
@ -131,6 +144,9 @@ func normalizePack(langPack string) string {
|
|||
if pack == "" {
|
||||
return "tdesktop"
|
||||
}
|
||||
if pack == "web" {
|
||||
return "webk"
|
||||
}
|
||||
return pack
|
||||
}
|
||||
|
||||
|
|
@ -262,6 +278,22 @@ func (s *Service) cachedLanguages(ctx context.Context, langPack string) ([]domai
|
|||
}
|
||||
}
|
||||
|
||||
func (s *Service) validateLanguage(ctx context.Context, langPack, langCode string) error {
|
||||
languages, err := s.cachedLanguages(ctx, langPack)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(languages) == 0 {
|
||||
return domain.ErrLangPackInvalid
|
||||
}
|
||||
for _, language := range languages {
|
||||
if normalizeCode(language.LangCode) == langCode {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return domain.ErrLangCodeNotSupported
|
||||
}
|
||||
|
||||
func (s *Service) brandPack(pack domain.LangPack) domain.LangPack {
|
||||
for i := range pack.Strings {
|
||||
item := &pack.Strings[i]
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package langpack
|
|||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
|
@ -11,6 +12,106 @@ import (
|
|||
"telesrv/internal/store/memory"
|
||||
)
|
||||
|
||||
func TestServiceNormalizesWebAliasAndRejectsUnknownCatalogEntries(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
packs := memory.NewLangPackStore()
|
||||
svc := NewService(packs)
|
||||
for _, pack := range []domain.LangPack{
|
||||
{
|
||||
LangPack: "webk",
|
||||
LangCode: "en",
|
||||
Version: 7,
|
||||
Strings: []domain.LangPackString{{Key: "lng_settings_language", Value: "Language"}},
|
||||
},
|
||||
{
|
||||
LangPack: "webk",
|
||||
LangCode: "zh-hans",
|
||||
Version: 9,
|
||||
Strings: []domain.LangPackString{{Key: "lng_settings_language", Value: "语言"}},
|
||||
},
|
||||
} {
|
||||
if err := packs.UpsertPack(ctx, pack); err != nil {
|
||||
t.Fatalf("seed %s/%s: %v", pack.LangPack, pack.LangCode, err)
|
||||
}
|
||||
}
|
||||
|
||||
languages, err := svc.ListLanguages(ctx, " WEB ")
|
||||
if err != nil {
|
||||
t.Fatalf("list web languages: %v", err)
|
||||
}
|
||||
if len(languages) != 2 || findLanguage(languages, "zh-hans") == nil {
|
||||
t.Fatalf("web languages = %+v, want canonical webk catalog", languages)
|
||||
}
|
||||
|
||||
full, err := svc.GetLangPack(ctx, "web", "ZH_HANS")
|
||||
if err != nil {
|
||||
t.Fatalf("get web langpack: %v", err)
|
||||
}
|
||||
if full.LangPack != "webk" || full.LangCode != "zh-hans" || full.Version != 9 || stringValue(full.Strings, "lng_settings_language") != "语言" {
|
||||
t.Fatalf("web langpack = %+v, want canonical webk/zh-hans", full)
|
||||
}
|
||||
|
||||
diff, err := svc.GetDifference(ctx, "web", "zh-hans", 1)
|
||||
if err != nil {
|
||||
t.Fatalf("get web difference: %v", err)
|
||||
}
|
||||
if diff.LangPack != "webk" || diff.FromVersion != 1 || len(diff.Strings) != 1 {
|
||||
t.Fatalf("web difference = %+v, want canonical webk delta", diff)
|
||||
}
|
||||
|
||||
selected, err := svc.GetStrings(ctx, "web", "zh-hans", []string{"lng_settings_language"})
|
||||
if err != nil {
|
||||
t.Fatalf("get web strings: %v", err)
|
||||
}
|
||||
if selected.LangPack != "webk" || stringValue(selected.Strings, "lng_settings_language") != "语言" {
|
||||
t.Fatalf("web strings = %+v, want selected webk string", selected)
|
||||
}
|
||||
|
||||
invalidPackCalls := map[string]func() error{
|
||||
"list": func() error {
|
||||
_, err := svc.ListLanguages(ctx, "web-invalid")
|
||||
return err
|
||||
},
|
||||
"full": func() error {
|
||||
_, err := svc.GetLangPack(ctx, "web-invalid", "en")
|
||||
return err
|
||||
},
|
||||
"difference": func() error {
|
||||
_, err := svc.GetDifference(ctx, "web-invalid", "en", 1)
|
||||
return err
|
||||
},
|
||||
"strings": func() error {
|
||||
_, err := svc.GetStrings(ctx, "web-invalid", "en", []string{"key"})
|
||||
return err
|
||||
},
|
||||
}
|
||||
for name, call := range invalidPackCalls {
|
||||
if err := call(); !errors.Is(err, domain.ErrLangPackInvalid) {
|
||||
t.Fatalf("%s invalid pack error = %v, want ErrLangPackInvalid", name, err)
|
||||
}
|
||||
}
|
||||
|
||||
unsupportedCodeCalls := map[string]func() error{
|
||||
"full": func() error {
|
||||
_, err := svc.GetLangPack(ctx, "web", "fr")
|
||||
return err
|
||||
},
|
||||
"difference": func() error {
|
||||
_, err := svc.GetDifference(ctx, "web", "fr", 1)
|
||||
return err
|
||||
},
|
||||
"strings": func() error {
|
||||
_, err := svc.GetStrings(ctx, "web", "fr", []string{"key"})
|
||||
return err
|
||||
},
|
||||
}
|
||||
for name, call := range unsupportedCodeCalls {
|
||||
if err := call(); !errors.Is(err, domain.ErrLangCodeNotSupported) {
|
||||
t.Fatalf("%s unsupported code error = %v, want ErrLangCodeNotSupported", name, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestServiceNormalizesWebARawLangCode(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
packs := memory.NewLangPackStore()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue