From d6669fd4f76519ad05fe84b5d954de8342717bc6 Mon Sep 17 00:00:00 2001 From: Vito Albano Date: Mon, 24 Oct 2016 19:15:34 +0100 Subject: [PATCH 1/7] Added check visibility for date picker --- .../ng2-activiti-form/src/components/widgets/date/date.widget.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.ts b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.ts index 4a6435e902..be754be4a2 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.ts @@ -72,6 +72,7 @@ export class DateWidget extends TextFieldWidgetComponent implements OnInit { onDateSelected() { let newValue = this.datePicker.time.format(this.DATE_FORMAT); this.field.value = newValue; + this.checkVisibility(this.field); if (this.elementRef) { this.setupMaterialTextField(this.elementRef, componentHandler, newValue); From ae48e0947174d6d8ed6e87fd18e32770ee09561f Mon Sep 17 00:00:00 2001 From: Vito Albano Date: Tue, 25 Oct 2016 10:43:34 +0100 Subject: [PATCH 2/7] Add some improvements to visibility service --- .../widget-visibility.service.spec.ts | 18 +++++----- .../src/services/widget-visibility.service.ts | 36 +++++++------------ 2 files changed, 22 insertions(+), 32 deletions(-) diff --git a/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.spec.ts b/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.spec.ts index c1fd593aaf..6806163acd 100644 --- a/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.spec.ts +++ b/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.spec.ts @@ -31,7 +31,7 @@ import { FormModel, FormFieldModel, TabModel, ContainerModel } from '../componen declare let jasmine: any; -describe('WidgetVisibilityService (mockBackend)', () => { +describe('WidgetVisibilityService', () => { let service: WidgetVisibilityService; let booleanResult: boolean; let stubFormWithFields = new FormModel(fakeFormJson); @@ -474,7 +474,7 @@ describe('WidgetVisibilityService (mockBackend)', () => { visibilityObjTest.operator = '!='; visibilityObjTest.rightFormFieldId = 'test_3'; let fakeFormField: FormFieldModel = new FormFieldModel(formTest, jsonFieldFake); - service.refreshFieldVisibility(fakeFormField); + service.refreshEntityVisibility(fakeFormField); expect(fakeFormField.isVisible).toBeFalsy(); }); @@ -488,13 +488,13 @@ describe('WidgetVisibilityService (mockBackend)', () => { expect(isVisible).toBeTruthy(); }); - it('should not change the isVisible if field does not have visibility condition', () => { + it('should return always true when field does not have a visibility condition', () => { jsonFieldFake.visibilityCondition = null; let fakeFormField: FormFieldModel = new FormFieldModel(fakeFormWithField, jsonFieldFake); fakeFormField.isVisible = false; - service.refreshFieldVisibility(fakeFormField); + service.refreshEntityVisibility(fakeFormField); - expect(fakeFormField.isVisible).toBeFalsy(); + expect(fakeFormField.isVisible).toBeTruthy(); }); it('should be able to retrieve the value of a form variable', () => { @@ -579,7 +579,7 @@ describe('WidgetVisibilityService (mockBackend)', () => { visibilityObjTest.operator = '=='; visibilityObjTest.rightFormFieldId = 'dropdown_LABEL'; let fakeFormField: FormFieldModel = new FormFieldModel(formTest, jsonFieldFake); - service.refreshFieldVisibility(fakeFormField); + service.refreshEntityVisibility(fakeFormField); expect(fakeFormField.isVisible).toBeTruthy(); }); @@ -589,7 +589,7 @@ describe('WidgetVisibilityService (mockBackend)', () => { visibilityObjTest.operator = '=='; visibilityObjTest.rightFormFieldId = 'dropdown'; let fakeFormField: FormFieldModel = new FormFieldModel(formTest, jsonFieldFake); - service.refreshFieldVisibility(fakeFormField); + service.refreshEntityVisibility(fakeFormField); expect(fakeFormField.isVisible).toBeTruthy(); }); @@ -633,7 +633,7 @@ describe('WidgetVisibilityService (mockBackend)', () => { visibilityObjTest.rightFormFieldId = 'RIGHT_FORM_FIELD_ID'; let tab = new TabModel(fakeFormWithField, {id: 'fake-tab-id', title: 'fake-tab-title', isVisible: true}); tab.visibilityCondition = visibilityObjTest; - service.refreshTabVisibility(tab); + service.refreshEntityVisibility(tab); expect(tab.isVisible).toBeFalsy(); }); @@ -664,7 +664,7 @@ describe('WidgetVisibilityService (mockBackend)', () => { isVisible: true }); contModel.visibilityCondition = visibilityObjTest; - service.refreshContainerVisibility(contModel); + service.refreshEntityVisibility(contModel); expect(contModel.isVisible).toBeFalsy(); }); diff --git a/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.ts b/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.ts index 6271654812..1b735ffa7e 100644 --- a/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.ts +++ b/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.ts @@ -35,37 +35,23 @@ export class WidgetVisibilityService { public refreshVisibility(form: FormModel) { if (form && form.tabs && form.tabs.length > 0) { - form.tabs.map(tabModel => this.refreshTabVisibility(tabModel)); + form.tabs.map(tabModel => this.refreshEntityVisibility(tabModel)); } if (form && form.fields.length > 0) { form.fields.map(contModel => { - this.refreshContainerVisibility(contModel); + this.refreshEntityVisibility(contModel); contModel.columns.map(contColModel => - contColModel.fields.map(field => this.refreshFieldVisibility(field))); + contColModel.fields.map(field => this.refreshEntityVisibility(field))); }); } } - refreshFieldVisibility(field: FormFieldModel) { - if (field.visibilityCondition) { - field.isVisible = this.evaluateVisibility(field.form, field.visibilityCondition); - } - } - - refreshContainerVisibility(content: ContainerModel) { - if (content.visibilityCondition) { - content.isVisible = this.evaluateVisibility(content.form, content.visibilityCondition); - } - } - - refreshTabVisibility(tab: TabModel) { - if (tab.visibilityCondition) { - tab.isVisible = this.evaluateVisibility(tab.form, tab.visibilityCondition); - } + refreshEntityVisibility(element: FormFieldModel | ContainerModel | TabModel) { + element.isVisible = this.evaluateVisibility(element.form, element.visibilityCondition); } evaluateVisibility(form: FormModel, visibilityObj: WidgetVisibilityModel): boolean { - let isLeftFieldPresent = visibilityObj.leftFormFieldId || visibilityObj.leftRestResponseId; + let isLeftFieldPresent = visibilityObj && ( visibilityObj.leftFormFieldId || visibilityObj.leftRestResponseId ); if (!isLeftFieldPresent || isLeftFieldPresent === 'null') { return true; } else { @@ -96,13 +82,17 @@ export class WidgetVisibilityService { } getRightValue(form: FormModel, visibilityObj: WidgetVisibilityModel) { - let valueFound = null; + let valueFound = ''; if (visibilityObj.rightRestResponseId) { valueFound = this.getVariableValue(form, visibilityObj.rightRestResponseId, this.processVarList); } else if (visibilityObj.rightFormFieldId) { valueFound = this.getFormValue(form, visibilityObj.rightFormFieldId); } else { - valueFound = visibilityObj.rightValue; + if (moment(visibilityObj.rightValue, 'YYYY-MM-DD', true).isValid()) { + valueFound = visibilityObj.rightValue + 'T00:00:00.000Z'; + } else { + valueFound = visibilityObj.rightValue; + } } return valueFound; } @@ -119,7 +109,7 @@ export class WidgetVisibilityService { } getFieldValue(valueList: any, fieldName: string) { - return fieldName ? valueList[fieldName] : fieldName; + return valueList[fieldName]; } getDropDownName(valueList: any, fieldName: string) { From b762d8e94f825cad4566210f8dd01a0a3dedafc2 Mon Sep 17 00:00:00 2001 From: Vito Albano Date: Tue, 25 Oct 2016 10:44:03 +0100 Subject: [PATCH 3/7] Start adding tests for new date visibility check --- .../components/widgets/date/date.widget.html | 5 +- .../widgets/date/date.widget.spec.ts | 72 ++++++++++++++++++- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html index 95009cb8df..dc485810c3 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html +++ b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html @@ -1,9 +1,8 @@ -
+
- { @@ -112,7 +115,7 @@ describe('DateWidget', () => { }); it('should update field value on date selected', () => { - widget.field = new FormFieldModel(null, { type: 'date' }); + widget.field = new FormFieldModel(null, {type: 'date'}); widget.ngOnInit(); let date = '13-3-1982'; @@ -124,7 +127,7 @@ describe('DateWidget', () => { it('should update material textfield on date selected', () => { spyOn(widget, 'setupMaterialTextField').and.callThrough(); - widget.field = new FormFieldModel(null, { type: 'date' }); + widget.field = new FormFieldModel(null, {type: 'date'}); widget.ngOnInit(); widget.datePicker.time = moment(); @@ -136,11 +139,74 @@ describe('DateWidget', () => { let w = new DateWidget(null); spyOn(w, 'setupMaterialTextField').and.callThrough(); - w.field = new FormFieldModel(null, { type: 'date' }); + w.field = new FormFieldModel(null, {type: 'date'}); w.ngOnInit(); w.datePicker.time = moment(); w.onDateSelected(); expect(w.setupMaterialTextField).not.toHaveBeenCalled(); }); + + it('should send field change event when a new date is picked from data picker', (done) => { + let w = new DateWidget(null); + spyOn(w, 'setupMaterialTextField').and.callThrough(); + w.field = new FormFieldModel(null, {type: 'date'}); + w.ngOnInit(); + w.datePicker.time = moment(); + w.fieldChanged.subscribe((field) => { + expect(field).toBeDefined(); + done(); + }); + + w.onDateSelected(); + }); + + describe('template check', () => { + let dateWidget: DateWidget; + let fixture: ComponentFixture; + let element: HTMLElement; + // let componentHandler; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [CoreModule], + declarations: [DateWidget] + }).compileComponents().then(() => { + fixture = TestBed.createComponent(DateWidget); + dateWidget = fixture.componentInstance; + element = fixture.nativeElement; + }); + })); + + beforeEach(() => { + dateWidget.field = new FormFieldModel(new FormModel(), { + id: 'date-field-id', + name: 'date-name', + type: 'date' + }); + dateWidget.field.isVisible = true; + }); + + afterEach(() => { + fixture.destroy(); + TestBed.resetTestingModule(); + }); + + it('should show visible date widget', () => { + fixture.detectChanges(); + fixture.whenStable() + .then(() => { + expect(element.querySelector('#date-field-id')).toBeDefined(); + }); + }); + + it('should hide not visible date widget', () => { + dateWidget.field.isVisible = false; + fixture.detectChanges(); + fixture.whenStable() + .then(() => { + expect(element.querySelector('#date-field-id')).toBeNull(); + }); + }); + }); }); From e0ddbb6bd8bd47a6611593a840ae1c15ad1dbd5e Mon Sep 17 00:00:00 2001 From: Vito Albano Date: Tue, 25 Oct 2016 14:38:16 +0100 Subject: [PATCH 4/7] Added test for date component fix --- .../components/widgets/date/date.widget.html | 4 +- .../widgets/date/date.widget.spec.ts | 71 ++++++++++++++++--- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html index dc485810c3..670997f622 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html +++ b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html @@ -2,11 +2,13 @@
- diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts index 3e7cabe628..e76d91cddb 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts @@ -36,6 +36,8 @@ describe('DateWidget', () => { }; elementRef = new ElementRef(nativeElement); widget = new DateWidget(elementRef); + let componentHandler = jasmine.createSpyObj('componentHandler', ['upgradeAllRegistered', 'upgradeElement']); + window['componentHandler'] = componentHandler; }); it('should setup basic date picker settings on init ', () => { @@ -155,19 +157,36 @@ describe('DateWidget', () => { w.datePicker.time = moment(); w.fieldChanged.subscribe((field) => { expect(field).toBeDefined(); + expect(field).not.toBeNull(); + done(); + }); + w.onDateSelected(); + }); + + it('should send field change event when date is changed in input text', (done) => { + let w = new DateWidget(null); + spyOn(w, 'setupMaterialTextField').and.callThrough(); + w.field = new FormFieldModel(null, {type: 'date'}); + w.ngOnInit(); + w.datePicker.time = moment(); + w.fieldChanged.subscribe((field) => { + expect(field).toBeDefined(); + expect(field).not.toBeNull(); done(); }); - w.onDateSelected(); + w.onDateChanged(); }); describe('template check', () => { let dateWidget: DateWidget; let fixture: ComponentFixture; let element: HTMLElement; - // let componentHandler; + let componentHandler; beforeEach(async(() => { + componentHandler = jasmine.createSpyObj('componentHandler', ['upgradeAllRegistered', 'upgradeElement']); + window['componentHandler'] = componentHandler; TestBed.configureTestingModule({ imports: [CoreModule], declarations: [DateWidget] @@ -179,12 +198,16 @@ describe('DateWidget', () => { })); beforeEach(() => { + spyOn(dateWidget, 'setupMaterialTextField').and.stub(); dateWidget.field = new FormFieldModel(new FormModel(), { id: 'date-field-id', name: 'date-name', - type: 'date' + value: '9-9-9999', + type: 'date', + readOnly: 'false' }); dateWidget.field.isVisible = true; + fixture.detectChanges(); }); afterEach(() => { @@ -192,21 +215,53 @@ describe('DateWidget', () => { TestBed.resetTestingModule(); }); - it('should show visible date widget', () => { - fixture.detectChanges(); + it('should show visible date widget', async(() => { fixture.whenStable() .then(() => { expect(element.querySelector('#date-field-id')).toBeDefined(); + expect(element.querySelector('#date-field-id')).not.toBeNull(); + let dateElement: any = element.querySelector('#date-field-id'); + expect(dateElement.value).toEqual('9-9-9999'); }); - }); + })); - it('should hide not visible date widget', () => { + it('should hide not visible date widget', async(() => { dateWidget.field.isVisible = false; fixture.detectChanges(); fixture.whenStable() .then(() => { + fixture.detectChanges(); expect(element.querySelector('#date-field-id')).toBeNull(); }); - }); + })); + + it('should become visibile if the visibility change to true', async(() => { + dateWidget.field.isVisible = false; + fixture.detectChanges(); + dateWidget.fieldChanged.subscribe((field) => { + field.isVisible = true; + fixture.detectChanges(); + fixture.whenStable() + .then(() => { + expect(element.querySelector('#date-field-id')).toBeDefined(); + expect(element.querySelector('#date-field-id')).not.toBeNull(); + let dateElement: any = element.querySelector('#date-field-id'); + expect(dateElement.value).toEqual('9-9-9999'); + }); + }); + dateWidget.checkVisibility(dateWidget.field); + })); + + it('should be hided if the visibility change to false', async(() => { + dateWidget.fieldChanged.subscribe((field) => { + field.isVisible = false; + fixture.detectChanges(); + fixture.whenStable() + .then(() => { + expect(element.querySelector('#date-field-id')).toBeNull(); + }); + }); + dateWidget.checkVisibility(dateWidget.field); + })); }); }); From 7f4415428d4539036b6502831d04bde905ed0858 Mon Sep 17 00:00:00 2001 From: Vito Albano Date: Tue, 25 Oct 2016 18:05:10 +0100 Subject: [PATCH 5/7] Added visibility specified for element --- .../components/widgets/date/date.widget.html | 23 +++++++++---------- .../widgets/date/date.widget.spec.ts | 6 +++-- .../components/widgets/date/date.widget.ts | 10 +++++--- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html index 670997f622..cd2c2cb8b5 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html +++ b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.html @@ -1,17 +1,15 @@ -
+
- + [class.date-widget__invalid]="!field.isValid"> + {{field.validationSummary}}
@@ -24,3 +22,4 @@
+ diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts index e76d91cddb..63763d3685 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts @@ -83,7 +83,9 @@ describe('DateWidget', () => { it('should setup trigger element', () => { let el = {}; spyOn(nativeElement, 'querySelector').and.returnValue(el); + widget.field = new FormFieldModel(null, {id: 'fake-id'}); widget.ngOnInit(); + widget.ngAfterViewChecked(); expect(widget.datePicker.trigger).toBe(el); }); @@ -231,7 +233,7 @@ describe('DateWidget', () => { fixture.whenStable() .then(() => { fixture.detectChanges(); - expect(element.querySelector('#date-field-id')).toBeNull(); + expect(element.querySelector('#data-widget')).toBeNull(); }); })); @@ -258,7 +260,7 @@ describe('DateWidget', () => { fixture.detectChanges(); fixture.whenStable() .then(() => { - expect(element.querySelector('#date-field-id')).toBeNull(); + expect(element.querySelector('#data-widget')).toBeNull(); }); }); dateWidget.checkVisibility(dateWidget.field); diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.ts b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.ts index be754be4a2..84a414d7c1 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { Component, ElementRef, OnInit } from '@angular/core'; +import { Component, ElementRef, OnInit, AfterViewChecked } from '@angular/core'; import { TextFieldWidgetComponent } from './../textfield-widget.component'; @Component({ @@ -24,7 +24,7 @@ import { TextFieldWidgetComponent } from './../textfield-widget.component'; templateUrl: './date.widget.html', styleUrls: ['./date.widget.css'] }) -export class DateWidget extends TextFieldWidgetComponent implements OnInit { +export class DateWidget extends TextFieldWidgetComponent implements OnInit, AfterViewChecked { DATE_FORMAT: string = 'D-M-YYYY'; @@ -57,8 +57,12 @@ export class DateWidget extends TextFieldWidgetComponent implements OnInit { } this.datePicker = new mdDateTimePicker.default(settings); + } + + ngAfterViewChecked() { if (this.elementRef) { - this.datePicker.trigger = this.elementRef.nativeElement.querySelector('#dateInput'); + let dataLocator = '#' + this.field.id; + this.datePicker.trigger = this.elementRef.nativeElement.querySelector(dataLocator); } } From 13a56bb9fefd3b0c25bde1f62ee7ca4443beb658 Mon Sep 17 00:00:00 2001 From: Vito Albano Date: Tue, 25 Oct 2016 18:05:27 +0100 Subject: [PATCH 6/7] Added right value support for dates --- .../src/services/widget-visibility.service.spec.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.spec.ts b/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.spec.ts index 6806163acd..076b047b0d 100644 --- a/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.spec.ts +++ b/ng2-components/ng2-activiti-form/src/services/widget-visibility.service.spec.ts @@ -389,6 +389,20 @@ describe('WidgetVisibilityService', () => { expect(rightValue).toBe('100'); }); + it('should return formatted date when right value is a date', () => { + visibilityObjTest.rightValue = '9999-12-31'; + let rightValue = service.getRightValue(formTest, visibilityObjTest); + + expect(rightValue).toBe('9999-12-31T00:00:00.000Z'); + }); + + it('should return the value when right value is not a date', () => { + visibilityObjTest.rightValue = '9999-99-99'; + let rightValue = service.getRightValue(formTest, visibilityObjTest); + + expect(rightValue).toBe('9999-99-99'); + }); + it('should retrieve the value for the right field when it is a form variable', () => { visibilityObjTest.rightFormFieldId = 'RIGHT_FORM_FIELD_ID'; let rightValue = service.getRightValue(fakeFormWithField, visibilityObjTest); From c0f57f2b550e918a33e33d788ea5ed6f1d8670e1 Mon Sep 17 00:00:00 2001 From: Vito Albano Date: Wed, 26 Oct 2016 10:42:58 +0100 Subject: [PATCH 7/7] Fixed test for peer review --- .../src/components/widgets/date/date.widget.spec.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts index 63763d3685..8b890fd6c9 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/date/date.widget.spec.ts @@ -154,12 +154,13 @@ describe('DateWidget', () => { it('should send field change event when a new date is picked from data picker', (done) => { let w = new DateWidget(null); spyOn(w, 'setupMaterialTextField').and.callThrough(); - w.field = new FormFieldModel(null, {type: 'date'}); + w.field = new FormFieldModel(null, {value: '9-9-9999', type: 'date'}); w.ngOnInit(); - w.datePicker.time = moment(); + w.datePicker.time = moment('9-9-9999', w.DATE_FORMAT); w.fieldChanged.subscribe((field) => { expect(field).toBeDefined(); expect(field).not.toBeNull(); + expect(field.value).toEqual('9-9-9999'); done(); }); w.onDateSelected(); @@ -168,12 +169,13 @@ describe('DateWidget', () => { it('should send field change event when date is changed in input text', (done) => { let w = new DateWidget(null); spyOn(w, 'setupMaterialTextField').and.callThrough(); - w.field = new FormFieldModel(null, {type: 'date'}); + w.field = new FormFieldModel(null, {value: '9-9-9999', type: 'date'}); w.ngOnInit(); - w.datePicker.time = moment(); + w.datePicker.time = moment('9-9-9999', w.DATE_FORMAT); w.fieldChanged.subscribe((field) => { expect(field).toBeDefined(); expect(field).not.toBeNull(); + expect(field.value).toEqual('9-9-9999'); done(); });