11import { 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' ;
33import { FormsModule , NgForm } from '@angular/forms' ;
44import { By } from '@angular/platform-browser' ;
55import * as _moment from 'moment' ;
@@ -24,7 +24,7 @@ if ('default' in _moment) {
2424 </form>`
2525} )
2626class DateModelComponent {
27- dateValue : any ;
27+ dateValue : number ;
2828 @ViewChild ( DlDateTimeInputDirective , { static : false } ) input : DlDateTimeInputDirective < number > ;
2929 dateTimeFilter : ( value : ( number | null ) ) => boolean = ( ) => true ;
3030}
@@ -71,7 +71,7 @@ describe('DlDateTimeInputDirective', () => {
7171 it ( 'should be displayed using default format' , fakeAsync ( ( ) => {
7272 const octoberFirst = moment ( '2018-10-01' ) ;
7373 const expectedValue = octoberFirst . format ( DL_DATE_TIME_DISPLAY_FORMAT_DEFAULT ) ;
74- component . dateValue = octoberFirst . toDate ( ) ;
74+ component . dateValue = octoberFirst . valueOf ( ) ;
7575 fixture . detectChanges ( ) ;
7676 flush ( ) ;
7777 const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
@@ -107,7 +107,7 @@ describe('DlDateTimeInputDirective', () => {
107107 expect ( inputElement . classList ) . toContain ( 'ng-touched' ) ;
108108 } ) ;
109109
110- it ( 'should reformat the input value on blur' , ( ) => {
110+ it ( 'should reformat the input value on blur' , fakeAsync ( ( ) => {
111111 const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
112112
113113 inputElement . value = '1/1/2001' ;
@@ -120,19 +120,21 @@ describe('DlDateTimeInputDirective', () => {
120120 fixture . detectChanges ( ) ;
121121
122122 expect ( inputElement . value ) . toBe ( moment ( '2001-01-01' ) . format ( DL_DATE_TIME_DISPLAY_FORMAT_DEFAULT ) ) ;
123- } ) ;
123+ } ) ) ;
124124
125125 it ( 'should not reformat invalid dates on blur' , ( ) => {
126126 const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
127127
128- inputElement . value = 'very-valid -date' ;
128+ inputElement . value = 'very-invalid -date' ;
129129 inputElement . dispatchEvent ( new Event ( 'input' ) ) ;
130130 fixture . detectChanges ( ) ;
131131
132+ expect ( inputElement . value ) . toBe ( 'very-invalid-date' ) ;
133+
132134 inputElement . dispatchEvent ( new Event ( 'blur' ) ) ;
133135 fixture . detectChanges ( ) ;
134136
135- expect ( inputElement . value ) . toBe ( 'very-valid -date' ) ;
137+ expect ( inputElement . value ) . toBe ( 'very-invalid -date' ) ;
136138 } ) ;
137139
138140 it ( 'should consider empty input to be valid (for non-required inputs)' , ( ) => {
@@ -143,7 +145,7 @@ describe('DlDateTimeInputDirective', () => {
143145
144146 it ( 'should add ng-invalid on invalid input' , fakeAsync ( ( ) => {
145147 const novemberFirst = moment ( '2018-11-01' ) ;
146- component . dateValue = novemberFirst . toDate ( ) ;
148+ component . dateValue = novemberFirst . valueOf ( ) ;
147149 fixture . detectChanges ( ) ;
148150 flush ( ) ;
149151
@@ -186,10 +188,13 @@ describe('DlDateTimeInputDirective', () => {
186188 expect ( inputElement . classList ) . toContain ( 'ng-valid' ) ;
187189 } ) ;
188190
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+
191196 spyOn ( component , 'dateTimeFilter' ) . and . callFake ( ( date : number ) => {
192- return date !== filteredValue ;
197+ return date === allowedValue ;
193198 } ) ;
194199
195200 const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
@@ -201,9 +206,33 @@ describe('DlDateTimeInputDirective', () => {
201206
202207 const control = debugElement . children [ 0 ] . injector . get ( NgForm ) . control . get ( 'dateValue' ) ;
203208 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 ) ;
205211 } ) ;
206212
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+
207236 it ( 'should disable input when setDisabled is called' , ( ) => {
208237 const inputElement = debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ;
209238 expect ( inputElement . disabled ) . toBe ( false ) ;
0 commit comments