Skip to content
Snippets Groups Projects
Commit 3e1df5b0 authored by Albert Bruns's avatar Albert Bruns
Browse files

fix more broken E2E tests cause of button changes

parent e74f3c30
No related branches found
No related tags found
1 merge request!55E2 e updates
/*
* Copyright (C) 2023 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.
*/
export class ButtonWithSpinnerE2EComponent {
private readonly locatorButton: string = 'icon-button';
public findButton(root) {
return root.findTestElementWithClass(this.locatorButton);
}
//TODO Methode aus der MeinPage verwenden
public waitToDisappear(root) {
root.should('not.have.descendants', '[data-test-class=spinner]');
}
}
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
import { AttachmentContainerE2EComponent } from '../attachment/attachment.e2e.component'; import { AttachmentContainerE2EComponent } from '../attachment/attachment.e2e.component';
import { ButtonWithSpinnerE2EComponent } from '../ui/button-with-spinner.e2e.component';
export class WiedervorlageE2EComponent { export class WiedervorlageE2EComponent {
private readonly locatorBetreffInput: string = 'Betreff-text-input'; private readonly locatorBetreffInput: string = 'Betreff-text-input';
...@@ -33,10 +32,7 @@ export class WiedervorlageE2EComponent { ...@@ -33,10 +32,7 @@ export class WiedervorlageE2EComponent {
private readonly locatorStatusDot: string = 'dot'; private readonly locatorStatusDot: string = 'dot';
private readonly locatorSpeichernButton: string = 'speichern-button'; private readonly locatorSpeichernButton: string = 'speichern-button';
private readonly buttonWithSpinnerComponent: ButtonWithSpinnerE2EComponent = private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent();
new ButtonWithSpinnerE2EComponent();
private readonly attachmentContainer: AttachmentContainerE2EComponent =
new AttachmentContainerE2EComponent();
public getBetreff() { public getBetreff() {
return cy.getTestElement(this.locatorBetreffInput); return cy.getTestElement(this.locatorBetreffInput);
...@@ -63,9 +59,7 @@ export class WiedervorlageE2EComponent { ...@@ -63,9 +59,7 @@ export class WiedervorlageE2EComponent {
} }
public getSpeichernButton() { public getSpeichernButton() {
return this.buttonWithSpinnerComponent.findButton( return cy.getTestElement(this.locatorSpeichernButton);
cy.getTestElement(this.locatorSpeichernButton),
);
} }
public getAttachmentContainer(): AttachmentContainerE2EComponent { public getAttachmentContainer(): AttachmentContainerE2EComponent {
......
...@@ -21,15 +21,10 @@ ...@@ -21,15 +21,10 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
import { ButtonWithSpinnerE2EComponent } from '../ui/button-with-spinner.e2e.component';
import { WiedervorlageInVorgangE2EComponent } from './wiedervorlage-in-vorgang.e2e.component'; import { WiedervorlageInVorgangE2EComponent } from './wiedervorlage-in-vorgang.e2e.component';
export class WiedervorlagenInVorgangE2EComponent { export class WiedervorlagenInVorgangE2EComponent {
private readonly locatorCreateWiedervorlageButton: string = 'create-wiedervorlage'; private readonly locatorCreateWiedervorlageButton: string = 'create-wiedervorlage';
private readonly buttonWithSpinnerComponent: ButtonWithSpinnerE2EComponent =
new ButtonWithSpinnerE2EComponent();
private readonly locatorRoot: string = 'wiedervorlagen-in-vorgang'; private readonly locatorRoot: string = 'wiedervorlagen-in-vorgang';
public getRoot() { public getRoot() {
......
...@@ -153,8 +153,9 @@ describe('Vorgang wiedereroeffnen', () => { ...@@ -153,8 +153,9 @@ describe('Vorgang wiedereroeffnen', () => {
contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
}); });
it('should close snackbar on revoke', () => { it('should click on snackbar revoke', () => {
snackbar.getRevokeButton().click(); snackbar.getRevokeButton().click();
wait(500);
waitForSpinnerToDisappear(); waitForSpinnerToDisappear();
notExist(snackbar.getMessage()); notExist(snackbar.getMessage());
...@@ -258,7 +259,7 @@ describe('Vorgang wiedereroeffnen', () => { ...@@ -258,7 +259,7 @@ describe('Vorgang wiedereroeffnen', () => {
contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET);
}); });
it('should close snackbar on revoke', () => { it('should click snackbar revoke', () => {
snackbar.getRevokeButton().click(); snackbar.getRevokeButton().click();
wait(500); wait(500);
waitForSpinnerToDisappear(); waitForSpinnerToDisappear();
......
...@@ -21,13 +21,13 @@ ...@@ -21,13 +21,13 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
import { createStateResource, StateResource } from '@alfa-client/tech-shared';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { createCommandErrorStateResource, createCommandResource } from 'libs/command-shared/test/command'; import { createCommandErrorStateResource } from 'libs/command-shared/test/command';
import { createApiError } from 'libs/tech-shared/test/error'; import { createApiError } from 'libs/tech-shared/test/error';
import { createDummyResource } from '../../../../tech-shared/test/resource';
import { ButtonWithSpinnerComponent } from './button-with-spinner.component'; import { ButtonWithSpinnerComponent } from './button-with-spinner.component';
import * as ResourceUtils from 'libs/tech-shared/src/lib/resource/resource.util';
describe('ButtonWithSpinnerComponent', () => { describe('ButtonWithSpinnerComponent', () => {
let component: ButtonWithSpinnerComponent; let component: ButtonWithSpinnerComponent;
let fixture: ComponentFixture<ButtonWithSpinnerComponent>; let fixture: ComponentFixture<ButtonWithSpinnerComponent>;
...@@ -46,39 +46,25 @@ describe('ButtonWithSpinnerComponent', () => { ...@@ -46,39 +46,25 @@ describe('ButtonWithSpinnerComponent', () => {
expect(component).toBeTruthy(); expect(component).toBeTruthy();
}); });
describe('onInit', () => { describe('set stateResource', () => {
it('should call getStateResource', () => { it('should set stateResource', () => {
component.getStateResource = jest.fn(); const stateResource: StateResource<unknown> = createStateResource(createDummyResource());
component.ngOnInit(); component.stateResource = stateResource;
expect(component.getStateResource).toHaveBeenCalled(); expect(component._stateResource).toBe(stateResource);
});
}); });
describe('getStateResource', () => { it('should not set stateResource', () => {
it('should return stateResource', () => {
component.stateResource = ResourceUtils.createStateResource(createCommandResource());
component.getStateResource();
const valid: boolean = ResourceUtils.isValidStateResource(component.stateResource);
expect(valid).toBeTruthy();
});
it('should return empty stateResource', () => {
const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource');
component.stateResource = null; component.stateResource = null;
component.getStateResource(); expect(component._stateResource).not.toBe(null);
expect(spy).toHaveBeenCalled();
}); });
}); });
describe('isLoading', () => { describe('isLoading', () => {
it('should return false', () => { it('should return false', () => {
component.stateResource.loading = component.stateResource.reload = false; component._stateResource.loading = component._stateResource.reload = false;
const isLoading: boolean = component.isLoading; const isLoading: boolean = component.isLoading;
...@@ -86,8 +72,8 @@ describe('ButtonWithSpinnerComponent', () => { ...@@ -86,8 +72,8 @@ describe('ButtonWithSpinnerComponent', () => {
}); });
it('should return true if stateResource is loading', () => { it('should return true if stateResource is loading', () => {
component.stateResource.loading = true; component._stateResource.loading = true;
component.stateResource.reload = false; component._stateResource.reload = false;
const isLoading: boolean = component.isLoading; const isLoading: boolean = component.isLoading;
...@@ -95,8 +81,8 @@ describe('ButtonWithSpinnerComponent', () => { ...@@ -95,8 +81,8 @@ describe('ButtonWithSpinnerComponent', () => {
}); });
it('should return true if stateResource is reloading', () => { it('should return true if stateResource is reloading', () => {
component.stateResource.loading = false; component._stateResource.loading = false;
component.stateResource.reload = true; component._stateResource.reload = true;
const isLoading: boolean = component.isLoading; const isLoading: boolean = component.isLoading;
...@@ -106,7 +92,7 @@ describe('ButtonWithSpinnerComponent', () => { ...@@ -106,7 +92,7 @@ describe('ButtonWithSpinnerComponent', () => {
describe('isError', () => { describe('isError', () => {
it('should return false if error is not set', () => { it('should return false if error is not set', () => {
component.stateResource.error = null; component._stateResource.error = null;
const isError: boolean = component.isError; const isError: boolean = component.isError;
...@@ -114,7 +100,7 @@ describe('ButtonWithSpinnerComponent', () => { ...@@ -114,7 +100,7 @@ describe('ButtonWithSpinnerComponent', () => {
}); });
it('should return false if error is set and error is ApiError', () => { it('should return false if error is set and error is ApiError', () => {
component.stateResource.error = createApiError(); component._stateResource.error = createApiError();
const isError: boolean = component.isError; const isError: boolean = component.isError;
...@@ -122,7 +108,7 @@ describe('ButtonWithSpinnerComponent', () => { ...@@ -122,7 +108,7 @@ describe('ButtonWithSpinnerComponent', () => {
}); });
it('should return true if error is set and error is not ApiError', () => { it('should return true if error is set and error is not ApiError', () => {
component.stateResource = createCommandErrorStateResource(); component._stateResource = createCommandErrorStateResource();
const isError: boolean = component.isError; const isError: boolean = component.isError;
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
import { CommandResource, hasCommandError } from '@alfa-client/command-shared'; import { CommandResource, hasCommandError } from '@alfa-client/command-shared';
import { StateResource, createEmptyStateResource, isLoaded } from '@alfa-client/tech-shared'; import { StateResource, createEmptyStateResource, isLoaded } from '@alfa-client/tech-shared';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Component, EventEmitter, Input, Output } from '@angular/core';
import { ButtonComponent, ErrorMessageComponent, buttonVariants } from '@ods/system'; import { ButtonComponent, ErrorMessageComponent, buttonVariants } from '@ods/system';
import { VariantProps } from 'class-variance-authority'; import { VariantProps } from 'class-variance-authority';
import { isNil } from 'lodash-es'; import { isNil } from 'lodash-es';
...@@ -49,28 +49,24 @@ type ButtonVariants = VariantProps<typeof buttonVariants>; ...@@ -49,28 +49,24 @@ type ButtonVariants = VariantProps<typeof buttonVariants>;
<ng-content icon select="[icon]" /> <ng-content icon select="[icon]" />
</ods-button>`, </ods-button>`,
}) })
export class ButtonWithSpinnerComponent implements OnInit { export class ButtonWithSpinnerComponent {
@Input() set stateResource(value: StateResource<unknown>) {
if (!isNil(value)) this._stateResource = value;
}
@Input() text: string = ''; @Input() text: string = '';
@Input() dataTestId: string = ''; @Input() dataTestId: string = '';
@Input() stateResource: StateResource<unknown>;
@Input() variant: ButtonVariants['variant'] = 'primary'; @Input() variant: ButtonVariants['variant'] = 'primary';
@Input() size: ButtonVariants['size'] = 'medium'; @Input() size: ButtonVariants['size'] = 'medium';
@Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>(); @Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
ngOnInit(): void { _stateResource: StateResource<unknown> = createEmptyStateResource();
this.stateResource = this.getStateResource();
}
getStateResource(): StateResource<unknown> {
return isNil(this.stateResource) ? createEmptyStateResource() : this.stateResource;
}
get isLoading(): boolean { get isLoading(): boolean {
return this.stateResource.loading || this.stateResource.reload; return this._stateResource.loading || this._stateResource.reload;
} }
get isError(): boolean { get isError(): boolean {
return isLoaded(this.stateResource) && hasCommandError(<CommandResource>this.stateResource.resource); return isLoaded(this._stateResource) && hasCommandError(<CommandResource>this._stateResource.resource);
} }
} }
...@@ -26,20 +26,21 @@ ...@@ -26,20 +26,21 @@
@if (showAsIconButton) { @if (showAsIconButton) {
<ods-button-with-spinner <ods-button-with-spinner
[stateResource]="submitInProgress$ | async" [stateResource]="submitInProgress$ | async"
(clickEmitter)="submit()"
tooltip="Wiedervorlage speichern" tooltip="Wiedervorlage speichern"
variant="ghost" variant="ghost"
size="fit" size="fit"
(clickEmitter)="submit()" dataTestId="speichern-icon-button"
> >
<ods-save-icon icon class="fill-text" /> <ods-save-icon icon class="fill-text" />
</ods-button-with-spinner> </ods-button-with-spinner>
} @else { } @else {
<ods-button-with-spinner <ods-button-with-spinner
data-test-id="speichern-button"
[stateResource]="submitInProgress$ | async" [stateResource]="submitInProgress$ | async"
(clickEmitter)="submit()"
text="Speichern" text="Speichern"
variant="outline" variant="outline"
(clickEmitter)="submit()" dataTestId="speichern-button"
> >
<ods-save-icon icon /> <ods-save-icon icon />
</ods-button-with-spinner> </ods-button-with-spinner>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment