@@ -132,64 +132,118 @@ define(function (require, exports, module) {
132
132
} ) ;
133
133
134
134
describe ( "dateTimeFromNow" , function ( ) {
135
- it ( "should return 'now' for current time" , function ( ) {
136
- const now = new Date ( ) ;
135
+ // we take a reference date for tests stability. due to use of math.trunk, using date.now will
136
+ // sometimes lead to valid time jumps in tests. so we just take a reference time fixed to not account for
137
+ // any time taken in compute for tests.
138
+ const refDate = Date . now ( ) ;
139
+ function referenceDate ( {
140
+ seconds = 0 ,
141
+ minutes = 0 ,
142
+ hours = 0 ,
143
+ days = 0 ,
144
+ months = 0 ,
145
+ years = 0
146
+ } = { } ) {
147
+ const date = new Date ( refDate ) ; // Original reference date
148
+
149
+ // Add time components
150
+ date . setSeconds ( date . getSeconds ( ) + seconds ) ;
151
+ date . setMinutes ( date . getMinutes ( ) + minutes ) ;
152
+ date . setHours ( date . getHours ( ) + hours ) ;
153
+ date . setDate ( date . getDate ( ) + days ) ;
154
+ date . setMonth ( date . getMonth ( ) + months ) ;
155
+ date . setFullYear ( date . getFullYear ( ) + years ) ;
156
+
157
+ return date ;
158
+ }
159
+
160
+ it ( "should return 'now' for current time without specifying fromTime" , function ( ) {
161
+ let now = new Date ( ) ;
137
162
let result = LocalizationUtils . dateTimeFromNow ( now , "en" ) ;
138
163
expect ( result ) . toBe ( "now" ) ;
139
164
result = LocalizationUtils . dateTimeFromNow ( now , "de" ) ;
140
165
expect ( result ) . toBe ( "jetzt" ) ;
141
166
} ) ;
142
167
168
+ it ( "should return 'now' for current time within 3 seconds of time" , function ( ) {
169
+ let now = referenceDate ( ) ;
170
+ let result = LocalizationUtils . dateTimeFromNow ( now , "en" , referenceDate ( ) ) ;
171
+ expect ( result ) . toBe ( "now" ) ;
172
+ now = referenceDate ( { seconds : 1 } ) ;
173
+ result = LocalizationUtils . dateTimeFromNow ( now , "en" , referenceDate ( ) ) ;
174
+ expect ( result ) . toBe ( "now" ) ;
175
+ now = referenceDate ( { seconds : 2 } ) ;
176
+ result = LocalizationUtils . dateTimeFromNow ( now , "en" , referenceDate ( ) ) ;
177
+ expect ( result ) . toBe ( "now" ) ;
178
+ result = LocalizationUtils . dateTimeFromNow ( now , "de" , referenceDate ( ) ) ;
179
+ expect ( result ) . toBe ( "jetzt" ) ;
180
+ now = referenceDate ( { seconds : 1 } ) ;
181
+ result = LocalizationUtils . dateTimeFromNow ( now , "de" , referenceDate ( ) ) ;
182
+ expect ( result ) . toBe ( "jetzt" ) ;
183
+ now = referenceDate ( { seconds : 2 } ) ;
184
+ result = LocalizationUtils . dateTimeFromNow ( now , "de" , referenceDate ( ) ) ;
185
+ expect ( result ) . toBe ( "jetzt" ) ;
186
+ } ) ;
187
+
143
188
it ( "should handle future dates within seconds" , function ( ) {
144
- const futureDate = new Date ( Date . now ( ) + 30 * 1000 ) ; // 30 seconds in the future
145
- const result = LocalizationUtils . dateTimeFromNow ( futureDate , "en" ) ;
189
+ const futureDate = referenceDate ( { seconds : 30 } ) ; // 30 seconds in the future
190
+ const result = LocalizationUtils . dateTimeFromNow ( futureDate , "en" , referenceDate ( ) ) ;
146
191
expect ( result ) . toBe ( "in 30 seconds" ) ;
147
192
} ) ;
148
193
149
194
it ( "should handle past dates within minutes" , function ( ) {
150
- const pastDate = new Date ( Date . now ( ) - 90 * 1000 ) ; // 90 seconds in the past
151
- const result = LocalizationUtils . dateTimeFromNow ( pastDate , "en" ) ;
195
+ const pastDate = referenceDate ( { seconds : - 90 } ) ; // 90 seconds in the past
196
+ const result = LocalizationUtils . dateTimeFromNow ( pastDate , "en" , referenceDate ( ) ) ;
197
+ expect ( result ) . toBe ( "1 minute ago" ) ;
198
+ } ) ;
199
+
200
+ it ( "should handle past and future dates similarly" , function ( ) {
201
+ const pastDate = referenceDate ( { seconds : - 130 } ) ; // 2 minutes and 10 secs
202
+ let result = LocalizationUtils . dateTimeFromNow ( pastDate , "en" , referenceDate ( ) ) ;
152
203
expect ( result ) . toBe ( "2 minutes ago" ) ;
204
+ const futureDate = referenceDate ( { seconds : 130 } ) ; // 2 minutes and 10 secs
205
+ result = LocalizationUtils . dateTimeFromNow ( futureDate , "en" , referenceDate ( ) ) ;
206
+ expect ( result ) . toBe ( "in 2 minutes" ) ;
153
207
} ) ;
154
208
155
209
it ( "should handle future dates within hours" , function ( ) {
156
- const futureDate = new Date ( Date . now ( ) + 2 * 60 * 60 * 1000 ) ; // 2 hours in the future
157
- const result = LocalizationUtils . dateTimeFromNow ( futureDate , "en" ) ;
210
+ const futureDate = referenceDate ( { hours : 2 } ) ; // 2 hours in the future
211
+ const result = LocalizationUtils . dateTimeFromNow ( futureDate , "en" , referenceDate ( ) ) ;
158
212
expect ( result ) . toBe ( "in 2 hours" ) ;
159
213
} ) ;
160
214
161
215
it ( "should handle past dates within days" , function ( ) {
162
- const pastDate = new Date ( Date . now ( ) - 3 * 24 * 60 * 60 * 1000 ) ; // 3 days ago
163
- const result = LocalizationUtils . dateTimeFromNow ( pastDate , "en" ) ;
216
+ const pastDate = referenceDate ( { days : - 3 } ) ; // 3 days ago
217
+ const result = LocalizationUtils . dateTimeFromNow ( pastDate , "en" , referenceDate ( ) ) ;
164
218
expect ( result ) . toBe ( "3 days ago" ) ;
165
219
} ) ;
166
220
167
221
it ( "should handle future dates within months" , function ( ) {
168
- const futureDate = new Date ( Date . now ( ) + 45 * 24 * 60 * 60 * 1000 ) ; // 45 days in the future
169
- const result = LocalizationUtils . dateTimeFromNow ( futureDate , "en" ) ;
222
+ const futureDate = referenceDate ( { days : 45 } ) ; // 45 days in the future
223
+ const result = LocalizationUtils . dateTimeFromNow ( futureDate , "en" , referenceDate ( ) ) ;
170
224
expect ( result ) . toBe ( "next month" ) ;
171
225
} ) ;
172
226
173
227
it ( "should handle past dates within years" , function ( ) {
174
- const pastDate = new Date ( Date . now ( ) - 2 * 365 * 24 * 60 * 60 * 1000 ) ; // 2 years ago
175
- const result = LocalizationUtils . dateTimeFromNow ( pastDate , "en" ) ;
228
+ const pastDate = referenceDate ( { years : - 2 } ) ; // 2 years ago
229
+ const result = LocalizationUtils . dateTimeFromNow ( pastDate , "en" , referenceDate ( ) ) ;
176
230
expect ( result ) . toBe ( "2 years ago" ) ;
177
231
} ) ;
178
232
179
233
it ( "should return relative time in French locale" , function ( ) {
180
- const pastDate = new Date ( Date . now ( ) - 3 * 24 * 60 * 60 * 1000 ) ; // 3 days ago
181
- const result = LocalizationUtils . dateTimeFromNow ( pastDate , "fr" ) ;
234
+ const pastDate = referenceDate ( { days : - 3 } ) ; // 3 days ago
235
+ const result = LocalizationUtils . dateTimeFromNow ( pastDate , "fr" , referenceDate ( ) ) ;
182
236
expect ( result ) . toBe ( "il y a 3 jours" ) ;
183
237
} ) ;
184
238
185
239
it ( "should fallback to default locale if an invalid locale is specified" , function ( ) {
186
- const futureDate = new Date ( Date . now ( ) + 2 * 60 * 60 * 1000 ) ; // 2 hours in the future
187
- const result = LocalizationUtils . dateTimeFromNow ( futureDate , "invalid-locale" ) ;
240
+ const futureDate = referenceDate ( { hours : 2 } ) ; // 2 hours in the future
241
+ const result = LocalizationUtils . dateTimeFromNow ( futureDate , "invalid-locale" , referenceDate ( ) ) ;
188
242
expect ( result ) . toBe ( "in 2 hours" ) ;
189
243
} ) ;
190
244
191
245
it ( "should handle default date input (now) gracefully" , function ( ) {
192
- const result = LocalizationUtils . dateTimeFromNow ( undefined , "en" ) ;
246
+ const result = LocalizationUtils . dateTimeFromNow ( ) ;
193
247
expect ( result ) . toBe ( "now" ) ;
194
248
} ) ;
195
249
} ) ;
0 commit comments