/*
 * 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.
 */
import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
import { createIssue } from '../../../test/error';
import { Issue } from '../tech.model';
import { getControlForIssue, getMessageForIssue, setValidationError } from './tech.validation.util';

describe('ValidationUtils', () => {

	describe('setValidationError', () => {

		const baseField1Control = new UntypedFormControl();
		const baseField2Control = new UntypedFormControl();
		const subGroupFieldControl = new UntypedFormControl();

		const form = new UntypedFormGroup({
			baseField1: baseField1Control,
			baseField2: baseField2Control,
			subGroup: new UntypedFormGroup({
				subGroupField1: subGroupFieldControl
			})
		});

		describe('get control for issue', () => {

			it('should return base field control', () => {
				const issue: Issue = { ...createIssue(), field: 'baseField1' };

				const control = getControlForIssue(form, issue);

				expect(control).toBe(baseField1Control);
			});

			it('should reeturn sub group field', () => {
				const issue: Issue = { ...createIssue(), field: 'subGroup.subGroupField1' };

				const control = getControlForIssue(form, issue);

				expect(control).toBe(subGroupFieldControl);
			})

			it('should ignore path prefix', () => {
				const issue: Issue = { ...createIssue(), field: 'command.wiedervorlage.baseField1' };

				const control = getControlForIssue(form, issue, 'command.wiedervorlage');

				expect(control).toBe(baseField1Control);
			})
		})

		describe('in base field', () => {

			const issue: Issue = { ...createIssue(), field: 'baseField1' };

			it('should set error in control', () => {
				setValidationError(form, issue);

				expect(baseField1Control.errors).not.toBeNull();
			});

			it('should set message code in control', () => {
				setValidationError(form, issue);

				expect(baseField1Control.hasError(issue.messageCode)).toBe(true);
			});

			it('should set control touched', () => {
				setValidationError(form, issue);

				expect(baseField1Control.touched).toBe(true);
			})

			it('should not set error in other control', () => {
				setValidationError(form, issue);

				expect(baseField2Control.errors).toBeNull();
			});
		});

		describe('in subGroup Field', () => {

			const issue: Issue = { ...createIssue(), field: 'subGroup.subGroupField1' };

			it('should set error in control', () => {
				setValidationError(form, issue);

				expect(subGroupFieldControl.errors).not.toBeNull();
			});
		});
	});

	describe('get message for issue', () => {

		const fieldLabel = 'Field Label';

		it('should return message', () => {
			const msg = getMessageForIssue(fieldLabel, { ...createIssue(), messageCode: 'validation_field_size' });

			expect(msg).toContain('muss mindestens');
		});

		it('should set field label', () => {
			const msg = getMessageForIssue(fieldLabel, { ...createIssue(), messageCode: 'validation_field_size' });

			expect(msg).toContain(fieldLabel);
		});

		it('should replace min param', () => {
			const msg = getMessageForIssue(fieldLabel, { ...createIssue(), messageCode: 'validation_field_size', parameters: [{ name: 'min', value: '3' }] });

			expect(msg).toContain('3');
		});
	})
})