diff --git a/pkg/schema/localizer/localizer.go b/pkg/schema/localizer/localizer.go index 0d1ddabec5bc5be09fb0cbd0ff9c4e83272b4baa..907ade5b5e603e1132d733cbb91604b45f87fc20 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 23e6f0fdad2440f3102f481ce410bb29a5acc190..21b334d488dbbc513163545806c414ce963e8ea9 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) + }) + } +}