diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts index f6dfce08e009d031361edc19c27e3ac73f97b353..94f9f9636df31314f05d76cf815b5707d032be1c 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts @@ -30,7 +30,7 @@ import { StateResource, } from '@alfa-client/tech-shared'; import { Injectable } from '@angular/core'; -import { fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; +import { fakeAsync, TestBed, tick } from '@angular/core/testing'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, UrlSegment } from '@angular/router'; import { faker } from '@faker-js/faker/.'; @@ -225,24 +225,16 @@ describe('KeycloakFormService', () => { }); describe('on client validation error', () => { - it('should return empty state resource with loading first', () => { - service.form.setErrors({ dummy: 'dummy error' }); - - service.submit().subscribe((stateResource: StateResource<Dummy>) => { - expect(stateResource).toEqual(createEmptyStateResource(true)); - }); - }); - it('should return empty state resource withouth loading after delay', fakeAsync(() => { service.form.setErrors({ dummy: 'dummy error' }); - tick(200); - - service.submit().subscribe((stateResource: StateResource<Dummy>) => { - expect(stateResource).toEqual(createEmptyStateResource()); + const results: StateResource<unknown>[] = []; + service.submit().subscribe((value: StateResource<unknown>) => { + results.push(value); }); + tick(200); - flush(); + expect(results).toEqual([createEmptyStateResource(true), createEmptyStateResource()]); })); }); diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts index 28fd9f9cf9a415eded091ede9c85449e9be57824..c36e8fa65e00598ec42c2f5b86a6e92b7fbc04b6 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts @@ -22,6 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { + creatDelayedEmptyStateResource, createEmptyStateResource, InvalidParam, isLoaded, @@ -31,7 +32,7 @@ import { import { inject, Injectable } from '@angular/core'; import { FormBuilder, FormGroup } from '@angular/forms'; import { ActivatedRoute, UrlSegment } from '@angular/router'; -import { catchError, delay, first, Observable, of, startWith, tap } from 'rxjs'; +import { catchError, first, Observable, of, tap } from 'rxjs'; import { ValidationMessageCode } from '../../../../tech-shared/src/lib/validation/tech.validation.messages'; import * as FormUtil from './form.util'; import { ErrorRepresentation, KeycloakErrorMessage, KeycloakFieldName, KeycloakHttpErrorResponse } from './keycloak-error.model'; @@ -79,17 +80,13 @@ export abstract class KeycloakFormService<T> { public submit(): Observable<StateResource<T>> { if (this.form.invalid) { - return this.creatDelayedEmptyStateResource(); + return creatDelayedEmptyStateResource(); } return this._doSubmit().pipe( catchError((keycloakError: KeycloakHttpErrorResponse) => this._processResponseValidationErrors(keycloakError)), ); } - private creatDelayedEmptyStateResource(): Observable<StateResource<T>> { - return of(createEmptyStateResource<T>()).pipe(delay(200), startWith(createEmptyStateResource<T>(true))); - } - _processResponseValidationErrors(keycloakError: KeycloakHttpErrorResponse): Observable<StateResource<T>> { try { this._setValidationErrorsOnControls( diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts index 201e8100c1682cafdeb57d86521d0b60b99a7b36..40f4dabc86ec168497e92529e23a1800d1649179 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts @@ -23,6 +23,7 @@ */ import { getEmbeddedResource, getUrl, hasLink, Resource, ResourceUri } from '@ngxp/rest'; import { isEqual, isNil, isNull } from 'lodash-es'; +import { delay, Observable, of, startWith } from 'rxjs'; import { HttpError } from '../tech.model'; import { encodeUrlForEmbedding, isNotNull } from '../tech.util'; @@ -54,6 +55,10 @@ export function createErrorStateResource<T>(error: HttpError): StateResource<any return { ...createEmptyStateResource<T>(), error, loaded: true }; } +export function creatDelayedEmptyStateResource<T>(): Observable<StateResource<T>> { + return of(createEmptyStateResource<T>()).pipe(delay(200), startWith(createEmptyStateResource<T>(true))); +} + export function doIfLoadingRequired(stateResource: StateResource<any>, runable: () => void): boolean { if (isLoadingRequired(stateResource)) { runable();