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  }