diff --git a/core/app/fields/boolean/templates/filter/boolean.component.spec.ts b/core/app/fields/boolean/templates/filter/boolean.component.spec.ts index 6105acc01..cee6953df 100644 --- a/core/app/fields/boolean/templates/filter/boolean.component.spec.ts +++ b/core/app/fields/boolean/templates/filter/boolean.component.spec.ts @@ -17,6 +17,7 @@ import {BrowserDynamicTestingModule} from '@angular/platform-browser-dynamic/tes import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; import {LanguageStore} from '@store/language/language.store'; import {languageStoreMock} from '@store/language/language.store.spec.mock'; +import {waitUntil} from '@app-common/testing/utils.spec'; @Component({ @@ -77,49 +78,35 @@ describe('BooleanFilterFieldComponent', () => { expect(testHostComponent).toBeTruthy(); }); - it('should have value', () => { + it('should have value', async (done) => { expect(testHostComponent).toBeTruthy(); - testHostComponent.field = { - type: 'boolean', - value: '1', - metadata: null, - definition: { - options: 'dom_int_bool' - }, - criteria: { - values: ['1'], - operator: '=' - }, - formControl: new FormControl('1') - }; - testHostFixture.detectChanges(); - testHostFixture.whenStable().then(() => { + const field = testHostFixture.nativeElement.getElementsByTagName('scrm-boolean-filter')[0]; - const field = testHostFixture.nativeElement.getElementsByTagName('scrm-boolean-filter')[0]; + expect(field).toBeTruthy(); - expect(field).toBeTruthy(); + await waitUntil(() => field.getElementsByTagName('tag-input').item(0)); - const tagInput = field.getElementsByTagName('tag-input').item(0); + const tagInput = field.getElementsByTagName('tag-input').item(0); - expect(tagInput).toBeTruthy(); + expect(tagInput).toBeTruthy(); - const tag = tagInput.getElementsByTagName('tag').item(0); + const tag = tagInput.getElementsByTagName('tag').item(0); - expect(tag).toBeTruthy(); + expect(tag).toBeTruthy(); - const tagText = tag.getElementsByClassName('tag__text').item(0); + const tagText = tag.getElementsByClassName('tag__text').item(0); - expect(tagText.textContent).toContain('Yes'); - expect(tagText.textContent).not.toContain('1'); + expect(tagText.textContent).toContain('Yes'); + expect(tagText.textContent).not.toContain('1'); - const deleteIcon = tagInput.getElementsByTagName('delete-icon').item(0); + const deleteIcon = tagInput.getElementsByTagName('delete-icon').item(0); - expect(deleteIcon).toBeTruthy(); + expect(deleteIcon).toBeTruthy(); - }); + done(); }); diff --git a/core/app/fields/dynamicenum/templates/edit/dynamicenum.component.spec.ts b/core/app/fields/dynamicenum/templates/edit/dynamicenum.component.spec.ts index c401c779a..b6e87c231 100644 --- a/core/app/fields/dynamicenum/templates/edit/dynamicenum.component.spec.ts +++ b/core/app/fields/dynamicenum/templates/edit/dynamicenum.component.spec.ts @@ -71,44 +71,33 @@ describe('DynamicEnumEditFieldComponent', () => { expect(testHostComponent).toBeTruthy(); }); - it('should have value', () => { + it('should have value', async (done) => { expect(testHostComponent).toBeTruthy(); - testHostComponent.field = { - type: 'dynamicenum', - value: '_customer', - metadata: null, - definition: { - options: 'account_type_dom' - } - }; - testHostFixture.detectChanges(); - testHostFixture.whenStable().then(() => { + await testHostFixture.whenRenderingDone(); + const field = testHostFixture.nativeElement.getElementsByTagName('scrm-dynamicenum-edit')[0]; - const field = testHostFixture.nativeElement.getElementsByTagName('scrm-dynamicenum-edit')[0]; + expect(field).toBeTruthy(); - expect(field).toBeTruthy(); + const tagInput = field.getElementsByTagName('tag-input').item(0); - const tagInput = field.getElementsByTagName('tag-input').item(0); + expect(tagInput).toBeTruthy(); - expect(tagInput).toBeTruthy(); + const tag = tagInput.getElementsByTagName('tag').item(0); - const tag = tagInput.getElementsByTagName('tag').item(0); + expect(tag).toBeTruthy(); - expect(tag).toBeTruthy(); + const tagText = tag.getElementsByClassName('tag__text').item(0); - const tagText = tag.getElementsByClassName('tag__text').item(0); + expect(tagText.textContent).toContain('Customer'); + expect(tagText.textContent).not.toContain('_customer'); - expect(tagText.textContent).toContain('Customer'); - expect(tagText.textContent).not.toContain('_customer'); + const deleteIcon = tagInput.getElementsByTagName('delete-icon').item(0); - const deleteIcon = tagInput.getElementsByTagName('delete-icon').item(0); - - expect(deleteIcon).toBeTruthy(); - - }); + expect(deleteIcon).toBeTruthy(); + done(); }); }); diff --git a/core/app/fields/enum/templates/edit/enum.component.spec.ts b/core/app/fields/enum/templates/edit/enum.component.spec.ts index 3b17e6b36..6016efacd 100644 --- a/core/app/fields/enum/templates/edit/enum.component.spec.ts +++ b/core/app/fields/enum/templates/edit/enum.component.spec.ts @@ -17,6 +17,7 @@ import {datetimeFormatterMock} from '@services/formatters/datetime/datetime-form import {DateFormatter} from '@services/formatters/datetime/date-formatter.service'; import {dateFormatterMock} from '@services/formatters/datetime/date-formatter.service.spec.mock'; import {CurrencyFormatter} from '@services/formatters/currency/currency-formatter.service'; +import {waitUntil} from '@app-common/testing/utils.spec'; @Component({ selector: 'enum-edit-field-test-host-component', @@ -71,148 +72,116 @@ describe('EnumEditFieldComponent', () => { expect(testHostComponent).toBeTruthy(); }); - it('should have value', () => { + it('should have value', async (done) => { expect(testHostComponent).toBeTruthy(); - testHostComponent.field = { - type: 'enum', - value: '_customer', - metadata: null, - definition: { - options: 'account_type_dom' - } - }; - testHostFixture.detectChanges(); - testHostFixture.whenStable().then(() => { + await testHostFixture.whenRenderingDone(); + const field = testHostFixture.nativeElement.getElementsByTagName('scrm-enum-edit')[0]; - const field = testHostFixture.nativeElement.getElementsByTagName('scrm-enum-edit')[0]; + expect(field).toBeTruthy(); - expect(field).toBeTruthy(); + const tagInput = field.getElementsByTagName('tag-input').item(0); - const tagInput = field.getElementsByTagName('tag-input').item(0); + expect(tagInput).toBeTruthy(); - expect(tagInput).toBeTruthy(); + const tag = tagInput.getElementsByTagName('tag').item(0); - const tag = tagInput.getElementsByTagName('tag').item(0); + expect(tag).toBeTruthy(); - expect(tag).toBeTruthy(); + const tagText = tag.getElementsByClassName('tag__text').item(0); - const tagText = tag.getElementsByClassName('tag__text').item(0); + expect(tagText.textContent).toContain('Customer'); + expect(tagText.textContent).not.toContain('_customer'); - expect(tagText.textContent).toContain('Customer'); - expect(tagText.textContent).not.toContain('_customer'); + const deleteIcon = tagInput.getElementsByTagName('delete-icon').item(0); - const deleteIcon = tagInput.getElementsByTagName('delete-icon').item(0); - - expect(deleteIcon).toBeTruthy(); - - }); + expect(deleteIcon).toBeTruthy(); + done(); }); - it('should allow removing value', () => { + it('should allow removing value', async (done) => { expect(testHostComponent).toBeTruthy(); const element = testHostFixture.nativeElement; - testHostComponent.field = { - type: 'enum', - value: '_customer', - metadata: null, - definition: { - options: 'account_type_dom' - } - }; + testHostFixture.detectChanges(); + await testHostFixture.whenRenderingDone(); + + const deleteIcon = element.getElementsByTagName('delete-icon').item(0); + + expect(deleteIcon).toBeTruthy(); + + deleteIcon.click(); testHostFixture.detectChanges(); - testHostFixture.whenStable().then(() => { + await testHostFixture.whenStable(); - const deleteIcon = element.getElementsByTagName('delete-icon').item(0); + const field = testHostFixture.nativeElement.getElementsByTagName('scrm-enum-edit')[0]; - expect(deleteIcon).toBeTruthy(); + expect(field).toBeTruthy(); - deleteIcon.click(); + await waitUntil(() => !field.getElementsByTagName('tag').item(0)); - testHostFixture.detectChanges(); - testHostFixture.whenRenderingDone().then(() => { - - const tag = element.getElementsByClassName('tag__text'); - - expect(tag).toBeTruthy(); - - expect(tag.length).toEqual(0); - }); - - }); + const tag = field.getElementsByTagName('tag'); + expect(tag).toBeTruthy(); + expect(tag.length).toEqual(0); + done(); }); - it('should allow adding value', () => { + it('should allow adding value', async (done) => { expect(testHostComponent).toBeTruthy(); const element = testHostFixture.nativeElement; - testHostComponent.field = { - type: 'enum', - value: '_customer', - metadata: null, - definition: { - options: 'account_type_dom' - } - }; + testHostFixture.detectChanges(); + await testHostFixture.whenRenderingDone(); + + const deleteIcon = element.getElementsByTagName('delete-icon').item(0); + + expect(deleteIcon).toBeTruthy(); + + deleteIcon.click(); testHostFixture.detectChanges(); - testHostFixture.whenStable().then(() => { + await testHostFixture.whenStable(); - const deleteIcon = element.getElementsByTagName('delete-icon').item(0); + const input = element.getElementsByTagName('tag-input-form').item(0); - expect(deleteIcon).toBeTruthy(); + input.click(); - deleteIcon.click(); + testHostFixture.detectChanges(); + await testHostFixture.whenStable(); - testHostFixture.detectChanges(); - testHostFixture.whenRenderingDone().then(() => { + const menu = document.getElementsByClassName('ng2-dropdown-menu').item(0); + const item = menu.getElementsByClassName('ng2-menu-item').item(0); - const input = element.getElementsByTagName('tag-input-form').item(0); + expect(menu).toBeTruthy(); + expect(item).toBeTruthy(); - input.click(); + item.parentElement.click(); - testHostFixture.detectChanges(); - testHostFixture.whenRenderingDone().then(() => { + testHostFixture.detectChanges(); + await testHostFixture.whenStable(); - const menu = window.document.getElementsByClassName('ng2-dropdown-menu').item(0); - const item = menu.getElementsByClassName('ng2-menu-item').item(0); + const tag = element.getElementsByTagName('tag').item(0); - expect(menu).toBeTruthy(); - expect(item).toBeTruthy(); + expect(tag).toBeTruthy(); - item.parentElement.click(); + const tagText = tag.getElementsByClassName('tag__text').item(0); - testHostFixture.detectChanges(); - testHostFixture.whenRenderingDone().then(() => { + expect(tagText.textContent).toContain('Customer'); + expect(tagText.textContent).not.toContain('_customer'); - const tag = element.getElementsByTagName('tag').item(0); + const newDeleteIcon = element.getElementsByTagName('delete-icon').item(0); - expect(tag).toBeTruthy(); + expect(newDeleteIcon).toBeTruthy(); - const tagText = tag.getElementsByClassName('tag__text').item(0); + done(); - expect(tagText.textContent).toContain('Customer'); - expect(tagText.textContent).not.toContain('_customer'); - - const newDeleteIcon = element.getElementsByTagName('delete-icon').item(0); - - expect(newDeleteIcon).toBeTruthy(); - - }); - - }); - - }); - - }); }); }); diff --git a/core/app/fields/multienum/templates/edit/multienum.component.spec.ts b/core/app/fields/multienum/templates/edit/multienum.component.spec.ts index e9bfa7525..879485b19 100644 --- a/core/app/fields/multienum/templates/edit/multienum.component.spec.ts +++ b/core/app/fields/multienum/templates/edit/multienum.component.spec.ts @@ -17,6 +17,7 @@ import {datetimeFormatterMock} from '@services/formatters/datetime/datetime-form import {DateFormatter} from '@services/formatters/datetime/date-formatter.service'; import {dateFormatterMock} from '@services/formatters/datetime/date-formatter.service.spec.mock'; import {CurrencyFormatter} from '@services/formatters/currency/currency-formatter.service'; +import {waitUntil} from '@app-common/testing/utils.spec'; @Component({ selector: 'multienum-edit-field-test-host-component', @@ -24,7 +25,7 @@ import {CurrencyFormatter} from '@services/formatters/currency/currency-formatte }) class MultiEnumEditFieldTestHostComponent { field: Field = { - type: 'enum', + type: 'multienum', value: null, valueList: [ '_customer', @@ -75,103 +76,73 @@ describe('MultiEnumEditFieldComponent', () => { expect(testHostComponent).toBeTruthy(); }); - it('should have value', () => { + it('should have value', async (done) => { expect(testHostComponent).toBeTruthy(); - testHostComponent.field = { - type: 'enum', - value: null, - valueList: [ - '_customer', - '_reseller' - ], - metadata: null, - definition: { - options: 'account_type_dom' - } - }; - testHostFixture.detectChanges(); - testHostFixture.whenStable().then(() => { + await testHostFixture.whenRenderingDone(); + const field = testHostFixture.nativeElement.getElementsByTagName('scrm-multienum-edit')[0]; - const field = testHostFixture.nativeElement.getElementsByTagName('scrm-multienum-edit')[0]; + expect(field).toBeTruthy(); - expect(field).toBeTruthy(); + const tagInput = field.getElementsByTagName('tag-input').item(0); - const tagInput = field.getElementsByTagName('tag-input').item(0); + expect(tagInput).toBeTruthy(); - expect(tagInput).toBeTruthy(); + const tag1 = tagInput.getElementsByTagName('tag').item(0); - const tag1 = tagInput.getElementsByTagName('tag').item(0); + expect(tag1).toBeTruthy(); - expect(tag1).toBeTruthy(); + const tagText1 = tag1.getElementsByClassName('tag__text').item(0); - const tagText1 = tag1.getElementsByClassName('tag__text').item(0); + expect(tagText1.textContent).toContain('Customer'); + expect(tagText1.textContent).not.toContain('_customer'); - expect(tagText1.textContent).toContain('Customer'); - expect(tagText1.textContent).not.toContain('_customer'); + const deleteIcon1 = tag1.getElementsByTagName('delete-icon').item(0); - const deleteIcon1 = tag1.getElementsByTagName('delete-icon').item(0); + expect(deleteIcon1).toBeTruthy(); - expect(deleteIcon1).toBeTruthy(); + const tag2 = tagInput.getElementsByTagName('tag').item(1); - const tag2 = tagInput.getElementsByTagName('tag').item(1); + expect(tag2).toBeTruthy(); - expect(tag2).toBeTruthy(); + const tagText2 = tag2.getElementsByClassName('tag__text').item(0); - const tagText2 = tag2.getElementsByClassName('tag__text').item(0); + expect(tagText2.textContent).toContain('Reseller'); + expect(tagText2.textContent).not.toContain('_reseller'); - expect(tagText2.textContent).toContain('Reseller'); - expect(tagText2.textContent).not.toContain('_reseller'); + const deleteIcon2 = tag1.getElementsByTagName('delete-icon').item(0); - const deleteIcon2 = tag1.getElementsByTagName('delete-icon').item(0); - - expect(deleteIcon2).toBeTruthy(); - - }); + expect(deleteIcon2).toBeTruthy(); + done(); }); - it('should allow removing value', () => { + it('should allow removing value', async (done) => { expect(testHostComponent).toBeTruthy(); + testHostFixture.detectChanges(); + await testHostFixture.whenRenderingDone(); + const element = testHostFixture.nativeElement; - testHostComponent.field = { - type: 'enum', - value: null, - valueList: [ - '_customer', - '_reseller' - ], - metadata: null, - definition: { - options: 'account_type_dom' - } - }; + await waitUntil(() => element.getElementsByTagName('delete-icon').item(0)); + + const deleteIcon = element.getElementsByTagName('delete-icon').item(0); + + expect(deleteIcon).toBeTruthy(); + + deleteIcon.click(); testHostFixture.detectChanges(); - testHostFixture.whenStable().then(() => { + await testHostFixture.whenRenderingDone(); - const deleteIcon = element.getElementsByTagName('delete-icon').item(0); - - expect(deleteIcon).toBeTruthy(); - - deleteIcon.click(); - - testHostFixture.detectChanges(); - testHostFixture.whenRenderingDone().then(() => { - - const tag = element.getElementsByClassName('tag__text'); - - expect(tag).toBeTruthy(); - - expect(tag.length).toEqual(1); - }); - - }); + const tag = element.getElementsByTagName('tag'); + expect(tag).toBeTruthy(); + expect(tag.length).toEqual(1); + done(); }); }); diff --git a/core/app/fields/multienum/templates/filter/multienum.component.spec.ts b/core/app/fields/multienum/templates/filter/multienum.component.spec.ts index 1208271ad..64002473d 100644 --- a/core/app/fields/multienum/templates/filter/multienum.component.spec.ts +++ b/core/app/fields/multienum/templates/filter/multienum.component.spec.ts @@ -26,7 +26,7 @@ import {dataTypeFormatterMock} from '@services/formatters/data-type.formatter.sp }) class MultiEnumFilterFieldTestHostComponent { field: Field = { - type: 'enum', + type: 'multienum', value: null, valueList: [ '_customer', @@ -82,5 +82,35 @@ describe('MultiEnumFilterFieldComponent', () => { expect(testHostComponent).toBeTruthy(); }); + it('should have value', async (done) => { + expect(testHostComponent).toBeTruthy(); + + testHostFixture.detectChanges(); + await testHostFixture.whenRenderingDone(); + + const field = testHostFixture.nativeElement.getElementsByTagName('scrm-multienum-filter')[0]; + + expect(field).toBeTruthy(); + + const tagInput = field.getElementsByTagName('tag-input').item(0); + + expect(tagInput).toBeTruthy(); + + const tag = tagInput.getElementsByTagName('tag').item(0); + + expect(tag).toBeTruthy(); + + const tagText = tag.getElementsByClassName('tag__text').item(0); + + expect(tagText.textContent).toContain('Customer'); + expect(tagText.textContent).not.toContain('_customer'); + + const deleteIcon = tagInput.getElementsByTagName('delete-icon').item(0); + + expect(deleteIcon).toBeTruthy(); + + done(); + }); + }); diff --git a/core/app/fields/relate/templates/edit/relate.component.spec.ts b/core/app/fields/relate/templates/edit/relate.component.spec.ts index fd1cce531..6abe18975 100644 --- a/core/app/fields/relate/templates/edit/relate.component.spec.ts +++ b/core/app/fields/relate/templates/edit/relate.component.spec.ts @@ -20,18 +20,9 @@ import {listStoreFactoryMock} from '@store/record-list/record-list.store.spec.mo import {BrowserDynamicTestingModule} from '@angular/platform-browser-dynamic/testing'; import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {RelateEditFieldModule} from '@fields/relate/templates/edit/relate.module'; -import {take} from 'rxjs/operators'; -import {interval} from 'rxjs'; import {ModuleNameMapper} from '@services/navigation/module-name-mapper/module-name-mapper.service'; import {moduleNameMapperMock} from '@services/navigation/module-name-mapper/module-name-mapper.service.spec.mock'; - -export const waitUntil = async (untilTruthy: Function): Promise => { - while (!untilTruthy()) { - await interval(25).pipe(take(1)).toPromise(); - } - // eslint-disable-next-line compat/compat - return Promise.resolve(true); -}; +import {waitUntil} from '@app-common/testing/utils.spec'; @Component({ selector: 'relate-edit-field-test-host-component', diff --git a/core/app/src/app-common/testing/utils.spec.ts b/core/app/src/app-common/testing/utils.spec.ts new file mode 100644 index 000000000..187974b3b --- /dev/null +++ b/core/app/src/app-common/testing/utils.spec.ts @@ -0,0 +1,10 @@ +import {take} from 'rxjs/operators'; +import {interval} from 'rxjs'; + +export const waitUntil = async (untilTruthy: Function): Promise => { + while (!untilTruthy()) { + await interval(25).pipe(take(1)).toPromise(); + } + // eslint-disable-next-line compat/compat + return Promise.resolve(true); +};