Skip to content
Snippets Groups Projects
Commit 779fefcf authored by Pavel Antonov's avatar Pavel Antonov :asterisk:
Browse files

Merge branch 'feature/PRXS-2653-LocalizerFix' into 'master'

Исправлена ошибка при которой не проиходил fallback на локаль по умолчанию

See merge request perxis/perxis-go!266
parents 4244b43b 3127546f
No related branches found
No related tags found
No related merge requests found
...@@ -14,16 +14,16 @@ import ( ...@@ -14,16 +14,16 @@ import (
type Localizer struct { type Localizer struct {
schema *schema.Schema schema *schema.Schema
localesKV map[string]*locales.Locale localesKV map[string]*locales.Locale
locales []*locales.Locale
localeID string localeID string
locales []*locales.Locale
allowNoPublished bool allowNoPublished bool
allowDisabled bool allowDisabled bool
} }
type Config struct { type Config struct {
Schema *schema.Schema Schema *schema.Schema
Locales []*locales.Locale
LocaleID string LocaleID string
Locales []*locales.Locale
AllowNoPublished bool AllowNoPublished bool
AllowDisabled bool AllowDisabled bool
} }
...@@ -147,13 +147,19 @@ func (l *Localizer) Locales() []*locales.Locale { ...@@ -147,13 +147,19 @@ func (l *Localizer) Locales() []*locales.Locale {
return l.locales return l.locales
} }
func (l *Localizer) LocaleID() string {
return l.localeID
}
func (l *Localizer) getTargetAndFallBackLocales() (target, fallback *locales.Locale, err error) { func (l *Localizer) getTargetAndFallBackLocales() (target, fallback *locales.Locale, err error) {
if target, err = l.locale(l.localeID); err != nil { 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 { 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 return
} }
......
...@@ -3,6 +3,7 @@ package localizer ...@@ -3,6 +3,7 @@ package localizer
import ( import (
"testing" "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"
"git.perx.ru/perxis/perxis-go/pkg/schema/field" "git.perx.ru/perxis/perxis-go/pkg/schema/field"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
...@@ -35,10 +36,10 @@ func TestLocalizer_localize(t *testing.T) { ...@@ -35,10 +36,10 @@ func TestLocalizer_localize(t *testing.T) {
) )
tests := []struct { tests := []struct {
name string
fallback map[string]interface{} fallback map[string]interface{}
target map[string]interface{} target map[string]interface{}
want map[string]interface{} want map[string]interface{}
name string
wantErr bool wantErr bool
}{ }{
{ {
...@@ -394,10 +395,10 @@ func TestLocalizer_deLocalize(t *testing.T) { ...@@ -394,10 +395,10 @@ func TestLocalizer_deLocalize(t *testing.T) {
) )
tests := []struct { tests := []struct {
name string
fallback map[string]interface{} fallback map[string]interface{}
target map[string]interface{} target map[string]interface{}
want map[string]interface{} want map[string]interface{}
name string
wantErr bool wantErr bool
}{ }{
{ {
...@@ -610,3 +611,149 @@ func TestLocalizer_deLocalize(t *testing.T) { ...@@ -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)
})
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment