From 5cd3feb2487b0d52aa10671c9d62dbc9e2cade61 Mon Sep 17 00:00:00 2001 From: P-Jeremy Date: Fri, 13 Dec 2024 09:54:44 +0100 Subject: [PATCH] feat(api): add isoDateParser for scripts --- .../add-new-legal-document-version.js | 14 +------ api/src/shared/application/scripts/parsers.js | 18 ++++++++ .../unit/application/scripts/parsers_test.js | 42 +++++++++++++++++++ 3 files changed, 62 insertions(+), 12 deletions(-) diff --git a/api/scripts/legal-documents/add-new-legal-document-version.js b/api/scripts/legal-documents/add-new-legal-document-version.js index 27fc377bd15..e1623f2774a 100644 --- a/api/scripts/legal-documents/add-new-legal-document-version.js +++ b/api/scripts/legal-documents/add-new-legal-document-version.js @@ -1,8 +1,7 @@ import 'dotenv/config'; -import Joi from 'joi'; - import { usecases } from '../../src/legal-documents/domain/usecases/index.js'; +import { isoDateParser } from '../../src/shared/application/scripts/parsers.js'; import { Script } from '../../src/shared/application/scripts/script.js'; import { ScriptRunner } from '../../src/shared/application/scripts/script-runner.js'; @@ -29,16 +28,7 @@ export class AddNewLegalDocumentVersion extends Script { describe: 'Version date of the legal document, format "YYYY-MM-DD", (ex: "2020-02-27")', demandOption: true, requiresArg: true, - coerce: (value) => { - const schema = Joi.string() - .pattern(/^\d{4}-\d{2}-\d{2}$/) - .message('Invalid date format. Expected "YYYY-MM-DD".'); - const { error, value: validatedDate } = schema.validate(value); - if (error) { - throw new Error(error.message); - } - return new Date(validatedDate); - }, + coerce: isoDateParser(), }, }, }); diff --git a/api/src/shared/application/scripts/parsers.js b/api/src/shared/application/scripts/parsers.js index a942e067b72..0f94e61736e 100644 --- a/api/src/shared/application/scripts/parsers.js +++ b/api/src/shared/application/scripts/parsers.js @@ -50,3 +50,21 @@ export function commaSeparatedNumberParser(separator = ',') { return Joi.attempt(data, Joi.array().items(Joi.number())); }; } + +/** + * Create a parser for date strings in the format "YYYY-MM-DD" + * @returns {Date} + */ +export function isoDateParser() { + return (date) => { + const schema = Joi.string() + .pattern(/^\d{4}-\d{2}-\d{2}$/) + .message('Invalid date format. Expected "YYYY-MM-DD".'); + + const { error, value: validatedDate } = schema.validate(date); + if (error) { + throw new Error(error.message); + } + return new Date(validatedDate); + }; +} diff --git a/api/tests/shared/unit/application/scripts/parsers_test.js b/api/tests/shared/unit/application/scripts/parsers_test.js index f87c87332e3..ce218e208a4 100644 --- a/api/tests/shared/unit/application/scripts/parsers_test.js +++ b/api/tests/shared/unit/application/scripts/parsers_test.js @@ -6,6 +6,7 @@ import { commaSeparatedNumberParser, commaSeparatedStringParser, csvFileParser, + isoDateParser, } from '../../../../../src/shared/application/scripts/parsers.js'; import { catchErr, expect } from '../../../../test-helper.js'; @@ -108,4 +109,45 @@ describe('Shared | Unit | Application | Parsers', function () { expect(() => parser(input)).to.throw('"[1]" must be a number'); }); }); + + describe('isoDateParser', function () { + it('parses a valid date string in YYYY-MM-DD format', function () { + // given + const input = '2023-12-25'; + + // when + const parser = isoDateParser(); + const result = parser(input); + + // then + expect(result).to.be.instanceOf(Date); + expect(result.toISOString().startsWith('2023-12-25')).to.be.true; + }); + + it('throws an error for an invalid date format', async function () { + // given + const input = '12-25-2023'; + + // when + const parser = isoDateParser(); + const error = await catchErr(parser)(input); + + // then + expect(error).to.be.instanceOf(Error); + expect(error.message).to.equal('Invalid date format. Expected "YYYY-MM-DD".'); + }); + + it('throws an error for non-date strings', async function () { + // given + const input = 'not-a-date'; + + // when + const parser = isoDateParser(); + const error = await catchErr(parser)(input); + + // then + expect(error).to.be.instanceOf(Error); + expect(error.message).to.equal('Invalid date format. Expected "YYYY-MM-DD".'); + }); + }); });