Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,29 @@ jobs:
- run:
name: Lint codebase
command: npx --no-install eslint .
check-supported-versions:
docker:
- image: node:22.8.0-bookworm-slim
steps:
- attach_workspace:
at: ./
- restore_cache:
key: v1-npm-{{ checksum "package.json" }}-{{checksum "package-lock.json" }}
- run:
name: Install curl for aws-cli
command: |
apt-get update && apt-get install -y curl unzip
- aws-cli/setup:
role_arn: $S3_ROLE_TO_ASSUME
region: $ECR_REGION
profile_name: s3-profile
- run:
name: Download required files from S3
command: |
aws s3 cp s3://${TEMPLATE_VERSIONS_BUCKET_NAME}/ $CIRCLE_WORKING_DIRECTORY/. --recursive --region ${ECR_REGION} --profile s3-profile
- run:
name: Verify all active template versions are supported
command: npm run verify-supported-versions
build:
executor: docker-publisher
steps:
Expand Down Expand Up @@ -232,6 +255,9 @@ workflows:
- lint:
requires:
- build-for-test
- check-supported-versions:
requires:
- build-for-test
- build:
requires:
- test
Expand Down
21 changes: 14 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
"coverage": "jest --coverage",
"dump-eslint-conf": "eslint --print-config ./app.js > ./stuff/eslint-conf.json",
"lint": "eslint .",
"lint:fix": "eslint --fix ."
"lint:fix": "eslint --fix .",
"verify-supported-versions": "node ./scripts/verify-supported-versions.js",
"verify-supported-versions:test": "node ./scripts/verify-supported-versions.js --use-fixture"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.345.0",
Expand All @@ -25,6 +27,7 @@
"ajv-errors": "^1.0.1",
"ajv-formats-mobile-uk": "github:CriminalInjuriesCompensationAuthority/ajv-formats-mobile-uk#v1.0.0",
"cookie-parser": "~1.4.3",
"csv-parse": "^6.1.0",
"debug": "~2.6.9",
"express": "^4.18.2",
"express-jwt": "^8.0.0",
Expand Down
8 changes: 1 addition & 7 deletions questionnaire/templates/templates.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,7 @@

const fsSync = require('node:fs');
const fs = require('node:fs/promises');

const supportedTemplates = {
'sexual-assault': {
'12.3.9': {module: 'q-templates-application-12_3_9'},
'12.3.10': {module: 'q-templates-application', latest: true}
}
};
const supportedTemplates = require('../../supported_template_versions');

function createTemplateService({templatesConfig}) {
function exactlyOneVersionContainsLatestFlag(versions) {
Expand Down
28 changes: 28 additions & 0 deletions scripts/compare-versions/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict';

// eslint-disable-next-line import/no-unresolved
const {parse} = require('csv-parse/sync');

function verifySupportedVersions(csvContent, supported) {
const records = parse(csvContent, {
columns: true,
skip_empty_lines: true
});

if (records.length === 0) {
return []; // No rows, nothing to check
}

return records
.map(row => ({
type: row.templateName?.replace(/"/g, ''),
version: row.templateVersion?.replace(/"/g, '')
}))
.filter(({type, version}) => {
const typeSupport = supported[type];
return !typeSupport || !typeSupport[version];
})
.map(({type, version}) => `${type}@${version}`);
}

module.exports = verifySupportedVersions;
55 changes: 55 additions & 0 deletions scripts/compare-versions/index.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
'use strict';

const verifySupportedVersions = require('.');

describe('verifySupportedVersions', () => {
const supported = {
application: {
'1.0.0': {module: 'q-templates-application-1_0_0'},
'2.0.0': {module: 'q-templates-application-2_0_0'},
'3.0.0': {module: 'q-templates-application', latest: true}
},
'other-template': {
'1.2.3': {module: 'q-other-template-application-1_2_3'},
'4.5.6': {module: 'q-other-template-application', latest: true}
}
};

it('returns empty array when all versions are supported', () => {
const csv = `templateName,templateVersion
"application","1.0.0"
"other-template","1.2.3"
`;

const result = verifySupportedVersions(csv, supported);
expect(result).toEqual([]);
});

it('detects unsupported versions correctly', () => {
const csv = `templateName,templateVersion
"application","9.9.9"
"other-template","1.2.3"
`;

const result = verifySupportedVersions(csv, supported);
expect(result).toEqual(['application@9.9.9']);
});

it('returns empty array for empty CSV', () => {
const csv = ``;
const result = verifySupportedVersions(csv, supported);
expect(result).toEqual([]);
});

it('detects multiple unsupported versions across templates', () => {
const csv = `templateName,templateVersion
"application","1.0.0"
"application","9.9.9"
"other-template","4.5.6"
"other-template","0.0.0"
`;

const result = verifySupportedVersions(csv, supported);
expect(result).toEqual(['application@9.9.9', 'other-template@0.0.0']);
});
});
6 changes: 6 additions & 0 deletions scripts/fixtures/dummy-template-versions.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
templateName,templateVersion
"sexual-assault","12.3.9"



arn:aws:iam::754256621582:role/cica-versions-bucket-assumable-role-oidc-dev
47 changes: 47 additions & 0 deletions scripts/verify-supported-versions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
'use strict';

const fs = require('fs');
const path = require('path');
const verifySupportedVersions = require('./compare-versions');
const supported = require('../supported_template_versions.json');

const CSV_FILE = path.resolve(__dirname, '../template-versions.csv');
const DUMMY_FIXTURE = path.resolve(__dirname, './fixtures/dummy-template-versions.csv');

function main() {
const useFixture = process.argv.includes('--use-fixture');

let csvContent;

if (useFixture) {
if (!fs.existsSync(DUMMY_FIXTURE)) {
console.error(`Dummy fixture file not found at ${DUMMY_FIXTURE}`);
process.exit(1);
}
console.log('Using dummy fixture CSV');
csvContent = fs.readFileSync(DUMMY_FIXTURE, 'utf-8');
} else {
if (!fs.existsSync(CSV_FILE)) {
console.error(`.template-versions.csv not found at ${CSV_FILE}`);
process.exit(1);
}
csvContent = fs.readFileSync(CSV_FILE, 'utf-8');
}

const unsupported = verifySupportedVersions(csvContent, supported);

if (unsupported.length > 0) {
console.error('Unsupported template versions found in DB:');
unsupported.forEach(v => console.error(`- ${v}`));
process.exit(1);
}

if (csvContent.trim().length === 0) {
console.warn('CSV was empty, no templates found.');
return;
}

console.log('All template versions in DB are supported.');
}

main();
6 changes: 6 additions & 0 deletions supported_template_versions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"sexual-assault": {
"12.3.9": {"module": "q-templates-application-12_3_9"},
"12.3.10": {"module": "q-templates-application", "latest": true}
}
}