Passed
Push — main ( 2a46cd...12059c )
by Igor
01:41
created

test.TestValidator_Validate_WhenRussianIsDefaultLanguage_ExpectViolationTranslated   B

Complexity

Conditions 5

Size

Total Lines 24
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 19
dl 0
loc 24
c 0
b 0
f 0
rs 8.9833
nop 1
1
package test
2
3
import (
4
	"context"
5
	"strconv"
6
	"testing"
7
8
	languagepkg "github.com/muonsoft/language"
9
	"github.com/muonsoft/validation"
10
	"github.com/muonsoft/validation/it"
11
	"github.com/muonsoft/validation/message/translations/russian"
12
	"github.com/muonsoft/validation/validationtest"
13
	"github.com/muonsoft/validation/validator"
14
	"github.com/stretchr/testify/assert"
15
	"golang.org/x/text/language"
16
)
17
18
func TestValidator_Validate_WhenRussianIsDefaultLanguage_ExpectViolationTranslated(t *testing.T) {
19
	v := newValidator(
20
		t,
21
		validation.DefaultLanguage(language.Russian),
22
		validation.Translations(russian.Messages),
23
	)
24
25
	tests := []struct {
26
		maxCount        int
27
		expectedMessage string
28
	}{
29
		{0, "Эта коллекция должна содержать 0 элементов или меньше."},
30
		{1, "Эта коллекция должна содержать 1 элемент или меньше."},
31
		{2, "Эта коллекция должна содержать 2 элемента или меньше."},
32
		{5, "Эта коллекция должна содержать 5 элементов или меньше."},
33
	}
34
	for _, test := range tests {
35
		t.Run("plural form for "+strconv.Itoa(test.maxCount), func(t *testing.T) {
36
			err := v.ValidateCountable(10, it.HasMaxCount(test.maxCount))
37
38
			validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
39
				t.Helper()
40
				return assert.Len(t, violations, 1) &&
41
					assert.Equal(t, test.expectedMessage, violations[0].Message())
42
			})
43
		})
44
	}
45
}
46
47
func TestValidator_Validate_WhenRussianIsPassedViaArgument_ExpectViolationTranslated(t *testing.T) {
48
	v := newValidator(t, validation.Translations(russian.Messages))
49
50
	tests := []struct {
51
		maxCount        int
52
		expectedMessage string
53
	}{
54
		{0, "Эта коллекция должна содержать 0 элементов или меньше."},
55
		{1, "Эта коллекция должна содержать 1 элемент или меньше."},
56
		{2, "Эта коллекция должна содержать 2 элемента или меньше."},
57
		{5, "Эта коллекция должна содержать 5 элементов или меньше."},
58
	}
59
	for _, test := range tests {
60
		t.Run("plural form for "+strconv.Itoa(test.maxCount), func(t *testing.T) {
61
			err := v.Validate(
62
				validation.Language(language.Russian),
63
				validation.Countable(10, it.HasMaxCount(test.maxCount)),
64
			)
65
66
			validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
67
				t.Helper()
68
				return assert.Len(t, violations, 1) &&
69
					assert.Equal(t, test.expectedMessage, violations[0].Message())
70
			})
71
		})
72
	}
73
}
74
75
func TestValidator_Validate_WhenCustomDefaultLanguageAndUndefinedTranslationLanguage_ExpectDefaultLanguageUsed(t *testing.T) {
76
	v := newValidator(
77
		t,
78
		validation.DefaultLanguage(language.Russian),
79
		validation.Translations(russian.Messages),
80
	)
81
82
	err := v.Validate(
83
		validation.Language(language.Afrikaans),
84
		validation.String(stringValue(""), it.IsNotBlank()),
85
	)
86
87
	validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
88
		t.Helper()
89
		return assert.Len(t, violations, 1) &&
90
			assert.Equal(t, "Значение не должно быть пустым.", violations[0].Message())
91
	})
92
}
93
94
func TestValidator_Validate_WhenDefaultLanguageIsNotLoaded_ExpectError(t *testing.T) {
95
	v, err := validation.NewValidator(validation.DefaultLanguage(language.Russian))
96
97
	assert.Nil(t, v)
98
	assert.EqualError(t, err, "default language is not loaded: missing messages for language 'ru'")
99
}
100
101
func TestValidator_Validate_WhenTranslationLanguageInContextArgument_ExpectTranslationLanguageUsed(t *testing.T) {
102
	v := newValidator(t, validation.Translations(russian.Messages))
103
104
	ctx := languagepkg.WithContext(context.Background(), language.Russian)
105
	err := v.Validate(
106
		validation.Context(ctx),
107
		validation.String(stringValue(""), it.IsNotBlank()),
108
	)
109
110
	validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
111
		t.Helper()
112
		return assert.Len(t, violations, 1) &&
113
			assert.Equal(t, "Значение не должно быть пустым.", violations[0].Message())
114
	})
115
}
116
117
func TestValidator_Validate_WhenTranslationLanguageInScopedValidator_ExpectTranslationLanguageUsed(t *testing.T) {
118
	v := newValidator(t, validation.Translations(russian.Messages)).WithLanguage(language.Russian)
119
120
	err := v.ValidateString(stringValue(""), it.IsNotBlank())
121
122
	validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
123
		t.Helper()
124
		return assert.Len(t, violations, 1) &&
125
			assert.Equal(t, "Значение не должно быть пустым.", violations[0].Message())
126
	})
127
}
128
129
func TestValidator_Validate_WhenTranslationLanguageInContextOfScopedValidator_ExpectTranslationLanguageUsed(t *testing.T) {
130
	ctx := languagepkg.WithContext(context.Background(), language.Russian)
131
	v := newValidator(t, validation.Translations(russian.Messages)).WithContext(ctx)
132
133
	err := v.ValidateString(stringValue(""), it.IsNotBlank())
134
135
	validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
136
		t.Helper()
137
		return assert.Len(t, violations, 1) &&
138
			assert.Equal(t, "Значение не должно быть пустым.", violations[0].Message())
139
	})
140
}
141
142
func TestValidator_Validate_WhenTranslationLanguageParsedFromAcceptLanguageHeader_ExpectTranslationLanguageUsed(t *testing.T) {
143
	v := newValidator(t, validation.Translations(russian.Messages))
144
145
	matcher := language.NewMatcher([]language.Tag{language.Russian})
146
	tag, _ := language.MatchStrings(matcher, "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7")
147
	ctx := languagepkg.WithContext(context.Background(), tag)
148
	err := v.Validate(
149
		validation.Context(ctx),
150
		validation.String(stringValue(""), it.IsNotBlank()),
151
	)
152
153
	validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
154
		t.Helper()
155
		return assert.Len(t, violations, 1) &&
156
			assert.Equal(t, "Значение не должно быть пустым.", violations[0].Message())
157
	})
158
}
159
160
func TestValidator_Validate_WhenRecursiveValidation_ExpectViolationTranslated(t *testing.T) {
161
	v := newValidator(
162
		t,
163
		validation.DefaultLanguage(language.Russian),
164
		validation.Translations(russian.Messages),
165
	)
166
	values := []mockValidatableString{{value: ""}}
167
168
	err := v.ValidateIterable(values, it.IsNotBlank())
169
170
	validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
171
		t.Helper()
172
		return assert.Len(t, violations, 1) &&
173
			assert.Equal(t, "Значение не должно быть пустым.", violations[0].Message())
174
	})
175
}
176
177
func TestValidate_WhenTranslationsLoadedAfterInit_ExpectTranslationsWorking(t *testing.T) {
178
	err := validator.SetOptions(
179
		validation.DefaultLanguage(language.Russian),
180
		validation.Translations(russian.Messages),
181
	)
182
	if err != nil {
183
		t.Fatal(err)
184
	}
185
	defer validator.Reset()
186
187
	err = validator.ValidateString(stringValue(""), it.IsNotBlank())
188
189
	validationtest.AssertIsViolationList(t, err, func(t *testing.T, violations validation.ViolationList) bool {
190
		t.Helper()
191
		return assert.Len(t, violations, 1) &&
192
			assert.Equal(t, "Значение не должно быть пустым.", violations[0].Message())
193
	})
194
}
195