1- import { isValidDate , normalizeDate , parseRelativeTime , userFriendlyDate } from './time' ;
1+ import { isValidDate , parseRelativeTime } from './time' ;
22import moment from 'moment' ;
33
44moment . updateLocale ( 'en' , {
@@ -24,43 +24,160 @@ it('should test for valid date', () => {
2424// 2019-10-14 Monday
2525// 2019-10-21 Monday
2626
27- it ( 'should parse' , ( ) => {
28- expectSuccess ( parseRelativeTime ( 'now-1d' , 'startOf' , moment ( '2019-10-20T15:55:00' ) ) ) . toEqual ( '2019-10-19 15:55:00' ) ;
29- expectSuccess ( parseRelativeTime ( 'now-120s' , 'startOf' , moment ( '2019-10-20T15:55:15' ) ) ) . toEqual ( '2019-10-20 15:53:15' ) ;
30- expectSuccess ( parseRelativeTime ( 'now-1d-1h' , 'startOf' , moment ( '2019-10-20T15:55:00' ) ) ) . toEqual ( '2019-10-19 14:55:00' ) ;
31- expectSuccess ( parseRelativeTime ( 'now/w' , 'startOf' , moment ( '2019-10-20T15:55:15' ) ) ) . toEqual ( '2019-10-14 00:00:00' ) ;
32- expectSuccess ( parseRelativeTime ( 'now/w' , 'endOf' , moment ( '2019-10-20T15:55:15' ) ) ) . toEqual ( '2019-10-20 23:59:59' ) ;
33- expectSuccess ( parseRelativeTime ( 'now-1w/w' , 'startOf' , moment ( '2019-10-20T15:55:15' ) ) ) . toEqual ( '2019-10-07 00:00:00' ) ;
34- expectSuccess ( parseRelativeTime ( 'now-1y+1w/w' , 'startOf' , moment ( '2019-10-20T15:55:15' ) ) ) . toEqual ( '2018-10-22 00:00:00' ) ;
35- expectSuccess ( parseRelativeTime ( 'now/d+5h' , 'startOf' , moment ( '2019-10-20T15:55:00' ) ) ) . toEqual ( '2019-10-20 05:00:00' ) ;
36- expectSuccess ( parseRelativeTime ( 'now/y' , 'startOf' , moment ( '2019-10-20T15:55:15' ) ) ) . toEqual ( '2019-01-01 00:00:00' ) ;
37- } ) ;
38-
39- it ( 'should convert to RFC3339 and back' , ( ) => {
40- // can't put exact dates since moment doesn't allow overriding `.local()`'s timezone for unit tests
41- const userDate = '2025-01-01 10:10' ;
42- const rfcDate = moment ( userDate ) . utc ( ) . format ( ) ;
43-
44- expect ( normalizeDate ( userDate ) ) . toBe ( rfcDate ) ;
45- expect ( userFriendlyDate ( rfcDate ) ) . toBe ( userDate ) ;
46- } ) ;
47-
48- it ( 'should not modify relative ranges' , ( ) => {
49- expect ( normalizeDate ( 'now-1d' ) ) . toBe ( 'now-1d' ) ;
50- expect ( normalizeDate ( 'now-120s' ) ) . toBe ( 'now-120s' ) ;
51- expect ( normalizeDate ( 'now-1d-1h' ) ) . toBe ( 'now-1d-1h' ) ;
52- expect ( normalizeDate ( 'now/w' ) ) . toBe ( 'now/w' ) ;
53- expect ( normalizeDate ( 'now/w' ) ) . toBe ( 'now/w' ) ;
54- expect ( normalizeDate ( 'now-1w/w' ) ) . toBe ( 'now-1w/w' ) ;
55- expect ( normalizeDate ( 'now-1y+1w/w' ) ) . toBe ( 'now-1y+1w/w' ) ;
56- expect ( normalizeDate ( 'now/d+5h' ) ) . toBe ( 'now/d+5h' ) ;
57- expect ( normalizeDate ( 'now/y' ) ) . toBe ( 'now/y' ) ;
58- } ) ;
59-
60- const expectSuccess = ( value : ReturnType < typeof parseRelativeTime > ) => {
61- if ( value . success ) {
62- return expect ( value . value . format ( 'YYYY-MM-DD HH:mm:ss' ) ) ;
27+ it . each ( [
28+ {
29+ value : 'now-1d' ,
30+ divide : 'startOf' ,
31+ now : moment ( '2019-10-20T15:55:00' ) ,
32+ expected : '2019-10-19 15:55:00' ,
33+ localized : 'now-1d' ,
34+ normalized : 'now-1d' ,
35+ shouldParse : true ,
36+ } ,
37+ {
38+ value : 'now-120s' ,
39+ divide : 'startOf' ,
40+ now : moment ( '2019-10-20T15:55:15' ) ,
41+ expected : '2019-10-20 15:53:15' ,
42+ localized : 'now-120s' ,
43+ normalized : 'now-120s' ,
44+ shouldParse : true ,
45+ } ,
46+ {
47+ value : 'now-1d-1h' ,
48+ divide : 'startOf' ,
49+ now : moment ( '2019-10-20T15:55:00' ) ,
50+ expected : '2019-10-19 14:55:00' ,
51+ localized : 'now-1d-1h' ,
52+ normalized : 'now-1d-1h' ,
53+ shouldParse : true ,
54+ } ,
55+ {
56+ value : 'now/w' ,
57+ divide : 'startOf' ,
58+ now : moment ( '2019-10-20T15:55:15' ) ,
59+ expected : '2019-10-14 00:00:00' ,
60+ localized : 'now/w' ,
61+ normalized : 'now/w' ,
62+ shouldParse : true ,
63+ } ,
64+ {
65+ value : 'now/w' ,
66+ divide : 'endOf' ,
67+ now : moment ( '2019-10-20T15:55:15' ) ,
68+ expected : '2019-10-20 23:59:59' ,
69+ localized : 'now/w' ,
70+ normalized : 'now/w' ,
71+ shouldParse : true ,
72+ } ,
73+ {
74+ value : 'now-1w/w' ,
75+ divide : 'startOf' ,
76+ now : moment ( '2019-10-20T15:55:15' ) ,
77+ expected : '2019-10-07 00:00:00' ,
78+ localized : 'now-1w/w' ,
79+ normalized : 'now-1w/w' ,
80+ shouldParse : true ,
81+ } ,
82+ {
83+ value : 'now-1y+1w/w' ,
84+ divide : 'startOf' ,
85+ now : moment ( '2019-10-20T15:55:15' ) ,
86+ expected : '2018-10-22 00:00:00' ,
87+ localized : 'now-1y+1w/w' ,
88+ normalized : 'now-1y+1w/w' ,
89+ shouldParse : true ,
90+ } ,
91+ {
92+ value : 'now/d+5h' ,
93+ divide : 'startOf' ,
94+ now : moment ( '2019-10-20T15:55:00' ) ,
95+ expected : '2019-10-20 05:00:00' ,
96+ localized : 'now/d+5h' ,
97+ normalized : 'now/d+5h' ,
98+ shouldParse : true ,
99+ } ,
100+ {
101+ value : 'now/y' ,
102+ divide : 'startOf' ,
103+ now : moment ( '2019-10-20T15:55:15' ) ,
104+ expected : '2019-01-01 00:00:00' ,
105+ localized : 'now/y' ,
106+ normalized : 'now/y' ,
107+ shouldParse : true ,
108+ } ,
109+ {
110+ value : '2025-01-01 10:10' ,
111+ divide : 'startOf' ,
112+ expected : '2025-01-01 10:10:00' ,
113+ localized : '2025-01-01 10:10' ,
114+ normalized : moment ( '2025-01-01 10:10' ) . utc ( ) . format ( ) ,
115+ shouldParse : true ,
116+ } ,
117+ {
118+ value : '2025-01-01 10:10' ,
119+ divide : 'endOf' ,
120+ expected : '2025-01-01 10:10:00' ,
121+ localized : '2025-01-01 10:10' ,
122+ normalized : moment ( '2025-01-01 10:10' ) . utc ( ) . format ( ) ,
123+ shouldParse : true ,
124+ } ,
125+ {
126+ value : '2025-01-02' ,
127+ divide : 'startOf' ,
128+ expected : '2025-01-02 00:00:00' ,
129+ localized : '2025-01-02' ,
130+ normalized : moment ( '2025-01-02 00:00' ) . utc ( ) . format ( ) ,
131+ shouldParse : true ,
132+ } ,
133+ {
134+ value : '2025-01-02' ,
135+ divide : 'endOf' ,
136+ expected : '2025-01-02 23:59:59' ,
137+ localized : '2025-01-02' ,
138+ normalized : moment ( '2025-01-02 23:59:59' ) . utc ( ) . format ( ) ,
139+ shouldParse : true ,
140+ } ,
141+ {
142+ value : moment ( '2025-01-02 10:00:00' ) . format ( ) ,
143+ divide : 'startOf' ,
144+ expected : '2025-01-02 10:00:00' ,
145+ localized : '2025-01-02 10:00' ,
146+ normalized : moment ( '2025-01-02 10:00:00' ) . utc ( ) . format ( ) ,
147+ shouldParse : true ,
148+ } ,
149+ {
150+ value : moment ( '2025-01-02 00:00:00' ) . format ( ) ,
151+ divide : 'startOf' ,
152+ expected : '2025-01-02 00:00:00' ,
153+ localized : '2025-01-02' ,
154+ normalized : moment ( '2025-01-02 00:00:00' ) . utc ( ) . format ( ) ,
155+ shouldParse : true ,
156+ } ,
157+ {
158+ value : moment ( '2025-01-02 23:59:59' ) . utc ( ) . format ( ) ,
159+ divide : 'endOf' ,
160+ expected : '2025-01-02 23:59:59' ,
161+ localized : '2025-01-02' ,
162+ normalized : moment ( '2025-01-02 23:59:59' ) . utc ( ) . format ( ) ,
163+ shouldParse : true ,
164+ } ,
165+ {
166+ value : 'invalid' ,
167+ divide : 'endOf' ,
168+ expected : "Expected valid date (e.g. 2020-01-01 16:30) or 'now' at index 0" ,
169+ localized : 'invalid' ,
170+ normalized : undefined ,
171+ shouldParse : false ,
172+ } ,
173+ ] ) ( 'should parse' , ( { value, divide, now, expected, normalized, localized, shouldParse} ) => {
174+ const result = parseRelativeTime ( value , divide as 'startOf' | 'endOf' , now ) ;
175+ expect ( result . success ) . toBe ( shouldParse ) ;
176+ if ( result . success ) {
177+ expect ( result . preview . format ( 'YYYY-MM-DD HH:mm:ss' ) ) . toEqual ( expected ) ;
178+ expect ( result . normalized ) . toEqual ( normalized ) ;
179+ expect ( result . localized ) . toEqual ( localized ) ;
180+ } else {
181+ expect ( result . error ) . toEqual ( expected ) ;
63182 }
64- expect ( value . error ) . toEqual ( 'no error' ) ;
65- return expect ( '' ) ;
66- } ;
183+ } ) ;
0 commit comments