Skip to content

Commit

Permalink
fix(EMS-3234): no PDF - Validation - Number validation decimal places (
Browse files Browse the repository at this point in the history
…#2582)

* fix(EMS-3234): added allowDecimalPlaces to numberValidation to allow decimal places if true

* fix(EMS-3234): code improvements

---------

Co-authored-by: Zain Kassam <zkassam@ukexportfinance.gov.uk>
  • Loading branch information
Zainzzkk and Zain Kassam authored Jun 18, 2024
1 parent a4a6e90 commit 61c51a1
Show file tree
Hide file tree
Showing 28 changed files with 318 additions and 120 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,13 @@ const {
} = INSURANCE_ROUTES;

const {
AGENT_CHARGES: {
METHOD, FIXED_SUM, FIXED_SUM_AMOUNT: FIELD_ID,
},
AGENT_CHARGES: { METHOD, FIXED_SUM, FIXED_SUM_AMOUNT: FIELD_ID },
} = FIELD_IDS;

const {
INSURANCE: {
EXPORT_CONTRACT: {
AGENT_CHARGES: {
[FIELD_ID]: ERROR_MESSAGES_OBJECT,
},
AGENT_CHARGES: { [FIELD_ID]: ERROR_MESSAGES_OBJECT },
},
},
} = ERROR_MESSAGES;
Expand Down Expand Up @@ -70,14 +66,6 @@ context(`Insurance - Export contract - Agent charges page - form validation - ${
cy.submitAndAssertFieldErrors({ ...assertions, expectedErrorMessage: ERROR_MESSAGES_OBJECT.IS_EMPTY });
});

it(`should display validation errors when ${FIELD_ID} is a decimal place number`, () => {
cy.submitAndAssertFieldErrors({
...assertions,
value: '1.2',
expectedErrorMessage: ERROR_MESSAGES_OBJECT.INCORRECT_FORMAT,
});
});

it(`should display validation errors when ${FIELD_ID} has special characters`, () => {
cy.submitAndAssertFieldErrors({
...assertions,
Expand All @@ -93,4 +81,11 @@ context(`Insurance - Export contract - Agent charges page - form validation - ${
expectedErrorMessage: ERROR_MESSAGES_OBJECT.BELOW_MINIMUM,
});
});

it(`should NOT display validation errors when ${FIELD_ID} is a decimal place number`, () => {
cy.keyboardInput(fieldSelector(FIELD_ID).input(), '1.50');

cy.clickSubmitButton();
cy.assertErrorSummaryListLength(1);
});
});
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ERROR_MESSAGES } from '../../../../../../content-strings';
import { FIELD_IDS } from '../../../../../../constants';
import { RequestBody } from '../../../../../../../types';
import wholeNumberValidation from '../../../../../../helpers/whole-number-validation';
import numberValidation from '../../../../../../helpers/number-validation';
import { objectHasProperty } from '../../../../../../helpers/object';
import generateValidationErrors from '../../../../../../helpers/validation';
import { stripCommas } from '../../../../../../helpers/string';
Expand Down Expand Up @@ -42,7 +42,7 @@ const employeesUK = (formBody: RequestBody, errors: object) => {
}

const errorMessage = ERROR_MESSAGE.INCORRECT_FORMAT;
return wholeNumberValidation(formBody, errors, errorMessage, FIELD_ID);
return numberValidation({ formBody, errors, errorMessage, fieldId: FIELD_ID });
};

export default employeesUK;
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ERROR_MESSAGES } from '../../../../../../content-strings';
import { FIELD_IDS } from '../../../../../../constants';
import { RequestBody } from '../../../../../../../types';
import wholeNumberValidation from '../../../../../../helpers/whole-number-validation';
import numberValidation from '../../../../../../helpers/number-validation';
import { objectHasProperty } from '../../../../../../helpers/object';
import generateValidationErrors from '../../../../../../helpers/validation';

Expand All @@ -28,7 +28,7 @@ const yearsExporting = (formBody: RequestBody, errors: object) => {
}

const errorMessage = ERROR_MESSAGE.INCORRECT_FORMAT;
return wholeNumberValidation(formBody, errors, errorMessage, FIELD_ID);
return numberValidation({ formBody, errors, errorMessage, fieldId: FIELD_ID });
};

export default yearsExporting;
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ describe('controllers/insurance/business/turnover/validation/rules/estimated-ann
} as RequestBody;

describe(`when the ${ESTIMATED_ANNUAL_TURNOVER} input is empty`, () => {
it('should return a validation error', () => {
it('should return the result of numberValidation', () => {
const response = yearsExporting(mockBody, mockErrors);

const errorMessage = EXPORTER_BUSINESS[ESTIMATED_ANNUAL_TURNOVER].IS_EMPTY;
Expand All @@ -28,7 +28,7 @@ describe('controllers/insurance/business/turnover/validation/rules/estimated-ann
});

describe(`when the ${ESTIMATED_ANNUAL_TURNOVER} input contains a letter`, () => {
it('should return a validation error', () => {
it('should return the result of numberValidation', () => {
mockBody[ESTIMATED_ANNUAL_TURNOVER] = 'I5';
const response = yearsExporting(mockBody, mockErrors);

Expand All @@ -40,7 +40,7 @@ describe('controllers/insurance/business/turnover/validation/rules/estimated-ann
});

describe(`when the ${ESTIMATED_ANNUAL_TURNOVER} input contains a decimal place`, () => {
it('should return a validation error', () => {
it('should return the result of numberValidation', () => {
mockBody[ESTIMATED_ANNUAL_TURNOVER] = '3.1';
const response = yearsExporting(mockBody, mockErrors);

Expand All @@ -52,7 +52,7 @@ describe('controllers/insurance/business/turnover/validation/rules/estimated-ann
});

describe(`when the ${ESTIMATED_ANNUAL_TURNOVER} input contains a special character`, () => {
it('should return a validation error', () => {
it('should return the result of numberValidation', () => {
mockBody[ESTIMATED_ANNUAL_TURNOVER] = '1*';
const response = yearsExporting(mockBody, mockErrors);

Expand All @@ -64,7 +64,7 @@ describe('controllers/insurance/business/turnover/validation/rules/estimated-ann
});

describe(`when the ${ESTIMATED_ANNUAL_TURNOVER} input is below 0 but has a decimal place`, () => {
it('should return a validation error', () => {
it('should return the result of numberValidation', () => {
mockBody[ESTIMATED_ANNUAL_TURNOVER] = '-3.123';
const response = yearsExporting(mockBody, mockErrors);

Expand All @@ -76,7 +76,7 @@ describe('controllers/insurance/business/turnover/validation/rules/estimated-ann
});

describe(`when the ${ESTIMATED_ANNUAL_TURNOVER} input is below 0 but has a decimal place and letters`, () => {
it('should return a validation error', () => {
it('should return the result of numberValidation', () => {
mockBody[ESTIMATED_ANNUAL_TURNOVER] = '-3.AB123';
const response = yearsExporting(mockBody, mockErrors);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ERROR_MESSAGES } from '../../../../../../content-strings';
import FIELD_IDS from '../../../../../../constants/field-ids/insurance/business';
import { RequestBody } from '../../../../../../../types';
import wholeNumberValidation from '../../../../../../helpers/whole-number-validation';
import numberValidation from '../../../../../../helpers/number-validation';
import { objectHasProperty } from '../../../../../../helpers/object';
import generateValidationErrors from '../../../../../../helpers/validation';

Expand Down Expand Up @@ -31,7 +31,7 @@ const estimatedAnnualTurnover = (formBody: RequestBody, errors: object) => {

const allowNegativeValue = true;

return wholeNumberValidation(formBody, errors, errorMessage, FIELD_ID, allowNegativeValue);
return numberValidation({ formBody, errors, errorMessage, fieldId: FIELD_ID, allowNegativeValue });
};

export default estimatedAnnualTurnover;
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import methodRule from '.';
import { FIELD_VALUES, MINIMUM_CHARACTERS } from '../../../../../../../constants';
import FIELD_IDS from '../../../../../../../constants/field-ids/insurance/export-contract';
import { ERROR_MESSAGES } from '../../../../../../../content-strings';
import wholeNumberAboveMinimumValidation from '../../../../../../../shared-validation/whole-number-above-minimum';
import numberAboveMinimumValidation from '../../../../../../../shared-validation/number-above-minimum';
import percentageNumberValidation from '../../../../../../../helpers/percentage-number-validation';
import emptyFieldValidation from '../../../../../../../shared-validation/empty-field';
import { mockErrors } from '../../../../../../../test-mocks';
Expand All @@ -27,14 +27,21 @@ const {

describe('controllers/insurance/export-contract/agent-charges/validation/rules/method', () => {
describe(`when ${METHOD} is ${FIXED_SUM}`, () => {
it('should return the result of wholeNumberAboveMinimumValidation', () => {
it('should return the result of numberAboveMinimumValidation', () => {
const mockBody = {
[METHOD]: FIXED_SUM,
};

const result = methodRule(mockBody, mockErrors);

const expected = wholeNumberAboveMinimumValidation(mockBody, FIXED_SUM_AMOUNT, FIXED_SUM_AMOUNT_ERROR_MESSAGES, mockErrors, MINIMUM_CHARACTERS.ONE);
const expected = numberAboveMinimumValidation({
formBody: mockBody,
fieldId: FIXED_SUM_AMOUNT,
errorMessage: FIXED_SUM_AMOUNT_ERROR_MESSAGES,
errors: mockErrors,
minimum: MINIMUM_CHARACTERS.ONE,
allowDecimalPlaces: true,
});

expect(result).toEqual(expected);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { FIELD_VALUES, MINIMUM_CHARACTERS } from '../../../../../../../constants';
import FIELD_IDS from '../../../../../../../constants/field-ids/insurance/export-contract';
import { ERROR_MESSAGES } from '../../../../../../../content-strings';
import wholeNumberAboveMinimumValidation from '../../../../../../../shared-validation/whole-number-above-minimum';
import numberAboveMinimumValidation from '../../../../../../../shared-validation/number-above-minimum';
import percentageNumberValidation from '../../../../../../../helpers/percentage-number-validation';
import emptyFieldValidation from '../../../../../../../shared-validation/empty-field';
import { RequestBody } from '../../../../../../../../types';
Expand All @@ -26,7 +26,7 @@ const {

/**
* validate the METHOD field
* - If METHOD is FIXED_SUM, validate FIXED_SUM_AMOUNT via wholeNumberAboveMinimumValidation.
* - If METHOD is FIXED_SUM, validate FIXED_SUM_AMOUNT via numberAboveMinimumValidation.
* - If METHOD is PERCENTAGE, validate PERCENTAGE_CHARGE via percentageNumberValidation.
* - Otherwise, assert empty field validation.
* @param {RequestBody} formBody: Form body
Expand All @@ -35,7 +35,14 @@ const {
*/
const method = (formBody: RequestBody, errors: object) => {
if (formBody[METHOD] === FIXED_SUM) {
return wholeNumberAboveMinimumValidation(formBody, FIXED_SUM_AMOUNT, FIXED_SUM_AMOUNT_ERROR_MESSAGES, errors, MINIMUM_CHARACTERS.ONE);
return numberAboveMinimumValidation({
formBody,
fieldId: FIXED_SUM_AMOUNT,
errorMessage: FIXED_SUM_AMOUNT_ERROR_MESSAGES,
errors,
minimum: MINIMUM_CHARACTERS.ONE,
allowDecimalPlaces: true,
});
}

if (formBody[METHOD] === PERCENTAGE) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import accountNumberRules, { MINIMUM, MAXIMUM } from './account-number';
import FIELD_IDS from '../../../../../../constants/field-ids/insurance/policy';
import { ERROR_MESSAGES } from '../../../../../../content-strings';
import wholeNumberMinimumMaximumLength from '../../../../../../shared-validation/whole-number-minimum-maximum-length';
import numberMinimumMaximumLength from '../../../../../../shared-validation/number-minimum-maximum-length';
import { RequestBody } from '../../../../../../../types';
import { mockErrors } from '../../../../../../test-mocks';

Expand All @@ -16,10 +16,17 @@ describe('controllers/insurance/policy/loss-payee-financial-details-uk/validatio
[FIELD_ID]: '',
} as RequestBody;

it('should return the result of wholeNumberMinimumMaximumLength', () => {
it('should return the result of numberMinimumMaximumLength', () => {
const result = accountNumberRules(mockBody, mockErrors);

const expected = wholeNumberMinimumMaximumLength(mockBody, FIELD_ID, ERROR_MESSAGES_OBJECT, mockErrors, MINIMUM, MAXIMUM);
const expected = numberMinimumMaximumLength({
formBody: mockBody,
fieldId: FIELD_ID,
errorMessage: ERROR_MESSAGES_OBJECT,
errors: mockErrors,
minimum: MINIMUM,
maximum: MAXIMUM,
});

expect(result).toEqual(expected);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { MAXIMUM_CHARACTERS, MINIMUM_CHARACTERS } from '../../../../../../constants';
import FIELD_IDS from '../../../../../../constants/field-ids/insurance/policy';
import { ERROR_MESSAGES } from '../../../../../../content-strings';
import wholeNumberMinimumMaximumLength from '../../../../../../shared-validation/whole-number-minimum-maximum-length';
import numberMinimumMaximumLength from '../../../../../../shared-validation/number-minimum-maximum-length';
import { RequestBody } from '../../../../../../../types';

const { ACCOUNT_NUMBER: FIELD_ID } = FIELD_IDS.LOSS_PAYEE_FINANCIAL_UK;
Expand All @@ -15,12 +15,12 @@ export const MINIMUM = Number(MINIMUM_CHARACTERS.ACCOUNT_NUMBER);
/**
* accountNumberRules
* Check submitted form data for errors for the account number field
* Returns wholeNumberAboveMinimumValidation if there are any errors.
* Returns numberAboveMinimumValidation if there are any errors.
* @param {RequestBody} formBody: Form body
* @param {Object} Errors object from previous validation errors
* @returns {Object} wholeNumberMinimumMaximumLength errors
* @returns {Object} numberMinimumMaximumLength errors
*/
const accountNumberRules = (formBody: RequestBody, errors: object) =>
wholeNumberMinimumMaximumLength(formBody, FIELD_ID, ERROR_MESSAGES_OBJECT, errors, MINIMUM, MAXIMUM);
numberMinimumMaximumLength({ formBody, fieldId: FIELD_ID, errorMessage: ERROR_MESSAGES_OBJECT, errors, minimum: MINIMUM, maximum: MAXIMUM });

export default accountNumberRules;
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const { [FIELD_ID]: ERROR_MESSAGES_OBJECT } = ERROR_MESSAGES.INSURANCE.POLICY;
/**
* sortCodeRules
* Check submitted form data for errors for the sort code field
* Returns wholeNumberAboveMinimumValidation if there are any errors.
* Returns numberHyphenSpacesOnlyValidation if there are any errors.
* @param {RequestBody} formBody: Form body
* @param {Object} Errors object from previous validation errors
* @returns {Object} numberHyphenSpacesOnlyValidation errors
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import maximumBuyerWillOweRules, { MINIMUM } from './maximum-buyer-will-owe';
import INSURANCE_FIELD_IDS from '../../../../../../../constants/field-ids/insurance';
import { ERROR_MESSAGES } from '../../../../../../../content-strings';
import wholeNumberAboveMinimumValidation from '../../../../../../../shared-validation/whole-number-above-minimum';
import numberAboveMinimumValidation from '../../../../../../../shared-validation/number-above-minimum';
import { mockErrors } from '../../../../../../../test-mocks';

const {
Expand All @@ -23,12 +23,18 @@ const {
} = ERROR_MESSAGES;

describe('controllers/insurance/policy/multiple-contract-policy/export-value/validation/rules/maximum-buyer-will-owe', () => {
it('should return the result of wholeNumberAboveMinimumValidation', () => {
it('should return the result of numberAboveMinimumValidation', () => {
const mockSubmittedData = {};

const result = maximumBuyerWillOweRules(mockSubmittedData, mockErrors);

const expected = wholeNumberAboveMinimumValidation(mockSubmittedData, FIELD_ID, ERROR_MESSAGES_OBJECT, mockErrors, MINIMUM);
const expected = numberAboveMinimumValidation({
formBody: mockSubmittedData,
fieldId: FIELD_ID,
errorMessage: ERROR_MESSAGES_OBJECT,
errors: mockErrors,
minimum: MINIMUM,
});

expect(result).toEqual(expected);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import INSURANCE_FIELD_IDS from '../../../../../../../constants/field-ids/insurance';
import { ERROR_MESSAGES } from '../../../../../../../content-strings';
import wholeNumberAboveMinimumValidation from '../../../../../../../shared-validation/whole-number-above-minimum';
import numberAboveMinimumValidation from '../../../../../../../shared-validation/number-above-minimum';
import { RequestBody } from '../../../../../../../../types';

const {
Expand Down Expand Up @@ -32,6 +32,6 @@ export const MINIMUM = 1;
* @returns {ValidationErrors}
*/
const maximumBuyerWillOweRules = (formBody: RequestBody, errors: object) =>
wholeNumberAboveMinimumValidation(formBody, FIELD_ID, ERROR_MESSAGES_OBJECT, errors, MINIMUM);
numberAboveMinimumValidation({ formBody, fieldId: FIELD_ID, errorMessage: ERROR_MESSAGES_OBJECT, errors, minimum: MINIMUM });

export default maximumBuyerWillOweRules;
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import totalSalesToBuyerRules, { MINIMUM } from './total-sales-to-buyer';
import INSURANCE_FIELD_IDS from '../../../../../../../constants/field-ids/insurance';
import { ERROR_MESSAGES } from '../../../../../../../content-strings';
import wholeNumberAboveMinimumValidation from '../../../../../../../shared-validation/whole-number-above-minimum';
import numberAboveMinimumValidation from '../../../../../../../shared-validation/number-above-minimum';
import { mockErrors } from '../../../../../../../test-mocks';

const {
Expand All @@ -23,12 +23,18 @@ const {
} = ERROR_MESSAGES;

describe('controllers/insurance/policy/multiple-contract-policy/export-value/validation/rules/total-sales-to-buyer', () => {
it('should return the result of wholeNumberAboveMinimumValidation', () => {
it('should return the result of numberAboveMinimumValidation', () => {
const mockSubmittedData = {};

const result = totalSalesToBuyerRules(mockSubmittedData, mockErrors);

const expected = wholeNumberAboveMinimumValidation(mockSubmittedData, FIELD_ID, ERROR_MESSAGES_OBJECT, mockErrors, MINIMUM);
const expected = numberAboveMinimumValidation({
formBody: mockSubmittedData,
fieldId: FIELD_ID,
errorMessage: ERROR_MESSAGES_OBJECT,
errors: mockErrors,
minimum: MINIMUM,
});

expect(result).toEqual(expected);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import INSURANCE_FIELD_IDS from '../../../../../../../constants/field-ids/insurance';
import { ERROR_MESSAGES } from '../../../../../../../content-strings';
import wholeNumberAboveMinimumValidation from '../../../../../../../shared-validation/whole-number-above-minimum';
import numberAboveMinimumValidation from '../../../../../../../shared-validation/number-above-minimum';
import { RequestBody } from '../../../../../../../../types';

const {
Expand Down Expand Up @@ -32,6 +32,6 @@ export const MINIMUM = 1;
* @returns {ValidationErrors}
*/
const totalSalesToBuyerRules = (formBody: RequestBody, errors: object) =>
wholeNumberAboveMinimumValidation(formBody, FIELD_ID, ERROR_MESSAGES_OBJECT, errors, MINIMUM);
numberAboveMinimumValidation({ formBody, fieldId: FIELD_ID, errorMessage: ERROR_MESSAGES_OBJECT, errors, minimum: MINIMUM });

export default totalSalesToBuyerRules;
Loading

0 comments on commit 61c51a1

Please sign in to comment.