1
1
import { Component , DebugElement , ViewChild } from '@angular/core' ;
2
- import { async , ComponentFixture , fakeAsync , flush , TestBed } from '@angular/core/testing' ;
2
+ import { async , ComponentFixture , fakeAsync , flush , TestBed , tick } from '@angular/core/testing' ;
3
3
import { FormsModule , NgForm } from '@angular/forms' ;
4
4
import { By } from '@angular/platform-browser' ;
5
5
import * as _moment from 'moment' ;
@@ -24,7 +24,7 @@ if ('default' in _moment) {
24
24
</form>`
25
25
} )
26
26
class DateModelComponent {
27
- dateValue : any ;
27
+ dateValue : number ;
28
28
@ViewChild ( DlDateTimeInputDirective , { static : false } ) input : DlDateTimeInputDirective < number > ;
29
29
dateTimeFilter : ( value : ( number | null ) ) => boolean = ( ) => true ;
30
30
}
@@ -71,7 +71,7 @@ describe('DlDateTimeInputDirective', () => {
71
71
it ( 'should be displayed using default format' , fakeAsync ( ( ) => {
72
72
const octoberFirst = moment ( '2018-10-01' ) ;
73
73
const expectedValue = octoberFirst . format ( DL_DATE_TIME_DISPLAY_FORMAT_DEFAULT ) ;
74
- component . dateValue = octoberFirst . toDate ( ) ;
74
+ component . dateValue = octoberFirst . valueOf ( ) ;
75
75
fixture . detectChanges ( ) ;
76
76
flush ( ) ;
77
77
const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
@@ -107,7 +107,7 @@ describe('DlDateTimeInputDirective', () => {
107
107
expect ( inputElement . classList ) . toContain ( 'ng-touched' ) ;
108
108
} ) ;
109
109
110
- it ( 'should reformat the input value on blur' , ( ) => {
110
+ it ( 'should reformat the input value on blur' , fakeAsync ( ( ) => {
111
111
const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
112
112
113
113
inputElement . value = '1/1/2001' ;
@@ -120,19 +120,21 @@ describe('DlDateTimeInputDirective', () => {
120
120
fixture . detectChanges ( ) ;
121
121
122
122
expect ( inputElement . value ) . toBe ( moment ( '2001-01-01' ) . format ( DL_DATE_TIME_DISPLAY_FORMAT_DEFAULT ) ) ;
123
- } ) ;
123
+ } ) ) ;
124
124
125
125
it ( 'should not reformat invalid dates on blur' , ( ) => {
126
126
const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
127
127
128
- inputElement . value = 'very-valid -date' ;
128
+ inputElement . value = 'very-invalid -date' ;
129
129
inputElement . dispatchEvent ( new Event ( 'input' ) ) ;
130
130
fixture . detectChanges ( ) ;
131
131
132
+ expect ( inputElement . value ) . toBe ( 'very-invalid-date' ) ;
133
+
132
134
inputElement . dispatchEvent ( new Event ( 'blur' ) ) ;
133
135
fixture . detectChanges ( ) ;
134
136
135
- expect ( inputElement . value ) . toBe ( 'very-valid -date' ) ;
137
+ expect ( inputElement . value ) . toBe ( 'very-invalid -date' ) ;
136
138
} ) ;
137
139
138
140
it ( 'should consider empty input to be valid (for non-required inputs)' , ( ) => {
@@ -143,7 +145,7 @@ describe('DlDateTimeInputDirective', () => {
143
145
144
146
it ( 'should add ng-invalid on invalid input' , fakeAsync ( ( ) => {
145
147
const novemberFirst = moment ( '2018-11-01' ) ;
146
- component . dateValue = novemberFirst . toDate ( ) ;
148
+ component . dateValue = novemberFirst . valueOf ( ) ;
147
149
fixture . detectChanges ( ) ;
148
150
flush ( ) ;
149
151
@@ -186,10 +188,13 @@ describe('DlDateTimeInputDirective', () => {
186
188
expect ( inputElement . classList ) . toContain ( 'ng-valid' ) ;
187
189
} ) ;
188
190
189
- it ( 'should add ng-invalid for valid input of filtered date' , ( ) => {
190
- const filteredValue = moment ( '2018-10-29T17:00' ) . valueOf ( ) ;
191
+ it ( 'should add ng-invalid for input of filtered out date' , ( ) => {
192
+ const expectedErrorValue = moment ( '2018-10-29T17:00' ) . valueOf ( ) ;
193
+
194
+ const allowedValue = moment ( '2019-10-29T17:00' ) . valueOf ( ) ;
195
+
191
196
spyOn ( component , 'dateTimeFilter' ) . and . callFake ( ( date : number ) => {
192
- return date !== filteredValue ;
197
+ return date === allowedValue ;
193
198
} ) ;
194
199
195
200
const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
@@ -201,9 +206,33 @@ describe('DlDateTimeInputDirective', () => {
201
206
202
207
const control = debugElement . children [ 0 ] . injector . get ( NgForm ) . control . get ( 'dateValue' ) ;
203
208
expect ( control . hasError ( 'dlDateTimeInputFilter' ) ) . toBe ( true ) ;
204
- expect ( control . errors . dlDateTimeInputFilter . value ) . toBe ( filteredValue . valueOf ( ) ) ;
209
+ const value = control . errors . dlDateTimeInputFilter . value ;
210
+ expect ( value ) . toBe ( expectedErrorValue ) ;
205
211
} ) ;
206
212
213
+ it ( 'should remove ng-invalid when model is updated with valid date' , fakeAsync ( ( ) => {
214
+ const allowedValue = moment ( '2019-10-29T17:00' ) . valueOf ( ) ;
215
+ spyOn ( component , 'dateTimeFilter' ) . and . callFake ( ( date : number ) => {
216
+ return date === allowedValue ;
217
+ } ) ;
218
+
219
+ const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
220
+ inputElement . value = '10/29/2018 05:00 PM' ;
221
+ inputElement . dispatchEvent ( new Event ( 'blur' ) ) ;
222
+
223
+ fixture . detectChanges ( ) ;
224
+
225
+ expect ( inputElement . classList ) . toContain ( 'ng-invalid' ) ;
226
+
227
+ component . dateValue = allowedValue ;
228
+
229
+ fixture . detectChanges ( ) ;
230
+ tick ( ) ;
231
+ fixture . detectChanges ( ) ;
232
+
233
+ expect ( inputElement . classList ) . toContain ( 'ng-valid' ) ;
234
+ } ) ) ;
235
+
207
236
it ( 'should disable input when setDisabled is called' , ( ) => {
208
237
const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
209
238
expect ( inputElement . disabled ) . toBe ( false ) ;
0 commit comments