Skip to content
Snippets Groups Projects
Select Git revision
  • OZG-8305-Create-webpack-sbom
  • OZG-8073-date-component
  • OZG-7985-Statistik-Datenfreigabe
  • main default protected
  • tooltip-improvements
  • OZG-6123-Vorgänge-aus-Suche-E2E
  • 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
  • OZG-8086-E2E2
  • OZG-8142-ProjectionStuff
  • 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
40 results

commands.ts

Blame
  • commands.ts 7.44 KiB
    /*
     * Copyright (C) 2022 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.
     */
    enum HttpMethod {
      POST = 'POST',
      GET = 'GET',
    }
    
    interface HttpHeader {
      [headerKey: string]: string;
    }
    
    const DATA_TEST_ID: string = 'data-test-id';
    const DATA_TEST_CLASS: string = 'data-test-class';
    
    const ACCES_TOKEN: string = 'access_token';
    const ID_TOKEN: string = 'id_token';
    
    enum Header {
      CONTENT_TYPE = 'Content-Type',
      AUTHORIZATION = 'Authorization',
    }
    
    const CYPRESS_CONFIG_BASE_URL: unknown = 'baseUrl';
    
    enum CypressEnv {
      KEYCLOAK_CLIENT = 'keycloakClient',
      KEYCLOAK_REALM = 'keycloakRealm',
      KEYCLOAK_URL = 'keycloakUrl',
      SEARCH = 'search',
      SMOCKER = 'smocker',
    }
    
    const CONTENT_TYPE_HEADER_VALUE: string = 'application/x-www-form-urlencoded';
    
    interface SearchIndex {
      vorgangId: string;
      vorgangName: string;
      vorgangNummer: string;
      createdAt: string;
      antragstellerName: string;
      antragstellerVorname: string;
      status: string;
      organisationseinheitenId: string;
      aktenzeichen: string;
      assignedTo: string;
      _class: string;
    }
    
    const SEARCH_INDEX_CLASS: string = 'de.ozgcloud.vorgang.common.search.IndexedVorgang';
    
    declare namespace Cypress {
      interface Chainable<Subject> {
        getTestElementWithOid(oid: string, ...args);
        getTestElement(selector: string, ...args);
        getTestElementWithClass(selector: string, ...args);
        findTestElementWithClass(selector: string, ...args);
        findElement(selector: string);
        login(user, password);
        logout();
        getUserInfo();
        addVorgangToSearchIndex(vorgang);
        removeAllDocumentsFromSearchIndex();
        addMockToSmocker(mock);
        resetSmocker();
      }
    }
    
    Cypress.Commands.add('getTestElement', (selector, ...args) => {
      return cy.get(`[${DATA_TEST_ID}~="${selector}"]`, ...args);
    });
    
    Cypress.Commands.add('getTestElementWithClass', (selector, ...args) => {
      return cy.get(`[${DATA_TEST_CLASS}="${selector}"]`, ...args);
    });
    
    Cypress.Commands.add('getTestElementWithOid', (oid, ...args) => {
      return cy.getTestElement(oid, ...args);
    });
    
    Cypress.Commands.add(
      'findTestElementWithClass',
      { prevSubject: true },
      (subject: any, selector) => {
        return subject.find(`[${DATA_TEST_CLASS}="${selector}"]`);
      },
    );
    
    Cypress.Commands.add('findElement', { prevSubject: true }, (subject: any, selector) => {
      return subject.find(selector);
    });
    
    Cypress.Commands.add('login', (user: string, password: string) => {
      cy.session(user, () => {
        cy.request(buildLoginRequest(user, password)).then((response) => handleLoginResponse(response));
      });
    });
    
    function buildLoginRequest(user: string, password: string): any {
      return {
        method: HttpMethod.POST,
        followRedirect: false,
        url: `${getKeycloakBaseRealmUrl()}/token`,
        headers: {
          [Header.CONTENT_TYPE]: CONTENT_TYPE_HEADER_VALUE,
        },
        body: buildLoginRequestBody(user, password),
      };
    }
    
    function buildLoginRequestBody(user: string, password: string): any {
      return {
        client_id: Cypress.env(CypressEnv.KEYCLOAK_CLIENT),
        username: user,
        password: password,
        grant_type: 'password',
        redirect_uri: Cypress.config(CYPRESS_CONFIG_BASE_URL),
        response_mode: 'fragment',
        response_type: 'code',
        scope: 'openid',
      };
    }
    
    function handleLoginResponse(response): void {
      const authorization: any = `bearer ${response.body.access_token}`;
      cy.visit('', authorization);
    
      window.sessionStorage.setItem(ACCES_TOKEN, response.body.access_token);
      window.sessionStorage.setItem(ID_TOKEN, response.body.id_token);
    
      cy.setCookie('XSRF-TOKEN', response.body.session_state);
    }
    
    Cypress.Commands.add('getUserInfo', () => {
      return cy.request({
        method: HttpMethod.GET,
        url: `${getKeycloakBaseRealmUrl()}/userinfo`,
        headers: {
          [Header.AUTHORIZATION]: `bearer ${window.sessionStorage.getItem(ACCES_TOKEN)}`,
        },
      });
    });
    
    Cypress.Commands.add('logout', () => {
      cy.request({
        method: HttpMethod.GET,
        url: `${getKeycloakBaseRealmUrl()}/logout`,
        headers: {
          [Header.CONTENT_TYPE]: CONTENT_TYPE_HEADER_VALUE,
        },
        body: {
          refresh_token: window.sessionStorage.getItem(ID_TOKEN),
        },
        failOnStatusCode: false,
      }).then(() => {
        window.sessionStorage.clear();
    
        cy.visit('');
      });
    });
    
    function getKeycloakBaseRealmUrl(): string {
      return `${Cypress.env(CypressEnv.KEYCLOAK_URL)}realms/${Cypress.env(CypressEnv.KEYCLOAK_REALM)}/protocol/openid-connect`;
    }
    
    Cypress.Commands.add('addVorgangToSearchIndex', (vorgang) => {
      cy.request({
        method: HttpMethod.POST,
        url: `${buildSearchIndexPostUrl()}/_doc/${vorgang._id.$oid}`,
        headers: buildAuthorizationHeader(),
        body: buildSearchIndexBody(vorgang),
      });
    });
    
    function buildSearchIndexBody(vorgang: any): SearchIndex {
      return {
        vorgangId: vorgang._id.$oid,
        vorgangName: vorgang.name,
        vorgangNummer: vorgang.nummer,
        createdAt: vorgang.createdAt.$date,
        antragstellerName: vorgang.eingangs[0].antragsteller.nachname,
        antragstellerVorname: vorgang.eingangs[0].antragsteller.vorname,
        status: vorgang.status,
        organisationseinheitenId: vorgang.eingangs[0].zustaendigeStelle.organisationseinheitenId,
        aktenzeichen: vorgang.aktenzeichen,
        assignedTo: vorgang.assignedTo,
        _class: SEARCH_INDEX_CLASS,
      };
    }
    
    Cypress.Commands.add('removeAllDocumentsFromSearchIndex', () => {
      cy.request({
        method: HttpMethod.POST,
        url: `${buildSearchIndexPostUrl()}/_delete_by_query`,
        headers: buildAuthorizationHeader(),
        body: buildSearchIndexRemoveAllBody(),
      });
    });
    
    function buildSearchIndexPostUrl(): string {
      const searchEnv: string = getSearchEnv();
      return `${searchEnv['url']}/${searchEnv['index']}`;
    }
    
    function buildAuthorizationHeader(): HttpHeader {
      return { [Header.AUTHORIZATION]: `Basic ${buildToken()}` };
    }
    
    function buildToken(): string {
      const searchEnv: string = getSearchEnv();
      return btoa(`${searchEnv['user']}:${searchEnv['password']}`);
    }
    
    function getSearchEnv(): string {
      return Cypress.env(CypressEnv.SEARCH);
    }
    
    function buildSearchIndexRemoveAllBody(): any {
      return {
        query: {
          match_all: {},
        },
      };
    }
    
    Cypress.Commands.add('addMockToSmocker', (mock) => {
      cy.fixture(`smocker/${mock}`).then((mockFile) => {
        cy.request({
          method: HttpMethod.POST,
          url: `${getSmockerUrl()}/mocks`,
          body: mockFile,
          headers: {
            "Content-Type": "application/x-yaml"
          }
        });
      });
    });
    
    Cypress.Commands.add('resetSmocker', () => {
      cy.request({
        method: HttpMethod.POST,
        url: `${getSmockerUrl()}/reset`,
      });
    });
    
    function getSmockerUrl(): string {
      const smockerEnv: string = getSmockerEnv();
      return smockerEnv['url'];
    }
    
    function getSmockerEnv(): string {
      return Cypress.env(CypressEnv.SMOCKER);
    }