Skip to content
Snippets Groups Projects
Select Git revision
  • 3b8b62a8d6d9b8a218d1eae9b674e2480639f6fb
  • main default protected
  • OZG-7967-rename-admin
  • OZG-8271-fix-date-bug
  • OZG-7985-Statistik-Datenfreigabe
  • OZG-7970-AlfaCodeFlow
  • OZG-7856_schadcode_scanner
  • OZG-8305-Create-webpack-sbom
  • tooltip-improvements
  • ods-remove-class-inputs
  • release-info
  • release-administration
  • release
  • OZG-7714-UpgradeKeycloakDependencyTo25
  • OZG-8086-Admin-Datenanfrage-erstellen
  • OZG-8086-Datenanfrage-Umbenennung
  • mongodb-7-0-16-e2e
  • OZG-6220-Bescheid-speichern-ohne-Postfach
  • OZG-7922-KeycloakOperatorExceptions
  • OZG-8142-poc-cards
  • OZG-8086-E2E
  • 1.11.0-info
  • 1.11.0-administration
  • 2.26.0-alfa
  • 1.10.0-info
  • 1.10.0-administration
  • 2.25.0-alfa
  • 1.9.0-info
  • 1.9.0-administration
  • 2.24.0-alfa
  • 1.8.0-info
  • 1.8.0-administration
  • 2.23.0-alfa
  • 1.7.0-info
  • 1.7.0-administration
  • 2.22.0-alfa
  • 1.6.0-info
  • 1.6.0-administration
  • 2.21.0-alfa
  • 1.5.0-info
  • 1.5.0-administration
41 results

index.ts

Blame
  • keycloak.resource.service.spec.ts 7.76 KiB
    /*
     * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
     * Ministerpräsidenten des Landes Schleswig-Holstein
     * Staatskanzlei
     * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
     *
     * Lizenziert unter der EUPL, Version 1.2 oder - sobald
     * diese von der Europäischen Kommission genehmigt wurden -
     * Folgeversionen der EUPL ("Lizenz");
     * Sie dürfen dieses Werk ausschließlich gemäß
     * dieser Lizenz nutzen.
     * Eine Kopie der Lizenz finden Sie hier:
     *
     * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
     *
     * Sofern nicht durch anwendbare Rechtsvorschriften
     * gefordert oder in schriftlicher Form vereinbart, wird
     * die unter der Lizenz verbreitete Software "so wie sie
     * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
     * ausdrücklich oder stillschweigend - verbreitet.
     * Die sprachspezifischen Genehmigungen und Beschränkungen
     * unter der Lizenz sind dem Lizenztext zu entnehmen.
     */
    import { TestBed, fakeAsync, tick } from '@angular/core/testing';
    import { faker } from '@faker-js/faker';
    import { cold } from 'jest-marbles';
    import { StateResource, createEmptyStateResource, createStateResource } from 'libs/tech-shared/src/lib/resource/resource.util';
    import { Dummy, createDummy } from 'libs/tech-shared/test/dummy';
    import { singleCold } from 'libs/tech-shared/test/marbles';
    import { Observable, of } from 'rxjs';
    import { KeycloakResourceService } from './keycloak.resource.service';
    
    import * as ResourceUtil from 'libs/tech-shared/src/lib/resource/resource.util';
    
    describe('KeycloakResourceService', () => {
      let service: KeycloakResourceService<unknown>;
    
      const id: string = faker.word.sample();
      const emptyStateResource: StateResource<unknown[]> = createEmptyStateResource<unknown[]>();
      const dummyObject: Dummy = createDummy();
      const dummyAction: Observable<Dummy> = of(dummyObject);
    
      beforeEach(() => {
        TestBed.configureTestingModule({
          providers: [TestResourceService],
        });
    
        service = TestBed.inject(TestResourceService);
      });
    
      describe('getAll', () => {
        const stateResource: StateResource<unknown> = createStateResource([]);
    
        beforeEach(() => {
          service.handleChanges = jest.fn().mockReturnValue(singleCold(stateResource));
        });
    
        it('should return stateResource', () => {
          const stateResource$: Observable<StateResource<unknown[]>> = service.getAll();
    
          expect(stateResource$).toBeObservable(singleCold(stateResource));
        });
    
        it('should call handleChanges ', fakeAsync(() => {
          service.getAll().subscribe();
    
          expect(service.handleChanges).toHaveBeenCalled();
        }));
      });
    
      describe('handleChanges', () => {
        let doIfLoadingRequiredSpy: jest.SpyInstance<boolean>;
    
        beforeEach(() => {
          doIfLoadingRequiredSpy = jest.spyOn(ResourceUtil, 'doIfLoadingRequired').mockImplementation();
        });
    
        it('should call doIfLoadingRequired', () => {
          service.handleChanges(emptyStateResource);
    
          expect(doIfLoadingRequiredSpy).toHaveBeenCalled();
        });
    
        it('should return stateResource', (done) => {
          service.stateResource.next(createStateResource([]));
    
          service.handleChanges(emptyStateResource).subscribe((stateResource: StateResource<[]>) => {
            expect(stateResource).toEqual(createStateResource([]));
            done();
          });
        });
      });
    
      describe('loadResource', () => {
        it('should call set loading', () => {
          service.setLoading = jest.fn();
    
          service.loadResource();
    
          expect(service.setLoading).toHaveBeenCalled();
        });
    
        it('should update Resource', fakeAsync(() => {
          const dummyItems = [createDummy(), createDummy()];
          jest.spyOn(service, '_getItemsFromKeycloak' as any).mockReturnValue(of(dummyItems));
    
          service.loadResource();
          tick();
    
          expect(service.stateResource.value.resource).toEqual(dummyItems);
        }));
      });
    
      describe('create', () => {
        const saveObject: Dummy = createDummy();
    
        it('should call handleLoading', () => {
          service.handleLoading = jest.fn();
    
          service.create(saveObject);
    
          expect(service.handleLoading).toHaveBeenCalled();
        });
    
        it('should call createInKeycloak', () => {
          const createInKeycloakSpy: jest.SpyInstance = jest.spyOn(service, '_createInKeycloak' as any).mockReturnValue(of({}));
    
          service.create(saveObject);
    
          expect(createInKeycloakSpy).toHaveBeenCalled();
        });
      });
    
      describe('save', () => {
        it('should call handleLoading', () => {
          service.handleLoading = jest.fn();
    
          service.save(dummyObject);
    
          expect(service.handleLoading).toHaveBeenCalled();
        });
    
        it('should call createInKeycloak', () => {
          const saveInKeycloakSpy: jest.SpyInstance = jest.spyOn(service, '_saveInKeycloak' as any).mockReturnValue(of({}));
    
          service.save(dummyObject);
    
          expect(saveInKeycloakSpy).toHaveBeenCalled();
        });
      });
    
      describe('delete', () => {
        it('should call handleLoading', () => {
          service.handleLoading = jest.fn();
    
          service.delete(id);
    
          expect(service.handleLoading).toHaveBeenCalled();
        });
    
        it('should call createInKeycloak', () => {
          const saveInKeycloakSpy: jest.SpyInstance = jest.spyOn(service, '_saveInKeycloak' as any).mockReturnValue(of({}));
    
          service.save(id);
    
          expect(saveInKeycloakSpy).toHaveBeenCalled();
        });
      });
    
      describe('handleLoading', () => {
        it('should call refreshAfterFirstEmit', () => {
          service.refreshAfterFirstEmit = jest.fn().mockReturnValue(dummyAction);
    
          service.handleLoading(dummyAction);
    
          expect(service.refreshAfterFirstEmit).toHaveBeenCalled();
        });
    
        it('should call progress', () => {
          service.setLoadingInStateResource = jest.fn().mockReturnValue(dummyAction);
    
          service.handleLoading(dummyAction);
    
          expect(service.setLoadingInStateResource).toHaveBeenCalled();
        });
      });
    
      describe('refreshAfterFirstEmit', () => {
        it('should call refresh after first emit', fakeAsync(() => {
          service.refresh = jest.fn();
    
          service.refreshAfterFirstEmit(dummyAction).subscribe();
          tick();
    
          expect(service.refresh).toHaveBeenCalled();
        }));
      });
    
      describe('setLoadingInStateResource', () => {
        it('should emit emptyState first with loading and then state without loading', () => {
          const result: Observable<StateResource<Dummy>> = service.setLoadingInStateResource<Dummy>(cold('--x', { x: dummyObject }));
    
          expect(result).toBeObservable(cold('a-b', { a: createEmptyStateResource(true), b: createStateResource(dummyObject) }));
        });
      });
    
      describe('setLoading', () => {
        it('should set loading in state to true without parameter', () => {
          service.stateResource.value.loading = false;
    
          service.setLoading();
    
          expect(service.stateResource.value.loading).toEqual(true);
        });
      });
    
      describe('refresh', () => {
        it('should set reload in state to true', () => {
          service.refresh();
    
          expect(service.stateResource.value.reload).toBe(true);
        });
    
        it('should clear resource in state', () => {
          service.refresh();
    
          expect(service.stateResource.value.resource).toEqual([]);
        });
      });
    
      describe('select resource', () => {
        it('should return state resource', () => {
          const stateResource = createEmptyStateResource<unknown[]>();
          service.stateResource.next(stateResource);
    
          const resource$: Observable<StateResource<unknown[]>> = service.selectResource();
    
          expect(resource$).toBeObservable(singleCold(stateResource));
        });
      });
    });
    
    class TestResourceService extends KeycloakResourceService<unknown> {
      _getItemsFromKeycloak(): Observable<unknown[]> {
        return of(null);
      }
    
      _saveInKeycloak(): Observable<void> {
        return of(null);
      }
    
      _createInKeycloak(): Observable<void> {
        return of(null);
      }
    
      _deleteInKeycloak(): Observable<void> {
        return of(null);
      }
    }