github.com/System-Glitch/goyave/v2@v2.10.3-0.20200819142921-51011e75d504/lang/lang_test.go (about) 1 package lang 2 3 import ( 4 "path" 5 "runtime" 6 "testing" 7 8 "github.com/System-Glitch/goyave/v2/config" 9 "github.com/stretchr/testify/suite" 10 ) 11 12 type LangTestSuite struct { 13 suite.Suite 14 } 15 16 func loadTestLang(lang string) { 17 _, filename, _, _ := runtime.Caller(1) 18 load(lang, path.Dir(filename)+"/../resources/lang/en-US") 19 } 20 21 func (suite *LangTestSuite) SetupSuite() { 22 LoadDefault() 23 LoadAllAvailableLanguages() 24 25 if err := config.LoadFrom("../config.test.json"); err != nil { 26 suite.FailNow(err.Error()) 27 } 28 config.Set("app.defaultLanguage", "en-US") 29 } 30 31 func (suite *LangTestSuite) TestLang() { 32 suite.Equal("email address", Get("en-US", "validation.fields.email")) 33 suite.Equal("The :field is required.", Get("en-US", "validation.rules.required")) 34 suite.Equal("Non-validated fields are forbidden.", Get("en-US", "disallow-non-validated-fields")) 35 suite.Equal("These credentials don't match our records.", Get("en-US", "auth.invalid-credentials")) 36 suite.Equal("doesn't.exist", Get("en-US", "doesn't.exist")) 37 suite.Equal("doesn'texist", Get("en-US", "doesn'texist")) 38 suite.Equal("validation.doesn't.exist", Get("en-US", "validation.doesn't.exist")) 39 suite.Equal("validation.rules", Get("en-US", "validation.rules")) 40 suite.Equal("validation.rules.doesn't.exist", Get("en-US", "validation.rules.doesn't.exist")) 41 suite.Equal("validation.fields.doesn't", Get("en-US", "validation.fields.doesn't")) 42 suite.Equal("validation.fields.doesn.t.", Get("en-US", "validation.fields.doesn.t.")) 43 44 languages["en-US"].validation.fields["test"] = attribute{Rules: map[string]string{"required": "test is required"}} 45 suite.Equal("validation.fields.test", Get("en-US", "validation.fields.test")) 46 suite.Equal("test is required", Get("en-US", "validation.fields.test.required")) 47 suite.Equal("validation.fields.test.test", Get("en-US", "validation.fields.test.test")) 48 49 languages["en-US"].validation.fields["test2"] = attribute{} 50 suite.Equal("validation.fields.test2.required", Get("en-US", "validation.fields.test2.required")) 51 52 suite.Equal("validation.fields", Get("en-US", "validation.fields")) 53 suite.Equal("doesn't.exist", Get("not a language", "doesn't.exist")) 54 } 55 56 func (suite *LangTestSuite) TestDetectLanguage() { 57 loadTestLang("fr-FR") 58 loadTestLang("fr-FR") // Merge existing 59 60 suite.Equal("en-US", DetectLanguage("en")) 61 suite.Equal("en-US", DetectLanguage("en-US, fr")) 62 suite.Equal("fr-FR", DetectLanguage("fr-FR")) 63 suite.Equal("fr-FR", DetectLanguage("fr")) 64 suite.Equal("en-US", DetectLanguage("fr, en-US")) 65 suite.Equal("fr-FR", DetectLanguage("fr-FR, en-US")) 66 suite.Equal("fr-FR", DetectLanguage("fr, en-US;q=0.9")) 67 suite.Equal("en-US", DetectLanguage("en, fr-FR;q=0.9")) 68 suite.Equal("en-US", DetectLanguage("*")) 69 suite.Equal("en-US", DetectLanguage("notalang")) 70 71 langs := GetAvailableLanguages() 72 suite.Equal(2, len(langs)) 73 suite.Contains(langs, "en-US") 74 suite.Contains(langs, "fr-FR") 75 } 76 77 func (suite *LangTestSuite) TestLoad() { 78 suite.Panics(func() { 79 Load("notalanguagedir", "notalanguagepath") 80 }) 81 82 Load("en-US", "../resources/lang/en-US") // Is an override 83 suite.Equal("rule override", languages["en-US"].validation.rules["required"]) 84 85 suite.Panics(func() { 86 dest := map[string]string{} 87 readLangFile("../resources/lang/invalid.json", &dest) 88 }) 89 90 // Ensure default lang is not changed 91 suite.Equal("The :field is required.", enUS.validation.rules["required"]) 92 93 } 94 95 func (suite *LangTestSuite) TestMerge() { 96 dst := language{ 97 lines: map[string]string{"line": "line 1"}, 98 validation: validationLines{ 99 rules: map[string]string{}, 100 fields: map[string]attribute{ 101 "test": { 102 Name: "test field", 103 }, 104 }, 105 }, 106 } 107 src := language{ 108 lines: map[string]string{"other": "line 2"}, 109 validation: validationLines{ 110 rules: map[string]string{}, 111 fields: map[string]attribute{ 112 "email": { 113 Name: "email address", 114 Rules: map[string]string{"required": "The email address is required"}, 115 }, 116 "test": { 117 Name: "test field override", 118 Rules: map[string]string{"required": "The test field override is required"}, 119 }, 120 }, 121 }, 122 } 123 124 mergeLang(dst, src) 125 suite.Equal("line 1", dst.lines["line"]) 126 suite.Equal("line 2", dst.lines["other"]) 127 128 suite.Equal("email address", dst.validation.fields["email"].Name) 129 suite.Equal("The email address is required", dst.validation.fields["email"].Rules["required"]) 130 131 suite.Equal("test field override", dst.validation.fields["test"].Name) 132 suite.Equal("The test field override is required", dst.validation.fields["test"].Rules["required"]) 133 } 134 135 func (suite *LangTestSuite) TestPlaceholders() { 136 suite.Equal("Greetings, Kevin", convertEmptyLine("greetings", "Greetings, :username", []string{":username", "Kevin"})) 137 suite.Equal("Greetings, Kevin, today is Monday", convertEmptyLine("greetings", "Greetings, :username, today is :today", []string{":username", "Kevin", ":today", "Monday"})) 138 suite.Equal("Greetings, Kevin, today is :today", convertEmptyLine("greetings", "Greetings, :username, today is :today", []string{":username", "Kevin", ":today"})) 139 } 140 141 func (suite *LangTestSuite) TearDownAllSuite() { 142 languages = map[string]language{} 143 } 144 145 func TestLangTestSuite(t *testing.T) { 146 suite.Run(t, new(LangTestSuite)) 147 }