Skip to content
Snippets Groups Projects
Commit b70f07ac authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-6381 use InvalidParam for error messages' (#719) from...

Merge pull request 'OZG-6381 use InvalidParam for error messages' (#719) from OZG-6381-Validierungsfehler-Admin into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/alfa/pulls/719


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents 109e7d4e 7b93f76d
Branches
Tags
No related merge requests found
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
/> />
</label> </label>
<div <div
*ngIf="errorMessages.length > 0" *ngIf="invalidParams.length > 0"
[attr.data-test-id]="'text-field-errors-' + label | convertForDataTest" [attr.data-test-id]="'text-field-errors-' + label | convertForDataTest"
> >
<span class="mb-3 italic text-red-500" *ngFor="let errorMessage of errorMessages">{{ <span class="mb-3 italic text-red-500" *ngFor="let invalidParam of invalidParams">{{
errorMessage getErrorMessage(invalidParam)
}}</span> }}</span>
</div> </div>
</div> </div>
import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; import { ConvertForDataTestPipe, InvalidParam } from '@alfa-client/tech-shared';
import { getElementFromFixture, notExistsAsHtmlElement } from '@alfa-client/test-utils';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FormControl, NgControl, ReactiveFormsModule, ValidationErrors } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createInvalidParam, createProblemDetail } from 'libs/tech-shared/test/error';
import { TextFieldComponent } from './text-field.component'; import { TextFieldComponent } from './text-field.component';
import * as TechValidationUtil from 'libs/tech-shared/src/lib/validation/tech.validation.util';
describe('TextFieldComponent', () => { describe('TextFieldComponent', () => {
let component: TextFieldComponent; let component: TextFieldComponent;
let fixture: ComponentFixture<TextFieldComponent>; let fixture: ComponentFixture<TextFieldComponent>;
const label = 'custom'; const label = 'custom';
const spanSelector = getDataTestIdOf('text-field-span-' + label);
const inputSelector = getDataTestIdOf('text-field-input-' + label);
const errorsSelector = getDataTestIdOf('text-field-errors-' + label);
const formControl = new FormControl('');
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [TextFieldComponent, ConvertForDataTestPipe], declarations: [TextFieldComponent, ConvertForDataTestPipe],
imports: [ReactiveFormsModule], imports: [ReactiveFormsModule],
}) }).compileComponents();
.overrideComponent(TextFieldComponent, {
add: {
providers: [
{
provide: NgControl,
useValue: formControl,
},
],
},
})
.compileComponents();
fixture = TestBed.createComponent(TextFieldComponent); fixture = TestBed.createComponent(TextFieldComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
...@@ -43,62 +28,39 @@ describe('TextFieldComponent', () => { ...@@ -43,62 +28,39 @@ describe('TextFieldComponent', () => {
expect(component).toBeTruthy(); expect(component).toBeTruthy();
}); });
it('should use label', () => { describe('getErrorMessage', () => {
const labelElement = getElementFromFixture(fixture, spanSelector); it('should call getMessageForInvalidParam()', () => {
expect(labelElement.textContent).toBe(label); const getMessageForInvalidParam: jest.SpyInstance<string, [string, InvalidParam]> =
}); jest.spyOn(TechValidationUtil, 'getMessageForInvalidParam');
const invalidParam: InvalidParam = createInvalidParam();
it('should use form control', () => {
const fieldText = 'text';
component.writeValue(fieldText);
fixture.detectChanges(); component.getErrorMessage(invalidParam);
const inputElement = getElementFromFixture(fixture, inputSelector); expect(getMessageForInvalidParam).toHaveBeenCalledWith(label, invalidParam);
expect(inputElement.value).toBe(fieldText);
}); });
describe('invalid indication', () => {
it('should show as red if invalid', () => {
formControl.setErrors({ someErrorCode: 'Invalid' });
fixture.detectChanges();
const labelElement = getElementFromFixture(fixture, spanSelector);
expect([...labelElement.classList]).toEqual(['text-red-500', 'font-bold']);
}); });
it('should not show as red if valid', () => { describe('show error messages', () => {
formControl.setErrors(null); it('should not call getErrorMessage() if no error', () => {
component.getErrorMessage = jest.fn();
component.fieldControl.setErrors({});
fixture.detectChanges(); fixture.detectChanges();
const labelElement = getElementFromFixture(fixture, spanSelector); expect(component.getErrorMessage).not.toHaveBeenCalled();
expect([...labelElement.classList]).toEqual([]);
});
}); });
describe('error messages', () => { it('should call getErrorMessage() if error', () => {
it('should not show empty error message container', () => { component.getErrorMessage = jest.fn();
fixture.detectChanges();
notExistsAsHtmlElement(fixture, errorsSelector); component.fieldControl.setErrors({
...createProblemDetail(),
invalidParams: [{ ...createInvalidParam(), name: 'settingBody.absender.name' }],
}); });
it('should show error messages', () => {
const errors: ValidationErrors = {
firstMessage: 'first',
secondMessage: 'second',
};
formControl.setErrors(errors);
fixture.detectChanges(); fixture.detectChanges();
const errorsElement: HTMLElement = getElementFromFixture(fixture, errorsSelector); expect(component.getErrorMessage).toHaveBeenCalled();
const spansTexts = Array.from(errorsElement.querySelectorAll('span')).map(
(span) => span.textContent,
);
expect(spansTexts).toEqual(Object.values(errors));
}); });
}); });
}); });
import { isNotNil } from '@alfa-client/tech-shared'; import { getMessageForInvalidParam, InvalidParam } from '@alfa-client/tech-shared';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { FormControlEditorAbstractComponent } from '@ods/component'; import { FormControlEditorAbstractComponent } from '@ods/component';
...@@ -10,7 +10,7 @@ export class TextFieldComponent extends FormControlEditorAbstractComponent { ...@@ -10,7 +10,7 @@ export class TextFieldComponent extends FormControlEditorAbstractComponent {
@Input() @Input()
label: string; label: string;
get errorMessages(): string[] { public getErrorMessage(invalidParam: InvalidParam): string {
return isNotNil(this.control?.errors) ? Object.values(this.control.errors) : []; return getMessageForInvalidParam(this.label, invalidParam);
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment