diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html index 5dc954e2c97ce3b5bc3cef43b0cee24532dc987c..15147aaf6e7a835c2392340bb18c2d02c9d80f88 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.html @@ -1,7 +1,10 @@ <h1 class="heading-1 pb-4">Organisationseinheiten</h1> -<admin-organisationseinheit-list - *ngIf="organisationsEinheitResources$ | async as organisationsEinheitResources" - [organisationsEinheitResources]="organisationsEinheitResources" - data-test-id="organisations-einheit-list" -/> +<ng-container *ngIf="organisationsEinheitListStateResource$ | async as organisationsEinheitListStateResource"> + <ozgcloud-spinner [stateResource]="organisationsEinheitListStateResource"> + <admin-organisationseinheit-list + [organisationsEinheitResources]="organisationsEinheitListStateResource.resource | toEmbeddedResources: OrganisationsEinheitListLinkRel.LIST" + data-test-id="organisations-einheit-list" + /> + </ozgcloud-spinner> +</ng-container> diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts index 43ee626c39887b1f882a4b5af5d23619171a0a63..4df2de4c73425c2807d46e7d01d53d4839eb34af 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.spec.ts @@ -1,38 +1,47 @@ -import { AdminOrganisationsEinheitResource, OrganisationsEinheitContainerComponent } from '@admin-client/admin-settings'; -import { createStateResource } from '@alfa-client/tech-shared'; -import { Mock, existsAsHtmlElement, mock } from '@alfa-client/test-utils'; +import { AdminOrganisationsEinheitListResource, OrganisationsEinheitContainerComponent } from '@admin-client/admin-settings'; +import { StateResource, ToEmbeddedResourcesPipe, createStateResource } from '@alfa-client/tech-shared'; +import { Mock, existsAsHtmlElement, getMockComponent, mock } from '@alfa-client/test-utils'; +import { SpinnerComponent } from '@alfa-client/ui'; +import { OrganisationsEinheitListResource } from '@alfa-client/zustaendige-stelle-shared'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ButtonWithSpinnerComponent } from '@ods/component'; import { MockComponent } from 'ng-mocks'; -import { Observable, of } from 'rxjs'; +import { of } from 'rxjs'; import { getDataTestIdOf } from '../../../../../../tech-shared/test/data-test'; -import { - createAdminOrganisationsEinheitListResource, - createAdminOrganisationsEinheitResource, -} from '../../../../test/organisations-einheit/organisations-einheit'; +import { createAdminOrganisationsEinheitListResource } from '../../../../test/organisations-einheit/organisations-einheit'; import { OrganisationsEinheitService } from '../organisationseinheit.service'; import { OrganisationsEinheitListComponent } from './organisationseinheit-list/organisationseinheit-list.component'; describe('OrganisationsEinheitContainerComponent', () => { let component: OrganisationsEinheitContainerComponent; let fixture: ComponentFixture<OrganisationsEinheitContainerComponent>; + let organisationsEinheitService: Mock<OrganisationsEinheitService>; - const organisationsEinheitService: Mock<OrganisationsEinheitService> = mock(OrganisationsEinheitService); + const organisationsEinheitListStateResource: StateResource<AdminOrganisationsEinheitListResource> = createStateResource( + createAdminOrganisationsEinheitListResource(), + ); + + const listSelector: string = getDataTestIdOf('organisations-einheit-list'); beforeEach(async () => { + organisationsEinheitService = { + ...mock(OrganisationsEinheitService), + getList: jest.fn().mockReturnValue(of(organisationsEinheitListStateResource)), + }; + await TestBed.configureTestingModule({ - declarations: [OrganisationsEinheitContainerComponent, MockComponent(OrganisationsEinheitListComponent)], + declarations: [ + OrganisationsEinheitContainerComponent, + MockComponent(OrganisationsEinheitListComponent), + MockComponent(SpinnerComponent), + ToEmbeddedResourcesPipe, + ], imports: [ButtonWithSpinnerComponent], providers: [{ provide: OrganisationsEinheitService, useValue: organisationsEinheitService }], }).compileComponents(); fixture = TestBed.createComponent(OrganisationsEinheitContainerComponent); component = fixture.componentInstance; - - organisationsEinheitService.getList = jest - .fn() - .mockReturnValue(of(createStateResource(createAdminOrganisationsEinheitListResource()))); - fixture.detectChanges(); }); @@ -42,49 +51,37 @@ describe('OrganisationsEinheitContainerComponent', () => { describe('component', () => { describe('ngOnInit', () => { - beforeEach(() => { - component.loadOrganisationsEinheitResources = jest.fn().mockReturnValue(of([createAdminOrganisationsEinheitResource()])); - }); + it('should call organisationsEinheitService getList', (done) => { + component.ngOnInit(); - it('should call loadOrganisationsEinheitResources', () => { - component.organisationsEinheitResources$.subscribe(() => { - expect(component.loadOrganisationsEinheitResources).toHaveBeenCalled(); + component.organisationsEinheitListStateResource$.subscribe(() => { + expect(organisationsEinheitService.getList).toHaveBeenCalled(); + done(); }); }); - it('should set organisationsEinheitResources', () => { + it('should set organisationsEinheitListStateResource$', (done) => { component.ngOnInit(); - component.organisationsEinheitResources$.subscribe( - (organisationsEinheitResources: AdminOrganisationsEinheitResource[]) => { - expect(organisationsEinheitResources.length).toBe(1); + component.organisationsEinheitListStateResource$.subscribe( + (listStateResource: StateResource<OrganisationsEinheitListResource>) => { + expect(listStateResource).toBe(organisationsEinheitListStateResource); + done(); }, ); }); }); - - describe('loadOrganisationsEinheitResources', () => { - it('should call organisationsEinheitService getList', () => { - component.loadOrganisationsEinheitResources(); - - expect(organisationsEinheitService.getList).toHaveBeenCalled(); - }); - - it('should set organisationsEinheitResources', () => { - const organisationsEinheitResources$: Observable<AdminOrganisationsEinheitResource[]> = - component.loadOrganisationsEinheitResources(); - - organisationsEinheitResources$.subscribe((organisationsEinheitResources: AdminOrganisationsEinheitResource[]) => { - expect(organisationsEinheitResources.length).toBe(1); - }); - }); - }); }); describe('template', () => { describe('organisationsEinheiten list', () => { it('should show list', () => { - existsAsHtmlElement(fixture, getDataTestIdOf('organisations-einheit-list')); + existsAsHtmlElement(fixture, listSelector); + }); + + it('should have organisationsEinheitResources', () => { + const listComponent: OrganisationsEinheitListComponent = getMockComponent(fixture, OrganisationsEinheitListComponent); + expect(listComponent.organisationsEinheitResources).toBeTruthy(); }); }); }); diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts index ce5610b8b2d295c591265cc930f96f4b5c1684a4..eaa53e7accd8d8f1a27c8ed39dd64e47b5c94ce9 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-container.component.ts @@ -1,8 +1,8 @@ -import { getEmbeddedResources, StateResource } from '@alfa-client/tech-shared'; +import { StateResource } from '@alfa-client/tech-shared'; import { Component, OnInit } from '@angular/core'; -import { map, Observable } from 'rxjs'; +import { Observable } from 'rxjs'; import { OrganisationsEinheitListLinkRel } from '../organisations-einheit.linkrel'; -import { AdminOrganisationsEinheitListResource, AdminOrganisationsEinheitResource } from '../organisations-einheit.model'; +import { AdminOrganisationsEinheitListResource } from '../organisations-einheit.model'; import { OrganisationsEinheitService } from '../organisationseinheit.service'; @Component({ @@ -10,24 +10,13 @@ import { OrganisationsEinheitService } from '../organisationseinheit.service'; templateUrl: './organisationseinheit-container.component.html', }) export class OrganisationsEinheitContainerComponent implements OnInit { - organisationsEinheitResources$: Observable<AdminOrganisationsEinheitResource[]>; + organisationsEinheitListStateResource$: Observable<StateResource<AdminOrganisationsEinheitListResource>>; + + public readonly OrganisationsEinheitListLinkRel = OrganisationsEinheitListLinkRel; constructor(private organisationsEinheitService: OrganisationsEinheitService) {} ngOnInit(): void { - this.organisationsEinheitResources$ = this.loadOrganisationsEinheitResources(); - } - - loadOrganisationsEinheitResources(): Observable<AdminOrganisationsEinheitResource[]> { - return this.organisationsEinheitService - .getList() - .pipe( - map((organisationsEinheitListResource: StateResource<AdminOrganisationsEinheitListResource>) => - getEmbeddedResources<AdminOrganisationsEinheitResource>( - organisationsEinheitListResource, - OrganisationsEinheitListLinkRel.LIST, - ), - ), - ); + this.organisationsEinheitListStateResource$ = this.organisationsEinheitService.getList(); } } diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html index c15165d10d23dd9e1d9bbe53429b1c533d598fd5..4d7bb88c347ce810280f41d2202077cccf4e9062 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.html @@ -1,7 +1,7 @@ <ods-list *ngIf="organisationsEinheitResources.length > 0" data-test-id="organisations-einheit-list"> <ods-list-item *ngFor="let organisationsEinheitResource of organisationsEinheitResources" - [path]="getEncodedSelfLink(organisationsEinheitResource)" + [path]="organisationsEinheitResource | toResourceUri" [class.text-red-500]=" organisationsEinheitResource.syncResult === AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG || organisationsEinheitResource.syncResult === AdminOrganisationsEinheitSyncResult.ORGANISATIONSEINHEIT_ID_NOT_UNIQUE diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts index e39d5d9c2c40866380db9bf83538d04b5d7feace..1ed84ced8bdd0a6662cb17d9d227c1b3a2a46b31 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.spec.ts @@ -1,8 +1,9 @@ import { AdminOrganisationsEinheitResource, AdminOrganisationsEinheitSyncResult } from '@admin-client/admin-settings'; -import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; +import { ConvertForDataTestPipe, ToResourceUriPipe } from '@alfa-client/tech-shared'; import { existsAsHtmlElement, getElementFromFixture, + getElementFromFixtureByType, getElementsFromFixture, mock, notExistsAsHtmlElement, @@ -10,7 +11,6 @@ import { import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatTooltipModule } from '@angular/material/tooltip'; import { ActivatedRoute } from '@angular/router'; -import { ResourceUri } from '@ngxp/rest'; import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods/system'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockModule } from 'ng-mocks'; @@ -23,6 +23,13 @@ describe('OrganisationsEinheitListComponent', () => { const listSelector: string = getDataTestIdOf('organisations-einheit-list'); const listItemSelector: string = getDataTestIdOf('organisations-einheit-list-item'); + const organisationsEinheitNameSelector: string = getDataTestIdOf('organisations-einheit-name'); + const organisationsEinheitIdSelector: string = getDataTestIdOf('organisations-einheit-id'); + + const organisationsEinheitResource: AdminOrganisationsEinheitResource = { + ...createAdminOrganisationsEinheitResource(), + syncResult: AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG, + }; beforeEach(async () => { await TestBed.configureTestingModule({ @@ -32,7 +39,7 @@ describe('OrganisationsEinheitListComponent', () => { useValue: mock(ActivatedRoute), }, ], - declarations: [OrganisationsEinheitListComponent, ConvertForDataTestPipe, MockModule(MatTooltipModule)], + declarations: [OrganisationsEinheitListComponent, ConvertForDataTestPipe, ToResourceUriPipe, MockModule(MatTooltipModule)], imports: [ListComponent, ListItemComponent, ExclamationIconComponent], }).compileComponents(); @@ -47,32 +54,25 @@ describe('OrganisationsEinheitListComponent', () => { describe('input', () => { describe('organisationsEinheitResources', () => { - const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource( - AdminOrganisationsEinheitSyncResult.NOT_FOUND_IN_PVOG, - ); - beforeEach(() => { component.organisationsEinheitResources = [organisationsEinheitResource]; fixture.detectChanges(); }); it('should set organisationsEinheitResource name', () => { - const listItemElement: HTMLElement = getElementFromFixture(fixture, listItemSelector); - const nameElement: Element = listItemElement.querySelector('[data-test-id="organisations-einheit-name"]'); + const nameElement: HTMLElement = getElementFromFixture(fixture, organisationsEinheitNameSelector); expect(nameElement.textContent).toBe(organisationsEinheitResource.name); }); it('should set organisationsEinheitResource organisationsEinheitId', () => { - const listItemElement: HTMLElement = getElementFromFixture(fixture, listItemSelector); - const idElement: Element = listItemElement.querySelector('[data-test-id="organisations-einheit-id"]'); + const idElement: HTMLElement = getElementFromFixture(fixture, organisationsEinheitIdSelector); expect(idElement.textContent).toBe(organisationsEinheitResource.organisationsEinheitId); }); it('should set exclamation icon', () => { - const listItemElement: HTMLElement = getElementFromFixture(fixture, listItemSelector); - const iconElement: Element = listItemElement.querySelector('ods-exclamation-icon'); + const iconElement: ExclamationIconComponent = getElementFromFixtureByType(fixture, ExclamationIconComponent); expect(iconElement).toBeTruthy(); }); @@ -107,14 +107,6 @@ describe('OrganisationsEinheitListComponent', () => { expect(component.organisationsEinheitResources[2].isChild).toBeTruthy(); }); }); - describe('getEncodedSelfLink', () => { - it('should return encoded self link', () => { - const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource(); - const result: ResourceUri = component.getEncodedSelfLink(organisationsEinheitResource); - - expect(result).toBeDefined(); - }); - }); }); describe('template', () => { diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts index 9faaabdd00916cb80761e1833a2d9fbe03375add..51937dcb6d5bc30bec596b5514879c14fca79dcc 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-container/organisationseinheit-list/organisationseinheit-list.component.ts @@ -1,8 +1,5 @@ import { AdminOrganisationsEinheitResource, AdminOrganisationsEinheitSyncResult } from '@admin-client/admin-settings'; -import { encodeUrlForEmbedding } from '@alfa-client/tech-shared'; import { Component, Input } from '@angular/core'; -import { ResourceUri, getLink } from '@ngxp/rest'; -import { OrganisationsEinheitLinkRel } from '../../organisations-einheit.linkrel'; @Component({ selector: 'admin-organisationseinheit-list', @@ -23,7 +20,7 @@ export class OrganisationsEinheitListComponent { public readonly AdminOrganisationsEinheitSyncResult = AdminOrganisationsEinheitSyncResult; moveChildrenIntoParentLevel(list: AdminOrganisationsEinheitResource[]): void { - list.forEach((parent) => { + list.forEach((parent: AdminOrganisationsEinheitResource) => { this._organisationsEinheitResources.push(parent); if (parent._embedded && Array.isArray(parent._embedded.childList)) { @@ -34,9 +31,4 @@ export class OrganisationsEinheitListComponent { } }); } - - getEncodedSelfLink(organisationsEinheitResource: AdminOrganisationsEinheitResource): ResourceUri { - const resourceUri: ResourceUri = getLink(organisationsEinheitResource, OrganisationsEinheitLinkRel.SELF).href; - return encodeUrlForEmbedding(resourceUri); - } } diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html index f31e92e3c557900090fce127c00d206ce8f19d51..097bae6dc28c04048164fcc07896dee8a37ff43f 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.html @@ -1,8 +1,10 @@ -<h1 class="heading-1" data-test-id="organisations-form-container-headline"> - {{ (organisationsEinheitStateResource$ | async)?.resource?.name }} -</h1> +<ng-container *ngIf="organisationsEinheitStateResource$ | async as organisationsEinheitStateResource"> + <ozgcloud-spinner [stateResource]="organisationsEinheitStateResource"> + <h1 class="heading-1" data-test-id="organisations-form-container-headline">{{ organisationsEinheitStateResource.resource?.name }}</h1> -<admin-organisationseinheit-form - [organisationsEinheitStateResource]="organisationsEinheitStateResource$ | async" - data-test-id="organisations-form" -/> \ No newline at end of file + <admin-organisationseinheit-form + [organisationsEinheitStateResource]="organisationsEinheitStateResource" + data-test-id="organisations-form" + /> + </ozgcloud-spinner> +</ng-container> \ No newline at end of file diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts index c0854bf5313ee7fc349c7049dc8f7befe498c869..cdb93ce6d6c9ff32ad146a4a7a19946faac2b84d 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.spec.ts @@ -1,6 +1,7 @@ import { AdminOrganisationsEinheitResource, OrganisationsEinheitFormContainerComponent } from '@admin-client/admin-settings'; import { StateResource, createStateResource } from '@alfa-client/tech-shared'; -import { Mock, existsAsHtmlElement, mock } from '@alfa-client/test-utils'; +import { Mock, existsAsHtmlElement, getElementFromFixture, getMockComponent, mock } from '@alfa-client/test-utils'; +import { SpinnerComponent } from '@alfa-client/ui'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; @@ -12,22 +13,32 @@ import { OrganisationsEinheitFormComponent } from './organisationseinheit-form/o describe('OrganisationsEinheitFormContainerComponent', () => { let component: OrganisationsEinheitFormContainerComponent; let fixture: ComponentFixture<OrganisationsEinheitFormContainerComponent>; + let organisationsEinheitService: Mock<OrganisationsEinheitService>; - const organisationsEinheitService: Mock<OrganisationsEinheitService> = mock(OrganisationsEinheitService); + const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource(); + const organisationsEinheitStateResource: StateResource<AdminOrganisationsEinheitResource> = + createStateResource(organisationsEinheitResource); - const organisationsEinheitStateResource = createStateResource(createAdminOrganisationsEinheitResource()); + const headlineSelector: string = getDataTestIdOf('organisations-form-container-headline'); + const formSelector: string = getDataTestIdOf('organisations-form'); beforeEach(async () => { + organisationsEinheitService = { + ...mock(OrganisationsEinheitService), + get: jest.fn().mockReturnValue(of(organisationsEinheitStateResource)), + }; + await TestBed.configureTestingModule({ - declarations: [OrganisationsEinheitFormContainerComponent, MockComponent(OrganisationsEinheitFormComponent)], + declarations: [ + OrganisationsEinheitFormContainerComponent, + MockComponent(OrganisationsEinheitFormComponent), + MockComponent(SpinnerComponent), + ], providers: [{ provide: OrganisationsEinheitService, useValue: organisationsEinheitService }], }).compileComponents(); fixture = TestBed.createComponent(OrganisationsEinheitFormContainerComponent); component = fixture.componentInstance; - - organisationsEinheitService.get = jest.fn().mockReturnValue(of(organisationsEinheitStateResource)); - fixture.detectChanges(); }); @@ -37,20 +48,22 @@ describe('OrganisationsEinheitFormContainerComponent', () => { describe('component', () => { describe('ngOnInit', () => { - it('should call organisationsEinheitService get', () => { + it('should call organisationsEinheitService get', (done) => { component.ngOnInit(); component.organisationsEinheitStateResource$.subscribe(() => { expect(organisationsEinheitService.get).toHaveBeenCalled(); + done(); }); }); - it('should set organisationsEinheitStateResource', () => { + it('should set organisationsEinheitStateResource', (done) => { component.ngOnInit(); component.organisationsEinheitStateResource$.subscribe( (organisationsEinheitStateResource: StateResource<AdminOrganisationsEinheitResource>) => { expect(organisationsEinheitStateResource).toEqual(organisationsEinheitStateResource); + done(); }, ); }); @@ -59,14 +72,25 @@ describe('OrganisationsEinheitFormContainerComponent', () => { describe('template', () => { describe('headline', () => { + it('should show headline', () => { + existsAsHtmlElement(fixture, headlineSelector); + }); + it('should show organisationsEinheit name', () => { - existsAsHtmlElement(fixture, getDataTestIdOf('organisations-form-container-headline')); + const headlineElement: HTMLElement = getElementFromFixture(fixture, headlineSelector); + + expect(headlineElement.textContent).toBe(organisationsEinheitResource.name); }); }); describe('organisationsEinheit form', () => { - it('should show organisationsEinheit form', () => { - existsAsHtmlElement(fixture, getDataTestIdOf('organisations-form')); + it('should show form', () => { + existsAsHtmlElement(fixture, formSelector); + }); + + it('should have organisationsEinheitStateResource', () => { + const formComponent: OrganisationsEinheitFormComponent = getMockComponent(fixture, OrganisationsEinheitFormComponent); + expect(formComponent.organisationsEinheitStateResource).toBe(organisationsEinheitStateResource); }); }); }); diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts index cc46ee5d86126541187b2ebd9d41dce928d553e8..d643c74a04163010a590714a2f1d6d00640cf259 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form-container.component.ts @@ -1,6 +1,7 @@ import { StateResource } from '@alfa-client/tech-shared'; import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; +import { OrganisationsEinheitListLinkRel } from '../organisations-einheit.linkrel'; import { AdminOrganisationsEinheitResource } from '../organisations-einheit.model'; import { OrganisationsEinheitService } from '../organisationseinheit.service'; @@ -16,4 +17,6 @@ export class OrganisationsEinheitFormContainerComponent implements OnInit { ngOnInit(): void { this.organisationsEinheitStateResource$ = this.organisationsEinheitService.get(); } + + protected readonly OrganisationsEinheitListLinkRel = OrganisationsEinheitListLinkRel; } diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html index 3e8708c6939b72e0796be10b943baf18bc9cf892..3b1b1f0673cb2d42afa4b6d5a67a0fa14a3b0f1f 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.html @@ -9,7 +9,7 @@ ></ods-button-with-spinner> <span - *ngIf="formService.invalidEmpty" + *ngIf="formService.isInvalid()" data-test-id="invalid-empty-message-span" class="m-2 text-red-500" > diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts index 1976562c9a9fa7aa270e230278e4ce3093775503..ad4f7bd11d40c6444ba2fdbbc169cd0b81aff0f4 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-form.component.spec.ts @@ -19,10 +19,15 @@ describe('OrganisationsEinheitFormComponent', () => { let component: OrganisationsEinheitFormComponent; let fixture: ComponentFixture<OrganisationsEinheitFormComponent>; let formService: OrganisationsEinheitFormService; + let organisationsEinheitService: Mock<OrganisationsEinheitService>; - const organisationsEinheitService: Mock<OrganisationsEinheitService> = mock(OrganisationsEinheitService); + const signaturComponentSelector: string = getDataTestIdOf('organisations-einheit-signatur-component'); + const saveButtonSelector: string = getDataTestIdOf('save-button'); + const invalidMessageSpanSelector: string = getDataTestIdOf('invalid-empty-message-span'); beforeEach(async () => { + organisationsEinheitService = mock(OrganisationsEinheitService); + await TestBed.configureTestingModule({ declarations: [ OrganisationsEinheitFormComponent, @@ -47,15 +52,12 @@ describe('OrganisationsEinheitFormComponent', () => { describe('input', () => { describe('organisationsEinheitStateResource', () => { it('should return resource', () => { - const updateOrganisationsEinheitResourceFn: jest.SpyInstance = jest.spyOn( - component, - 'updateOrganisationsEinheitResource', - ); - const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource(); + component.updateOrganisationsEinheitResource = jest.fn(); + const organisationsEinheitResource: AdminOrganisationsEinheitResource = createAdminOrganisationsEinheitResource(); component.organisationsEinheitStateResource = createStateResource(organisationsEinheitResource); - expect(updateOrganisationsEinheitResourceFn).toHaveBeenCalledWith(organisationsEinheitResource); + expect(component.updateOrganisationsEinheitResource).toHaveBeenCalledWith(organisationsEinheitResource); }); }); }); @@ -87,20 +89,18 @@ describe('OrganisationsEinheitFormComponent', () => { describe('template', () => { describe('organisationsEinheit signatur component', () => { it('should show signatur component', () => { - existsAsHtmlElement(fixture, getDataTestIdOf('organisations-einheit-signatur-component')); + existsAsHtmlElement(fixture, signaturComponentSelector); }); }); describe('save button', () => { it('should show save button', () => { - existsAsHtmlElement(fixture, getDataTestIdOf('save-button')); + existsAsHtmlElement(fixture, saveButtonSelector); }); }); describe('invalid message', () => { - const invalidMessageSpan: string = getDataTestIdOf('invalid-empty-message-span'); - - it('should show if form invalidEmpty', () => { + it('should show if form is invalid', () => { const problemDetail: ProblemDetail = { ...createProblemDetail(), invalidParams: [{ ...createInvalidParam(), name: 'settingBody.signatur' }], @@ -109,11 +109,11 @@ describe('OrganisationsEinheitFormComponent', () => { fixture.detectChanges(); - existsAsHtmlElement(fixture, invalidMessageSpan); + existsAsHtmlElement(fixture, invalidMessageSpanSelector); }); it('should not show if form valid', () => { - notExistsAsHtmlElement(fixture, invalidMessageSpan); + notExistsAsHtmlElement(fixture, invalidMessageSpanSelector); }); }); }); diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts index da98a3b87601a0830743d69fbe6ed99cb2325f1f..9f47fc9511c867a415ced0e677eb486c083a970c 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.spec.ts @@ -5,8 +5,8 @@ import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; import { EffectsModule } from '@ngrx/effects'; import { StoreModule } from '@ngrx/store'; import { TextareaEditorComponent } from '@ods/component'; -import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; +import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test'; import { OrganisationsEinheitService } from '../../../organisationseinheit.service'; import { OrganisationsEinheitFormService } from '../organisationseinheit.formservice'; import { OrganisationsEinheitSignaturComponent } from './organisationseinheit-signatur.component'; @@ -14,15 +14,13 @@ import { OrganisationsEinheitSignaturComponent } from './organisationseinheit-si describe('OrganisationsEinheitSignaturComponent', () => { let component: OrganisationsEinheitSignaturComponent; let fixture: ComponentFixture<OrganisationsEinheitSignaturComponent>; + let formService: OrganisationsEinheitFormService; - const formService: OrganisationsEinheitFormService = new OrganisationsEinheitFormService( - new FormBuilder(), - useFromMock(mock(OrganisationsEinheitService)), - ); - - const signaturTextarea = getDataTestIdOf('signatur-text'); + const signaturTextareaSelector: string = getDataTestIdOf('signatur-text'); beforeEach(async () => { + formService = new OrganisationsEinheitFormService(new FormBuilder(), useFromMock(mock(OrganisationsEinheitService))); + await TestBed.configureTestingModule({ imports: [ReactiveFormsModule, NavigationSharedModule, StoreModule.forRoot({}), EffectsModule.forRoot([])], declarations: [OrganisationsEinheitSignaturComponent, MockComponent(TextareaEditorComponent)], @@ -47,7 +45,7 @@ describe('OrganisationsEinheitSignaturComponent', () => { describe('ods-textarea-editor', () => { describe('input', () => { it('should set signatur field', () => { - const textAreaEditor = getElementFromFixture(fixture, signaturTextarea); + const textAreaEditor: HTMLElement = getElementFromFixture(fixture, signaturTextareaSelector); expect(textAreaEditor.getAttribute('rows')).toEqual('6'); }); diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts index 112353d7b5cf1a613f3f81fd77662b7b11c8a2c0..ad670e03d75622a851b7de1bfe7b9ceb18cefce7 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit-signatur/organisationseinheit-signatur.component.ts @@ -6,7 +6,7 @@ import { OrganisationsEinheitFormService } from '../organisationseinheit.formser templateUrl: './organisationseinheit-signatur.component.html', }) export class OrganisationsEinheitSignaturComponent { - protected readonly formServiceClass = OrganisationsEinheitFormService; + public readonly formServiceClass = OrganisationsEinheitFormService; constructor(public formService: OrganisationsEinheitFormService) {} } diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts index 82beca0dfb6fd1cb9210090f7a11cac3c2b497eb..9cb9131e6259cf12b596db1438224396abd952ae 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit-form-container/organisationseinheit-form/organisationseinheit.formservice.ts @@ -29,8 +29,4 @@ export class OrganisationsEinheitFormService extends AbstractFormService { protected getPathPrefix(): string { return 'settingBody'; } - - public get invalidEmpty(): boolean { - return this.form.invalid; - } } diff --git a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts index 77d2d39309893316e9a99db8d6e6796fcd1a9d05..ad3de85839043a279b9692d3ece0593d83602bb3 100644 --- a/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts +++ b/alfa-client/libs/admin/settings/src/lib/organisationseinheit/organisationseinheit.service.spec.ts @@ -55,11 +55,11 @@ describe('OrganisationsEinheitService', () => { }); it('should call getOrganisationsEinheitUrl', () => { - (<any>service).getOrganisationsEinheitUrl = jest.fn(); + service.getOrganisationsEinheitUrl = jest.fn(); service.onNavigation({ [OrganisationsEinheitService.ORGANISATIONS_EINHEIT_URL]: 'some-uri' }); - expect((<any>service).getOrganisationsEinheitUrl).toHaveBeenCalled(); + expect(service.getOrganisationsEinheitUrl).toHaveBeenCalled(); }); }); diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html index a5aace656e46f148670b719e35a52d23df73ec4b..23447820822d57bfca778a3b4f870bb4e1780a52 100644 --- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html +++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.html @@ -45,7 +45,7 @@ ></ods-button-with-spinner> <span - *ngIf="formService.invalidEmpty" + *ngIf="formService.isInvalid()" data-test-id="invalid-empty-message-span" class="m-2 text-red-500" > diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts index 3470d76a49844b39ea90737b2474d95c76ff5a2c..8c8096d7df647918130510a8ac0fad54499064f7 100644 --- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts +++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach-form.component.spec.ts @@ -1,15 +1,5 @@ -import { - createEmptyStateResource, - createStateResource, - ProblemDetail, -} from '@alfa-client/tech-shared'; -import { - dispatchEventFromFixture, - existsAsHtmlElement, - Mock, - mock, - notExistsAsHtmlElement, -} from '@alfa-client/test-utils'; +import { createEmptyStateResource, createStateResource, ProblemDetail } from '@alfa-client/tech-shared'; +import { dispatchEventFromFixture, existsAsHtmlElement, Mock, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ButtonWithSpinnerComponent } from '@ods/component'; @@ -67,15 +57,12 @@ describe('PostfachFormComponent', () => { describe('set postfachStateResource', () => { it('should return resource', () => { - const updatePostfachResourceFn: jest.SpyInstance = jest.spyOn( - component, - 'updatePostfachResource', - ); - const postfachResource: PostfachResource = createPostfachResource(); + component.updatePostfachResource = jest.fn(); + const postfachResource: PostfachResource = createPostfachResource(); component.postfachStateResource = createStateResource(postfachResource); - expect(updatePostfachResourceFn).toHaveBeenCalledWith(postfachResource); + expect(component.updatePostfachResource).toHaveBeenCalledWith(postfachResource); }); }); @@ -152,7 +139,7 @@ describe('PostfachFormComponent', () => { }); describe('invalid message', () => { - it('should show if form invalidEmpty', () => { + it('should show if form is invalid', () => { formService.setErrorByProblemDetail(createProblemDetailForAbsenderName()); fixture.detectChanges(); diff --git a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts index ed81ff5fd52cfc3ef92312fd3f2d0cbbcb8d4d89..dd9bcc7a3732f8562aa596faa52b1b4b70407f26 100644 --- a/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts +++ b/alfa-client/libs/admin/settings/src/lib/postfach/postfach-container/postfach-form/postfach.formservice.ts @@ -46,17 +46,10 @@ export class PostfachFormService extends AbstractFormService { } private shouldSkipAbsender(postfach: Postfach): boolean { - return ( - isNil(this.source?.absender) && - Object.values(postfach.absender).every((v) => isNil(v) || v.length === 0) - ); + return isNil(this.source?.absender) && Object.values(postfach.absender).every((v) => isNil(v) || v.length === 0); } protected getPathPrefix(): string { return 'settingBody'; } - - public get invalidEmpty(): boolean { - return this.form.invalid; - } } diff --git a/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts b/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts index 600e815386e1d52dce43597b5187f1310a1be713..85ef561372b3ccf0231065f9210ca754f07aa7de 100644 --- a/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts +++ b/alfa-client/libs/admin/settings/test/organisations-einheit/organisations-einheit.ts @@ -9,22 +9,19 @@ import { } from '../../src'; import { OrganisationsEinheitListLinkRel } from '../../src/lib/organisationseinheit/organisations-einheit.linkrel'; -export function createAdminOrganisationsEinheit(syncResult?: AdminOrganisationsEinheitSyncResult): AdminOrganisationsEinheit { +export function createAdminOrganisationsEinheit(): AdminOrganisationsEinheit { return { name: faker.random.word(), organisationsEinheitId: faker.random.word(), - syncResult: syncResult ?? AdminOrganisationsEinheitSyncResult.OK, + syncResult: AdminOrganisationsEinheitSyncResult.OK, settings: { signatur: faker.random.words(5), }, }; } -export function createAdminOrganisationsEinheitResource( - syncResult?: AdminOrganisationsEinheitSyncResult, - linkRel: string[] = [], -): AdminOrganisationsEinheitResource { - return toResource(createAdminOrganisationsEinheit(syncResult), linkRel); +export function createAdminOrganisationsEinheitResource(linkRel: string[] = []): AdminOrganisationsEinheitResource { + return toResource(createAdminOrganisationsEinheit(), linkRel); } export function createAdminOrganisationsEinheitResources(linkRelations: string[] = []): AdminOrganisationsEinheitResource[] { diff --git a/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts index e608186534a4f3573d8a78a4fdda739926d7c7fb..e4421c2c22364a7a444d5796929194b2ca4bba61 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/api-resource.service.spec.ts @@ -1,11 +1,9 @@ import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { fakeAsync, tick } from '@angular/core/testing'; import { Resource } from '@ngxp/rest'; -import { Observable, of, throwError } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { singleCold, singleHot } from '../../../test//marbles'; -import { createProblemDetail } from '../../../test/error'; import { createDummyResource } from '../../../test/resource'; -import { ProblemDetail } from '../tech.model'; import { ApiResourceService } from './api-resource.service'; import { LinkRelationName, ResourceServiceConfig, SaveResourceData } from './resource.model'; import { ResourceRepository } from './resource.repository'; @@ -70,17 +68,6 @@ describe('ApiResourceService', () => { expect(saved).toBeObservable(singleCold(createStateResource(loadedResource))); }); - it('should call handleError', () => { - service.stateResource.next(createStateResource(createDummyResource([config.edit.linkRel]))); - const errorResponse: ProblemDetail = createProblemDetail(); - repository.save.mockReturnValue(throwError(() => errorResponse)); - service.handleError = jest.fn(); - - service.save(<any>{}).subscribe(); - - expect(service.handleError).toHaveBeenCalledWith(errorResponse); - }); - it('should update state resource subject', fakeAsync(() => { service.stateResource.next(createStateResource(resourceWithEditLinkRel)); repository.save.mockReturnValue(of(loadedResource)); @@ -122,17 +109,6 @@ describe('ApiResourceService', () => { expect(saved).toBeObservable(singleCold(createStateResource(loadedResource))); }); - it('should call handleError', () => { - service.stateResource.next(createStateResource(createDummyResource([config.edit.linkRel]))); - const errorResponse: ProblemDetail = createProblemDetail(); - repository.patch.mockReturnValue(throwError(() => errorResponse)); - service.handleError = jest.fn(); - - service.patch(<any>{}).subscribe(); - - expect(service.handleError).toHaveBeenCalledWith(errorResponse); - }); - it('should update state resource subject', fakeAsync(() => { service.stateResource.next(createStateResource(resourceWithEditLinkRel)); repository.patch.mockReturnValue(of(loadedResource)); diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts index 02abe975e853fe01912920f1bff836914c4779aa..1b5ea7e05416786b91861e5f79a247501076fed3 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts @@ -121,16 +121,16 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { public save(toSave: unknown): Observable<StateResource<T>> { const previousResource: T = this.stateResource.value.resource; - return this.doSave(previousResource, toSave).pipe( - tap((loadedResource: T) => this.stateResource.next(createStateResource(loadedResource))), - map(() => this.stateResource.value), - catchError((errorResponse: HttpErrorResponse) => this.handleError(errorResponse)), - ); + return this.handleSave(this.doSave(previousResource, toSave)); } public patch(toPatch: unknown): Observable<StateResource<T>> { const previousResource: T = this.stateResource.value.resource; - return this.doPatch(previousResource, toPatch).pipe( + return this.handleSave(this.doPatch(previousResource, toPatch)); + } + + private handleSave(response$: Observable<T>): Observable<StateResource<T>> { + return response$.pipe( tap((loadedResource: T) => this.stateResource.next(createStateResource(loadedResource))), map(() => this.stateResource.value), catchError((errorResponse: HttpErrorResponse) => this.handleError(errorResponse)), diff --git a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts index bff5f0c17ffa7ad22f1de49bd51e1a3bf2729939..d525b273f7de7b9f8e79b596c4ff58b128e23796 100644 --- a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.spec.ts @@ -164,6 +164,22 @@ describe('AbstractFormService', () => { expect(formService.form.reset).toHaveBeenCalled(); }); }); + + describe('isInvalid', () => { + it('should return false on valid state', () => { + const isInvalid: boolean = formService.isInvalid(); + + expect(isInvalid).toBeFalsy(); + }); + + it('should return true on invalid state', () => { + formService.form.controls[TestFormService.FIELD].setErrors({ required: true }); + + const isInvalid: boolean = formService.isInvalid(); + + expect(isInvalid).toBeTruthy(); + }); + }); }); class TestFormService extends AbstractFormService { diff --git a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts index ddbdfbd28daffd74b6637bd446373730f7111bec..e14057ca1213095531293412d81b4952f80e5e1d 100644 --- a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts +++ b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts @@ -102,4 +102,8 @@ export abstract class AbstractFormService<T extends Resource = Resource> { public reset(): void { this.form.reset(); } + + public isInvalid(): boolean { + return this.form.invalid; + } }