diff --git a/alfa-client/libs/tech-shared/src/lib/validation/tech.validation.util.spec.ts b/alfa-client/libs/tech-shared/src/lib/validation/tech.validation.util.spec.ts index 8ba31e2037fb82d5335bcfb39c1c0656ff5239d2..a777fd637e6994f35d9b13f2a85b113f0074c787 100644 --- a/alfa-client/libs/tech-shared/src/lib/validation/tech.validation.util.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/validation/tech.validation.util.spec.ts @@ -25,6 +25,7 @@ import { AbstractControl, FormControl, FormGroup, UntypedFormControl, UntypedFor import { createInvalidParam, createIssue } from '../../../test/error'; import { InvalidParam, Issue } from '../tech.model'; import { + getControlForInvalidParam, getControlForIssue, getMessageForInvalidParam, getMessageForIssue, @@ -143,17 +144,7 @@ describe('ValidationUtils', () => { }); }); - describe('getMessageForInvalidParam', () => { - it('should return message', () => { - const invalidParam: InvalidParam = createInvalidParam(); - - const msg: string = getMessageForInvalidParam(invalidParam); - - expect(msg).toEqual(`Bitte ${invalidParam.name} ausfüllen`); - }); - }); - - describe('setInvalidParamValidationError', () => { + describe('invalid param', () => { const formPrefixes = ['', 'some-prefix']; const fieldNames = ['baseField1', 'baseField2', 'subGroup.subGroupField1']; const prefixNameCombinations = formPrefixes.flatMap((prefix) => @@ -165,31 +156,46 @@ describe('ValidationUtils', () => { 'with prefix "%s" and fieldName "%s"', (prefix, fieldName) => { let invalidParam: InvalidParam; - let invalidParamWithoutPrefix: InvalidParam; beforeEach(() => { form.reset(); - invalidParamWithoutPrefix = createInvalidParam(); - invalidParamWithoutPrefix.name = fieldName; invalidParam = { - reason: invalidParamWithoutPrefix.reason, + ...createInvalidParam(), name: prefix.length ? `${prefix}.${fieldName}` : fieldName, }; }); - it('should assign invalidParam to form control error without prefix', () => { - const message = getMessageForInvalidParam(invalidParamWithoutPrefix); + describe('get message for invalid param', () => { + it('should return', () => { + const msg: string = getMessageForInvalidParam(invalidParam, prefix); + + expect(msg).toEqual(`Bitte ${fieldName} ausfüllen`); + }); + }); - setInvalidParamValidationError(form, invalidParam, prefix); + describe('get control for invalid param', () => { + it('should find', () => { + const control: AbstractControl = getControlForInvalidParam(form, invalidParam, prefix); - const errorMessage = form.getError(invalidParam.reason, fieldName); - expect(errorMessage).toBe(message); + expect(control).toBeTruthy(); + }); }); - it('should mark form as touched', () => { - setInvalidParamValidationError(form, invalidParam, prefix); + describe('set invalid param validation error', () => { + it('should assign invalidParam to form control error without prefix', () => { + const message = getMessageForInvalidParam(invalidParam, prefix); + + setInvalidParamValidationError(form, invalidParam, prefix); - expect(form.touched).toBeTruthy(); + const errorMessage = form.getError(invalidParam.reason, fieldName); + expect(errorMessage).toBe(message); + }); + + it('should mark form as touched', () => { + setInvalidParamValidationError(form, invalidParam, prefix); + + expect(form.touched).toBeTruthy(); + }); }); }, ); @@ -211,6 +217,16 @@ describe('ValidationUtils', () => { invalidParam.name = paramPrefix.length > 0 ? `${paramPrefix}.${fieldName}` : fieldName; }); + it('should not find form control', () => { + const control: AbstractControl = getControlForInvalidParam( + form, + invalidParam, + pathPrefix, + ); + + expect(control).toBeFalsy(); + }); + it('should not assign to field control error', () => { setInvalidParamValidationError(form, invalidParam, pathPrefix); @@ -225,15 +241,5 @@ describe('ValidationUtils', () => { }); }, ); - - it('should not assign invalidParam with incorrect prefix', () => { - const invalidParam: InvalidParam = createInvalidParam(); - invalidParam.name = `correct-prefix.baseField1`; - - setInvalidParamValidationError(form, invalidParam, 'incorrect-prefix'); - - const errorMessage = form.getError(invalidParam.reason, unknownName); - expect(errorMessage).toBeFalsy(); - }); }); }); diff --git a/alfa-client/libs/tech-shared/src/lib/validation/tech.validation.util.ts b/alfa-client/libs/tech-shared/src/lib/validation/tech.validation.util.ts index b61f1b1059b1324d1f60d357b68f5e767f859427..a42904b4cc50a322b0345f71df54f4c7824da733 100644 --- a/alfa-client/libs/tech-shared/src/lib/validation/tech.validation.util.ts +++ b/alfa-client/libs/tech-shared/src/lib/validation/tech.validation.util.ts @@ -47,7 +47,7 @@ export function getControlForIssue( issue: Issue, pathPrefix?: string, ): AbstractControl { - const fieldPath: string = pathPrefix ? issue.field.substring(pathPrefix.length + 1) : issue.field; + const fieldPath: string = getFieldPathWithoutPrefix(issue.field, pathPrefix); let curControl: AbstractControl = form; fieldPath @@ -85,20 +85,31 @@ export function setInvalidParamValidationError( invalidParam: InvalidParam, pathPrefix: string = '', ): void { - const item: InvalidParam = mapInvalidParamWithoutPrefix(invalidParam, pathPrefix); - const formControl: AbstractControl = form.get(item.name); - if (isNotNil(formControl)) { - formControl.setErrors({ [item.reason]: getMessageForInvalidParam(item) }); - formControl.markAsTouched(); + const control: AbstractControl = getControlForInvalidParam(form, invalidParam, pathPrefix); + if (isNotNil(control)) { + control.setErrors({ + [invalidParam.reason]: getMessageForInvalidParam(invalidParam, pathPrefix), + }); + control.markAsTouched(); } } -function mapInvalidParamWithoutPrefix(item: InvalidParam, pathPrefix: string): InvalidParam { - return pathPrefix.length > 0 ? - { ...item, name: item.name.substring(pathPrefix.length + 1) } - : item; +function getFieldPathWithoutPrefix(name: string, pathPrefix: string): string { + return pathPrefix.length > 0 ? name.substring(pathPrefix.length + 1) : name; } -export function getMessageForInvalidParam(item: InvalidParam): string { - return replacePlaceholder(VALIDATION_MESSAGES[item.reason], 'field', item.name); +export function getControlForInvalidParam( + form: UntypedFormGroup, + invalidParam: InvalidParam, + pathPrefix: string = '', +): AbstractControl { + return form.get(getFieldPathWithoutPrefix(invalidParam.name, pathPrefix)); +} + +export function getMessageForInvalidParam(item: InvalidParam, pathPrefix: string): string { + return replacePlaceholder( + VALIDATION_MESSAGES[item.reason], + 'field', + getFieldPathWithoutPrefix(item.name, pathPrefix), + ); }