Passed
Push — master ( 0c92a9...ddca1f )
by Serhii
01:39
created

timeago.TestTakeWithSeconds   B

Complexity

Conditions 5

Size

Total Lines 43
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 37
nop 1
dl 0
loc 43
rs 8.5253
c 0
b 0
f 0
1
package timeago
2
3
import (
4
	"testing"
5
	"time"
6
)
7
8
// test helper
9
func smallSubTime(d time.Duration) string {
10
	return time.Now().Add(d).Format("2006-01-02 15:04:05")
11
}
12
13
// test helper
14
func bigSubTime(years int, months int, days int) string {
15
	return time.Now().AddDate(-years, -months, -days).Format("2006-01-02 15:04:05")
16
}
17
18
func TestGetOption(test *testing.T) {
19
	cases := []struct {
20
		name            string
21
		date            string
22
		optionMustBe    string
23
		hasOptionMustBe bool
24
	}{
25
		{"case has online option", "2017-02-01 00:00:00|online", "online", true},
26
		{"case has random option", "2017-02-01 00:00:00|random", "random", true},
27
		{"case has online option", "2017-02-01 00:00:00|korotchaeva", "korotchaeva", true},
28
		{"case don't have option", "2017-02-01 00:00:00", "", false},
29
	}
30
31
	for _, tc := range cases {
32
		test.Run(tc.name, func(t *testing.T) {
33
			option, hasOption := getOption(&tc.date)
34
35
			if hasOption != tc.hasOptionMustBe || option != tc.optionMustBe {
36
				t.Errorf("Result of getOption func must return `online` string and `true`, but `%s` string and `%v` returned returned", tc.optionMustBe, tc.hasOptionMustBe)
37
			}
38
		})
39
	}
40
}
41
42
func TestGetTimeTranslations(t *testing.T) {
43
	t.Parallel()
44
45
	t.Run("returns 7 items", func(test *testing.T) {
46
		if res := len(getTimeTranslations()); res != 7 {
47
			test.Errorf("Must return 7 items but got %d", res)
48
		}
49
	})
50
51
	t.Run("every slice has 3 items", func(test *testing.T) {
52
		for _, slice := range getTimeTranslations() {
53
			if res := len(slice); res != 3 {
54
				test.Errorf("Slice Must return 3 items but got %d", res)
55
			}
56
		}
57
	})
58
}
59
60
func TestGetWords(t *testing.T) {
61
	cases := []struct {
62
		timeKind string
63
		num      int
64
		result   string
65
		lang     string
66
	}{
67
		// english
68
		{"days", 11, "11 days ago", "en"},
69
		{"days", 21, "21 days ago", "en"},
70
		{"seconds", 30, "30 seconds ago", "en"},
71
		{"seconds", 31, "31 seconds ago", "en"},
72
		{"hours", 10, "10 hours ago", "en"},
73
		{"years", 2, "2 years ago", "en"},
74
		// russian
75
		{"hours", 5, "5 часов назад", "ru"},
76
		{"days", 11, "11 дней назад", "ru"},
77
		{"years", 21, "21 год назад", "ru"},
78
		{"minutes", 59, "59 минут назад", "ru"},
79
	}
80
81
	for _, tc := range cases {
82
		t.Run(tc.result, func(test *testing.T) {
83
			Set("language", tc.lang)
84
			Set("location", "Europe/Kiev")
85
86
			if res := getWords(tc.timeKind, tc.num); res != tc.result {
87
				test.Errorf("Result must be `%s` but got `%s` instead", tc.result, res)
88
			}
89
		})
90
	}
91
}
92
93
func TestGetLastNumber(t *testing.T) {
94
	cases := []struct {
95
		number int
96
		result int
97
		name   string
98
	}{
99
		{0, 0, "must return 0"},
100
		{1, 1, "must return 1"},
101
		{9, 9, "must return 9"},
102
		{20, 0, "must return 0"},
103
		{253, 3, "must return 3"},
104
		{23423252, 2, "must return 2"},
105
		{223424342325, 5, "must return 5"},
106
		{23423521562348, 8, "must return 8"},
107
	}
108
109
	for _, tc := range cases {
110
		t.Run(tc.name, func(test *testing.T) {
111
			if res := getLastNumber(tc.number); res != tc.result {
112
				test.Errorf("Result must be %d, but got %d instead", tc.result, res)
113
			}
114
		})
115
	}
116
}
117
118
func TestTake(t *testing.T) {
119
	cases := []struct {
120
		date   string
121
		result string
122
		lang   string
123
	}{
124
		// english
125
		{smallSubTime(-60 * time.Second), "1 minute ago", "en"},
126
		{smallSubTime(-1 * time.Minute), "1 minute ago", "en"},
127
		{smallSubTime(-2 * time.Minute), "2 minutes ago", "en"},
128
		{smallSubTime(-9 * time.Minute), "9 minutes ago", "en"},
129
		{smallSubTime(-10 * time.Minute), "10 minutes ago", "en"},
130
		{smallSubTime(-11 * time.Minute), "11 minutes ago", "en"},
131
		{smallSubTime(-20 * time.Minute), "20 minutes ago", "en"},
132
		{smallSubTime(-21 * time.Minute), "21 minutes ago", "en"},
133
		{smallSubTime(-22 * time.Minute), "22 minutes ago", "en"},
134
		{smallSubTime(-30 * time.Minute), "30 minutes ago", "en"},
135
		{smallSubTime(-31 * time.Minute), "31 minutes ago", "en"},
136
		{smallSubTime(-59 * time.Minute), "59 minutes ago", "en"},
137
		{smallSubTime(-60 * time.Minute), "1 hour ago", "en"},
138
		{smallSubTime(-1 * time.Hour), "1 hour ago", "en"},
139
		{smallSubTime(-2 * time.Hour), "2 hours ago", "en"},
140
		{smallSubTime(-9 * time.Hour), "9 hours ago", "en"},
141
		{smallSubTime(-10 * time.Hour), "10 hours ago", "en"},
142
		{smallSubTime(-11 * time.Hour), "11 hours ago", "en"},
143
		{smallSubTime(-20 * time.Hour), "20 hours ago", "en"},
144
		{smallSubTime(-21 * time.Hour), "21 hours ago", "en"},
145
		{smallSubTime(-23 * time.Hour), "23 hours ago", "en"},
146
		{smallSubTime(-24 * time.Hour), "1 day ago", "en"},
147
		{smallSubTime(-30 * time.Hour), "1 day ago", "en"},
148
		{smallSubTime((-24 * 2) * time.Hour), "2 days ago", "en"},
149
		{smallSubTime((-24 * 6) * time.Hour), "6 days ago", "en"},
150
		{smallSubTime((-24 * 7) * time.Hour), "1 week ago", "en"},
151
		{smallSubTime((-24 * 14) * time.Hour), "2 weeks ago", "en"},
152
		{smallSubTime((-24 * 21) * time.Hour), "3 weeks ago", "en"},
153
		{bigSubTime(0, 1, 1), "1 month ago", "en"},
154
		{bigSubTime(0, 2, 1), "2 months ago", "en"},
155
		{bigSubTime(0, 9, 1), "9 months ago", "en"},
156
		{bigSubTime(0, 11, 1), "11 months ago", "en"},
157
		{bigSubTime(0, 12, 1), "1 year ago", "en"},
158
		{bigSubTime(1, 0, 1), "1 year ago", "en"},
159
		{bigSubTime(2, 0, 1), "2 years ago", "en"},
160
		{bigSubTime(21, 0, 1), "21 years ago", "en"},
161
		{bigSubTime(31, 0, 1), "31 years ago", "en"},
162
		{bigSubTime(100, 0, 1), "100 years ago", "en"},
163
		// russian
164
		{smallSubTime(-60 * time.Second), "1 минута назад", "ru"},
165
		{smallSubTime(-1 * time.Minute), "1 минута назад", "ru"},
166
		{smallSubTime(-2 * time.Minute), "2 минуты назад", "ru"},
167
		{smallSubTime(-9 * time.Minute), "9 минут назад", "ru"},
168
		{smallSubTime(-10 * time.Minute), "10 минут назад", "ru"},
169
		{smallSubTime(-11 * time.Minute), "11 минут назад", "ru"},
170
		{smallSubTime(-20 * time.Minute), "20 минут назад", "ru"},
171
		{smallSubTime(-21 * time.Minute), "21 минута назад", "ru"},
172
		{smallSubTime(-22 * time.Minute), "22 минуты назад", "ru"},
173
		{smallSubTime(-30 * time.Minute), "30 минут назад", "ru"},
174
		{smallSubTime(-31 * time.Minute), "31 минута назад", "ru"},
175
		{smallSubTime(-59 * time.Minute), "59 минут назад", "ru"},
176
		{smallSubTime(-60 * time.Minute), "1 час назад", "ru"},
177
		{smallSubTime(-1 * time.Hour), "1 час назад", "ru"},
178
		{smallSubTime(-2 * time.Hour), "2 часа назад", "ru"},
179
		{smallSubTime(-9 * time.Hour), "9 часов назад", "ru"},
180
		{smallSubTime(-10 * time.Hour), "10 часов назад", "ru"},
181
		{smallSubTime(-11 * time.Hour), "11 часов назад", "ru"},
182
		{smallSubTime(-20 * time.Hour), "20 часов назад", "ru"},
183
		{smallSubTime(-21 * time.Hour), "21 час назад", "ru"},
184
		{smallSubTime(-23 * time.Hour), "23 часа назад", "ru"},
185
		{smallSubTime(-24 * time.Hour), "1 день назад", "ru"},
186
		{smallSubTime(-30 * time.Hour), "1 день назад", "ru"},
187
		{smallSubTime((-24 * 2) * time.Hour), "2 дня назад", "ru"},
188
		{smallSubTime((-24 * 6) * time.Hour), "6 дней назад", "ru"},
189
		{smallSubTime((-24 * 7) * time.Hour), "1 неделя назад", "ru"},
190
		{smallSubTime((-24 * 14) * time.Hour), "2 недели назад", "ru"},
191
		{smallSubTime((-24 * 21) * time.Hour), "3 недели назад", "ru"},
192
		{bigSubTime(0, 1, 1), "1 месяц назад", "ru"},
193
		{bigSubTime(0, 2, 1), "2 месяца назад", "ru"},
194
		{bigSubTime(0, 9, 1), "9 месяцев назад", "ru"},
195
		{bigSubTime(0, 11, 1), "11 месяцев назад", "ru"},
196
		{bigSubTime(0, 12, 1), "1 год назад", "ru"},
197
		{bigSubTime(1, 0, 1), "1 год назад", "ru"},
198
		{bigSubTime(2, 0, 1), "2 года назад", "ru"},
199
		{bigSubTime(5, 0, 1), "5 лет назад", "ru"},
200
		{bigSubTime(6, 0, 1), "6 лет назад", "ru"},
201
		{bigSubTime(7, 0, 1), "7 лет назад", "ru"},
202
		{bigSubTime(21, 0, 1), "21 год назад", "ru"},
203
		{bigSubTime(31, 0, 1), "31 год назад", "ru"},
204
		{bigSubTime(100, 0, 1), "100 лет назад", "ru"},
205
	}
206
207
	for _, tc := range cases {
208
		t.Run("result for "+tc.date, func(test *testing.T) {
209
			Set("language", tc.lang)
210
			Set("location", "Europe/Kiev")
211
212
			if res := Take(tc.date); res != tc.result {
213
				test.Errorf("Result must be %s, but got %s instead", tc.result, res)
214
			}
215
		})
216
	}
217
}
218
219
func TestTake_with_online_flag(t *testing.T) {
220
	cases := []struct {
221
		date   string
222
		result string
223
		lang   string
224
	}{
225
		// english
226
		{smallSubTime(time.Second * 2), "Online", "en"},
227
		{smallSubTime(time.Second), "Online", "en"},
228
		{smallSubTime(-1 * time.Second), "Online", "en"},
229
		{smallSubTime(-2 * time.Second), "Online", "en"},
230
		{smallSubTime(-9 * time.Second), "Online", "en"},
231
		{smallSubTime(-10 * time.Second), "Online", "en"},
232
		{smallSubTime(-11 * time.Second), "Online", "en"},
233
		{smallSubTime(-20 * time.Second), "Online", "en"},
234
		{smallSubTime(-21 * time.Second), "Online", "en"},
235
		{smallSubTime(-22 * time.Second), "Online", "en"},
236
		{smallSubTime(-30 * time.Second), "Online", "en"},
237
		{smallSubTime(-31 * time.Second), "Online", "en"},
238
		{smallSubTime(-59 * time.Second), "Online", "en"},
239
		{smallSubTime(-60 * time.Second), "1 minute ago", "en"},
240
		{smallSubTime(-1 * time.Minute), "1 minute ago", "en"},
241
		{smallSubTime(-2 * time.Minute), "2 minutes ago", "en"},
242
		{smallSubTime(-9 * time.Minute), "9 minutes ago", "en"},
243
		{smallSubTime(-10 * time.Minute), "10 minutes ago", "en"},
244
		{smallSubTime(-11 * time.Minute), "11 minutes ago", "en"},
245
		{smallSubTime(-20 * time.Minute), "20 minutes ago", "en"},
246
		{smallSubTime(-21 * time.Minute), "21 minutes ago", "en"},
247
		{smallSubTime(-22 * time.Minute), "22 minutes ago", "en"},
248
		{smallSubTime(-30 * time.Minute), "30 minutes ago", "en"},
249
		{smallSubTime(-31 * time.Minute), "31 minutes ago", "en"},
250
		{smallSubTime(-59 * time.Minute), "59 minutes ago", "en"},
251
		{smallSubTime(-60 * time.Minute), "1 hour ago", "en"},
252
		{smallSubTime(-1 * time.Hour), "1 hour ago", "en"},
253
		{smallSubTime(-2 * time.Hour), "2 hours ago", "en"},
254
		{smallSubTime(-9 * time.Hour), "9 hours ago", "en"},
255
		{smallSubTime(-10 * time.Hour), "10 hours ago", "en"},
256
		{smallSubTime(-11 * time.Hour), "11 hours ago", "en"},
257
		{smallSubTime(-20 * time.Hour), "20 hours ago", "en"},
258
		{smallSubTime(-21 * time.Hour), "21 hours ago", "en"},
259
		{smallSubTime(-23 * time.Hour), "23 hours ago", "en"},
260
		{smallSubTime(-24 * time.Hour), "1 day ago", "en"},
261
		{smallSubTime(-30 * time.Hour), "1 day ago", "en"},
262
		{smallSubTime((-24 * 2) * time.Hour), "2 days ago", "en"},
263
		{smallSubTime((-24 * 6) * time.Hour), "6 days ago", "en"},
264
		{smallSubTime((-24 * 7) * time.Hour), "1 week ago", "en"},
265
		{smallSubTime((-24 * 14) * time.Hour), "2 weeks ago", "en"},
266
		{smallSubTime((-24 * 21) * time.Hour), "3 weeks ago", "en"},
267
		{bigSubTime(0, 1, 1), "1 month ago", "en"},
268
		{bigSubTime(0, 2, 1), "2 months ago", "en"},
269
		{bigSubTime(0, 9, 1), "9 months ago", "en"},
270
		{bigSubTime(0, 11, 1), "11 months ago", "en"},
271
		{bigSubTime(0, 12, 1), "1 year ago", "en"},
272
		{bigSubTime(1, 0, 1), "1 year ago", "en"},
273
		{bigSubTime(2, 0, 1), "2 years ago", "en"},
274
		{bigSubTime(21, 0, 1), "21 years ago", "en"},
275
		{bigSubTime(31, 0, 1), "31 years ago", "en"},
276
		{bigSubTime(100, 0, 1), "100 years ago", "en"},
277
		// russian
278
		{smallSubTime(time.Second * 2), "В сети", "ru"},
279
		{smallSubTime(time.Second), "В сети", "ru"},
280
		{smallSubTime(-1 * time.Second), "В сети", "ru"},
281
		{smallSubTime(-2 * time.Second), "В сети", "ru"},
282
		{smallSubTime(-9 * time.Second), "В сети", "ru"},
283
		{smallSubTime(-10 * time.Second), "В сети", "ru"},
284
		{smallSubTime(-11 * time.Second), "В сети", "ru"},
285
		{smallSubTime(-20 * time.Second), "В сети", "ru"},
286
		{smallSubTime(-21 * time.Second), "В сети", "ru"},
287
		{smallSubTime(-22 * time.Second), "В сети", "ru"},
288
		{smallSubTime(-30 * time.Second), "В сети", "ru"},
289
		{smallSubTime(-31 * time.Second), "В сети", "ru"},
290
		{smallSubTime(-59 * time.Second), "В сети", "ru"},
291
		{smallSubTime(-60 * time.Second), "1 минута назад", "ru"},
292
		{smallSubTime(-1 * time.Minute), "1 минута назад", "ru"},
293
		{smallSubTime(-2 * time.Minute), "2 минуты назад", "ru"},
294
		{smallSubTime(-9 * time.Minute), "9 минут назад", "ru"},
295
		{smallSubTime(-10 * time.Minute), "10 минут назад", "ru"},
296
		{smallSubTime(-11 * time.Minute), "11 минут назад", "ru"},
297
		{smallSubTime(-20 * time.Minute), "20 минут назад", "ru"},
298
		{smallSubTime(-21 * time.Minute), "21 минута назад", "ru"},
299
		{smallSubTime(-22 * time.Minute), "22 минуты назад", "ru"},
300
		{smallSubTime(-30 * time.Minute), "30 минут назад", "ru"},
301
		{smallSubTime(-31 * time.Minute), "31 минута назад", "ru"},
302
		{smallSubTime(-59 * time.Minute), "59 минут назад", "ru"},
303
		{smallSubTime(-60 * time.Minute), "1 час назад", "ru"},
304
		{smallSubTime(-1 * time.Hour), "1 час назад", "ru"},
305
		{smallSubTime(-2 * time.Hour), "2 часа назад", "ru"},
306
		{smallSubTime(-9 * time.Hour), "9 часов назад", "ru"},
307
		{smallSubTime(-10 * time.Hour), "10 часов назад", "ru"},
308
		{smallSubTime(-11 * time.Hour), "11 часов назад", "ru"},
309
		{smallSubTime(-20 * time.Hour), "20 часов назад", "ru"},
310
		{smallSubTime(-21 * time.Hour), "21 час назад", "ru"},
311
		{smallSubTime(-23 * time.Hour), "23 часа назад", "ru"},
312
		{smallSubTime(-24 * time.Hour), "1 день назад", "ru"},
313
		{smallSubTime(-30 * time.Hour), "1 день назад", "ru"},
314
		{smallSubTime((-24 * 2) * time.Hour), "2 дня назад", "ru"},
315
		{smallSubTime((-24 * 6) * time.Hour), "6 дней назад", "ru"},
316
		{smallSubTime((-24 * 7) * time.Hour), "1 неделя назад", "ru"},
317
		{smallSubTime((-24 * 14) * time.Hour), "2 недели назад", "ru"},
318
		{smallSubTime((-24 * 21) * time.Hour), "3 недели назад", "ru"},
319
		{bigSubTime(0, 1, 1), "1 месяц назад", "ru"},
320
		{bigSubTime(0, 2, 1), "2 месяца назад", "ru"},
321
		{bigSubTime(0, 9, 1), "9 месяцев назад", "ru"},
322
		{bigSubTime(0, 11, 1), "11 месяцев назад", "ru"},
323
		{bigSubTime(0, 12, 1), "1 год назад", "ru"},
324
		{bigSubTime(1, 0, 1), "1 год назад", "ru"},
325
		{bigSubTime(2, 0, 1), "2 года назад", "ru"},
326
		{bigSubTime(5, 0, 1), "5 лет назад", "ru"},
327
		{bigSubTime(6, 0, 1), "6 лет назад", "ru"},
328
		{bigSubTime(7, 0, 1), "7 лет назад", "ru"},
329
		{bigSubTime(21, 0, 1), "21 год назад", "ru"},
330
		{bigSubTime(31, 0, 1), "31 год назад", "ru"},
331
		{bigSubTime(100, 0, 1), "100 лет назад", "ru"},
332
	}
333
334
	for _, tc := range cases {
335
		t.Run("result for "+tc.date+"|online", func(test *testing.T) {
336
			Set("language", tc.lang)
337
338
			if res := Take(tc.date + "|online"); res != tc.result {
339
				test.Errorf("Result must be %s, but got %s instead", tc.result, res)
340
			}
341
		})
342
	}
343
}
344
345
func TestTakeWithSeconds(t *testing.T) {
346
	cases := []struct {
347
		date   string
348
		result []string
349
		lang   string
350
	}{
351
		// english
352
		{smallSubTime(time.Second * 2), []string{"0 seconds ago", "1 second ago"}, "en"},
353
		{smallSubTime(time.Second), []string{"0 seconds ago", "1 second ago"}, "en"},
354
		{smallSubTime(-1 * time.Second), []string{"1 second ago", "2 seconds ago"}, "en"},
355
		{smallSubTime(-2 * time.Second), []string{"2 seconds ago", "3 seconds ago"}, "en"},
356
		{smallSubTime(-9 * time.Second), []string{"9 seconds ago", "10 seconds ago"}, "en"},
357
		{smallSubTime(-10 * time.Second), []string{"10 seconds ago", "11 seconds ago"}, "en"},
358
		{smallSubTime(-11 * time.Second), []string{"11 seconds ago", "12 seconds ago"}, "en"},
359
		{smallSubTime(-20 * time.Second), []string{"20 seconds ago", "21 seconds ago"}, "en"},
360
		{smallSubTime(-21 * time.Second), []string{"21 seconds ago", "22 seconds ago"}, "en"},
361
		{smallSubTime(-22 * time.Second), []string{"22 seconds ago", "23 seconds ago"}, "en"},
362
		{smallSubTime(-30 * time.Second), []string{"30 seconds ago", "31 seconds ago"}, "en"},
363
		{smallSubTime(-31 * time.Second), []string{"31 seconds ago", "32 seconds ago"}, "en"},
364
		{smallSubTime(-59 * time.Second), []string{"59 seconds ago", "1 minute ago"}, "en"},
365
		// russian
366
		{smallSubTime(time.Second * 2), []string{"0 секунд назад", "1 секунда назад"}, "ru"},
367
		{smallSubTime(time.Second), []string{"0 секунд назад", "1 секунда назад"}, "ru"},
368
		{smallSubTime(-1 * time.Second), []string{"1 секунда назад", "2 секунды назад"}, "ru"},
369
		{smallSubTime(-2 * time.Second), []string{"2 секунды назад", "3 секунды назад"}, "ru"},
370
		{smallSubTime(-3 * time.Second), []string{"3 секунды назад", "4 секунды назад"}, "ru"},
371
		{smallSubTime(-4 * time.Second), []string{"4 секунды назад", "5 секунд назад"}, "ru"},
372
		{smallSubTime(-9 * time.Second), []string{"9 секунд назад", "10 секунд назад"}, "ru"},
373
		{smallSubTime(-10 * time.Second), []string{"10 секунд назад", "11 секунд назад"}, "ru"},
374
		{smallSubTime(-11 * time.Second), []string{"11 секунд назад", "12 секунд назад"}, "ru"},
375
		{smallSubTime(-29 * time.Second), []string{"29 секунд назад", "30 секунд назад"}, "ru"},
376
		{smallSubTime(-30 * time.Second), []string{"30 секунд назад", "31 секунда назад"}, "ru"},
377
		{smallSubTime(-31 * time.Second), []string{"31 секунда назад", "32 секунда назад"}, "ru"},
378
		{smallSubTime(-59 * time.Second), []string{"59 секунд назад", "1 минута назад"}, "ru"},
379
	}
380
381
	for _, tc := range cases {
382
		t.Run("result for "+tc.date, func(test *testing.T) {
383
			Set("language", tc.lang)
384
			Set("location", "Europe/Kiev")
385
386
			if res := Take(tc.date); res != tc.result[0] && res != tc.result[1] {
387
				test.Errorf("Result must be %s or %s, but got %s instead", tc.result[0], tc.result[1], res)
388
			}
389
		})
390
	}
391
}
392