11import { Component } from '@angular/core' ;
22import type { ComponentFixture } from '@angular/core/testing' ;
33import { TestBed } from '@angular/core/testing' ;
4- import { FormControl , ReactiveFormsModule } from '@angular/forms' ;
4+ import { FormControl , ReactiveFormsModule , FormsModule } from '@angular/forms' ;
55import { NgxMaskDirective , provideNgxMask } from 'ngx-mask' ;
66
77@Component ( {
@@ -13,79 +13,51 @@ class TestMaskComponent {
1313 public form : FormControl = new FormControl ( '' ) ;
1414}
1515
16+ @Component ( {
17+ selector : 'jsdaddy-phone-test' ,
18+ imports : [ FormsModule , NgxMaskDirective ] ,
19+ template : `
20+ <form #phoneForm="ngForm">
21+ <input
22+ name="phoneNumber"
23+ [(ngModel)]="phoneNumber"
24+ [pattern]="phoneValidationPattern"
25+ [dropSpecialCharacters]="false"
26+ [mask]="phoneMask" />
27+ </form>
28+ ` ,
29+ } )
30+ class TestPhoneMaskComponent {
31+ public phoneValidationPattern =
32+ / ^ \( ? ( [ 2 - 9 ] [ 0 - 8 ] [ 0 - 9 ] ) \) ? [ - . ] * ( [ 2 - 9 ] [ 0 - 9 ] { 2 } ) [ - . ] * ( [ 0 - 9 ] { 4 } ) $ / ;
33+ public phoneMask = '(000) 000-0000' ;
34+ public phoneNumber = '3333333333' ;
35+ }
36+
1637describe ( 'Directive: Forms' , ( ) => {
1738 let fixture : ComponentFixture < TestMaskComponent > ;
18- let component : TestMaskComponent ;
1939
2040 beforeEach ( ( ) => {
2141 TestBed . configureTestingModule ( {
2242 imports : [ NgxMaskDirective ] ,
2343 providers : [ provideNgxMask ( ) ] ,
2444 } ) ;
2545 fixture = TestBed . createComponent ( TestMaskComponent ) ;
26- component = fixture . componentInstance ;
2746 fixture . detectChanges ( ) ;
2847 } ) ;
2948
30- it ( 'should propagate masked value to the form control value' , ( ) => {
31- component . form . setValue ( 'A1234Z' ) ;
32- expect ( component . form . value ) . toBe ( '1234' ) ;
33- } ) ;
34-
35- it ( 'should propagate masked value to the form control valueChanges observable' , ( ) => {
36- component . form . valueChanges . subscribe ( ( newValue ) => {
37- expect ( newValue ) . toEqual ( '1234' ) ;
38- } ) ;
39-
40- component . form . setValue ( 'A1234Z' ) ;
41- } ) ;
42-
43- it ( 'should mask values when multiple calls to setValue() are made' , ( ) => {
44- component . form . setValue ( 'A1234Z' ) ;
45- expect ( component . form . value ) . toBe ( '1234' ) ;
46- component . form . setValue ( 'A1234Z' ) ;
47- expect ( component . form . value ) . toBe ( '1234' ) ;
48- component . form . setValue ( 'A1234Z' ) ;
49- expect ( component . form . value ) . toBe ( '1234' ) ;
50- } ) ;
51-
52- it ( 'should propagate masked value to the form control valueChanges observable when multiple calls to setValue() are made' , ( ) => {
53- component . form . valueChanges . subscribe ( ( newValue ) => {
54- expect ( newValue ) . toEqual ( '1234' ) ;
55- } ) ;
56-
57- component . form . setValue ( 'A1234Z' ) ;
58- component . form . setValue ( 'A1234Z' ) ;
59- component . form . setValue ( 'A1234Z' ) ;
60- } ) ;
61-
62- it ( 'should not emit to valueChanges if the masked value has not changed with emitEvent: true' , ( ) => {
63- let emissionsToValueChanges = 0 ;
64-
65- component . form . valueChanges . subscribe ( ( ) => {
66- emissionsToValueChanges ++ ;
67- } ) ;
68-
69- component . form . setValue ( '1234' , { emitEvent : true } ) ;
70- component . form . setValue ( '1234' , { emitEvent : true } ) ;
71-
72- // Expect to emit 3 times, once for the first setValue() call, once by ngx-mask, and once for the second setValue() call.
73- // There is not fourth emission for when ngx-mask masks the value for a second time.
74- expect ( emissionsToValueChanges ) . toBe ( 3 ) ;
75- } ) ;
76-
77- it ( 'should not emit to valueChanges if the masked value has not changed with emitEvent: false' , ( ) => {
78- let emissionsToValueChanges = 0 ;
79-
80- component . form . valueChanges . subscribe ( ( ) => {
81- emissionsToValueChanges ++ ;
82- } ) ;
49+ it ( 'should not mark form as dirty on initial load with initial value' , ( ) => {
50+ const testBed = TestBed . createComponent ( TestPhoneMaskComponent ) ;
51+ const phoneComponent = testBed . componentInstance ;
52+ phoneComponent . phoneNumber = '3333333333' ;
53+ testBed . detectChanges ( ) ;
8354
84- component . form . setValue ( '1234' , { emitEvent : false } ) ;
85- component . form . setValue ( '1234' , { emitEvent : false } ) ;
55+ // Get the form element and check if it's not dirty
56+ const formElement = testBed . nativeElement . querySelector ( 'form' ) ;
57+ const inputElement = testBed . nativeElement . querySelector ( 'input' ) ;
8658
87- // Expect to only have emitted once, only by ngx-mask.
88- // There is no second emission for when ngx-mask masks the value for a second time.
89- expect ( emissionsToValueChanges ) . toBe ( 1 ) ;
59+ // Check that the form is not dirty on initial load
60+ expect ( formElement . classList . contains ( 'ng-dirty' ) ) . toBe ( false ) ;
61+ expect ( inputElement . classList . contains ( 'ng-dirty' ) ) . toBe ( false ) ;
9062 } ) ;
9163} ) ;
0 commit comments