From 3127546fd782fec38a7e83ce67caddc48b10d9e9 Mon Sep 17 00:00:00 2001 From: Anton Sattarov <sattarov@perx.ru> Date: Thu, 4 Jul 2024 18:23:10 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B8=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BB=20fallback=20=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB?= =?UTF-8?q?=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/schema/localizer/localizer.go | 14 ++- pkg/schema/localizer/localizer_test.go | 151 ++++++++++++++++++++++++- 2 files changed, 159 insertions(+), 6 deletions(-) diff --git a/pkg/schema/localizer/localizer.go b/pkg/schema/localizer/localizer.go index 0d1ddabe..907ade5b 100644 --- a/pkg/schema/localizer/localizer.go +++ b/pkg/schema/localizer/localizer.go @@ -14,16 +14,16 @@ import ( type Localizer struct { schema *schema.Schema localesKV map[string]*locales.Locale - locales []*locales.Locale localeID string + locales []*locales.Locale allowNoPublished bool allowDisabled bool } type Config struct { Schema *schema.Schema - Locales []*locales.Locale LocaleID string + Locales []*locales.Locale AllowNoPublished bool AllowDisabled bool } @@ -147,13 +147,19 @@ func (l *Localizer) Locales() []*locales.Locale { return l.locales } +func (l *Localizer) LocaleID() string { + return l.localeID +} + func (l *Localizer) getTargetAndFallBackLocales() (target, fallback *locales.Locale, err error) { if target, err = l.locale(l.localeID); err != nil { - return nil, nil, errors.New("target locale not found or disabled") + return nil, nil, errors.Wrap(err, "target locale not found or disabled") } if fallback, err = l.locale(target.Fallback); err != nil { - fallback = l.localesKV[locales.DefaultID] + if fallback, err = l.locale(locales.DefaultID); err != nil { + return nil, nil, errors.Wrap(err, "fallback locale not found or disabled") + } } return } diff --git a/pkg/schema/localizer/localizer_test.go b/pkg/schema/localizer/localizer_test.go index 23e6f0fd..21b334d4 100644 --- a/pkg/schema/localizer/localizer_test.go +++ b/pkg/schema/localizer/localizer_test.go @@ -3,6 +3,7 @@ package localizer import ( "testing" + "git.perx.ru/perxis/perxis-go/pkg/locales" "git.perx.ru/perxis/perxis-go/pkg/schema" "git.perx.ru/perxis/perxis-go/pkg/schema/field" "github.com/stretchr/testify/assert" @@ -35,10 +36,10 @@ func TestLocalizer_localize(t *testing.T) { ) tests := []struct { - name string fallback map[string]interface{} target map[string]interface{} want map[string]interface{} + name string wantErr bool }{ { @@ -394,10 +395,10 @@ func TestLocalizer_deLocalize(t *testing.T) { ) tests := []struct { - name string fallback map[string]interface{} target map[string]interface{} want map[string]interface{} + name string wantErr bool }{ { @@ -610,3 +611,149 @@ func TestLocalizer_deLocalize(t *testing.T) { }) } } + +func TestLocalizer_getTargetAndFallBackLocales(t *testing.T) { + + tests := []struct { + localizer *Localizer + wantTarget *locales.Locale + wantFallback *locales.Locale + name string + wantErr bool + }{ + { + name: "Empty", + localizer: &Localizer{}, + wantErr: true, + }, + { + name: "Success", + localizer: &Localizer{ + localeID: "en", + localesKV: map[string]*locales.Locale{ + "en": {ID: "en"}, + "default": {ID: "default"}, + }, + }, + wantTarget: &locales.Locale{ID: "en"}, + wantFallback: &locales.Locale{ID: "default"}, + }, + { + name: "Success fallback", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "en": {ID: "en"}, + "ru": {ID: "ru", Fallback: "en"}, + "default": {ID: "default"}, + }, + }, + wantTarget: &locales.Locale{ID: "ru", Fallback: "en"}, + wantFallback: &locales.Locale{ID: "en"}, + }, + { + name: "Success fallback no default", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "en": {ID: "en"}, + "ru": {ID: "ru", Fallback: "en"}, + }, + }, + wantTarget: &locales.Locale{ID: "ru", Fallback: "en"}, + wantFallback: &locales.Locale{ID: "en"}, + }, + { + name: "Success fallback no fallback", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "ru": {ID: "ru", Fallback: "en"}, + "default": {ID: "default"}, + }, + }, + wantTarget: &locales.Locale{ID: "ru", Fallback: "en"}, + wantFallback: &locales.Locale{ID: "default"}, + }, + { + name: "Fail fallback no fallback", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "ru": {ID: "ru", Fallback: "en"}, + }, + }, + wantErr: true, + }, + { + name: "Fail target nil", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "ru": nil, + }, + }, + wantErr: true, + }, + { + name: "Fail target disabled", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "ru": {ID: "ru", Fallback: "en", Disabled: true}, + "default": {ID: "default"}, + }, + }, + wantErr: true, + }, + { + name: "Success fallback disabled", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "en": {ID: "en", Disabled: true}, + "ru": {ID: "ru", Fallback: "en"}, + "default": {ID: "default"}, + }, + }, + wantTarget: &locales.Locale{ID: "ru", Fallback: "en"}, + wantFallback: &locales.Locale{ID: "default"}, + }, + { + name: "Fail target no publish", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "ru": {ID: "ru", Fallback: "en", NoPublish: true}, + "default": {ID: "default"}, + }, + }, + wantErr: true, + }, + { + name: "Success fallback no publish", + localizer: &Localizer{ + localeID: "ru", + localesKV: map[string]*locales.Locale{ + "en": {ID: "en", NoPublish: true}, + "ru": {ID: "ru", Fallback: "en"}, + "default": {ID: "default"}, + }, + }, + wantTarget: &locales.Locale{ID: "ru", Fallback: "en"}, + wantFallback: &locales.Locale{ID: "en", NoPublish: true}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotTarget, gotFallback, err := tt.localizer.getTargetAndFallBackLocales() + if tt.wantErr { + require.Error(t, err) + return + } + require.NoError(t, err) + assert.Equal(t, tt.wantTarget, gotTarget) + assert.Equal(t, tt.wantFallback, gotFallback) + }) + } +} -- GitLab