From e1a504aaabcfef9da2d9d8190619301105864fba Mon Sep 17 00:00:00 2001 From: "matthieu.gros" Date: Thu, 4 Jul 2024 14:42:52 +0200 Subject: [PATCH 1/2] :truck: api: rename script file to clarify what it does --- ...ry-alone-feature-pilot-certification-centers-from-csv.js} | 5 +++-- ...one-feature-pilot-certification-centers-from-csv_test.js} | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) rename api/scripts/certification/next-gen/{import-pilot-certification-centers-from-csv.js => import-complementary-alone-feature-pilot-certification-centers-from-csv.js} (96%) rename api/tests/integration/scripts/certification/next-gen/{import-pilot-certification-centers-from-csv_test.js => import-complementary-alone-feature-pilot-certification-centers-from-csv_test.js} (97%) diff --git a/api/scripts/certification/next-gen/import-pilot-certification-centers-from-csv.js b/api/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js similarity index 96% rename from api/scripts/certification/next-gen/import-pilot-certification-centers-from-csv.js rename to api/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js index 1e96a7a1ac0..f8c4a294416 100755 --- a/api/scripts/certification/next-gen/import-pilot-certification-centers-from-csv.js +++ b/api/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js @@ -5,16 +5,17 @@ import lodash from 'lodash'; import { disconnect, knex } from '../../../db/knex-database-connection.js'; import { logger } from '../../../src/shared/infrastructure/utils/logger.js'; /** - * Usage: node scripts/certification/next-gen/import-pilot-certification-centers-from-csv.js path/file.csv + * Usage: node scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js path/file.csv * File is semicolon separated values, headers being: * certification_center_id **/ import { checkCsvHeader, parseCsv } from '../../helpers/csvHelpers.js'; -const { values } = lodash; import * as url from 'node:url'; import { CERTIFICATION_FEATURES } from '../../../src/certification/shared/domain/constants.js'; +const { values } = lodash; + const headers = { certificationCenterId: 'certification_center_id', }; diff --git a/api/tests/integration/scripts/certification/next-gen/import-pilot-certification-centers-from-csv_test.js b/api/tests/integration/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv_test.js similarity index 97% rename from api/tests/integration/scripts/certification/next-gen/import-pilot-certification-centers-from-csv_test.js rename to api/tests/integration/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv_test.js index 194a6efa9cf..37024355740 100644 --- a/api/tests/integration/scripts/certification/next-gen/import-pilot-certification-centers-from-csv_test.js +++ b/api/tests/integration/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv_test.js @@ -1,4 +1,4 @@ -import { main } from '../../../../../scripts/certification/next-gen/import-pilot-certification-centers-from-csv.js'; +import { main } from '../../../../../scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js'; import { CERTIFICATION_FEATURES } from '../../../../../src/certification/shared/domain/constants.js'; import { catchErr, createTempFile, databaseBuilder, expect, knex, removeTempFile } from '../../../../test-helper.js'; From d4d96ce9a0656166d5de1308c955ad137c560881 Mon Sep 17 00:00:00 2001 From: "matthieu.gros" Date: Thu, 4 Jul 2024 15:11:48 +0200 Subject: [PATCH 2/2] :sparkles: add filter to only delete centers pilots for complementary alone feature --- ...re-pilot-certification-centers-from-csv.js | 11 ++- ...lot-certification-centers-from-csv_test.js | 96 ++++++++++++++++--- 2 files changed, 92 insertions(+), 15 deletions(-) diff --git a/api/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js b/api/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js index f8c4a294416..c766b5611e8 100755 --- a/api/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js +++ b/api/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js @@ -1,8 +1,11 @@ import 'dotenv/config'; +import * as url from 'node:url'; + import lodash from 'lodash'; import { disconnect, knex } from '../../../db/knex-database-connection.js'; +import { CERTIFICATION_FEATURES } from '../../../src/certification/shared/domain/constants.js'; import { logger } from '../../../src/shared/infrastructure/utils/logger.js'; /** * Usage: node scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv.js path/file.csv @@ -10,9 +13,6 @@ import { logger } from '../../../src/shared/infrastructure/utils/logger.js'; * certification_center_id **/ import { checkCsvHeader, parseCsv } from '../../helpers/csvHelpers.js'; -import * as url from 'node:url'; - -import { CERTIFICATION_FEATURES } from '../../../src/certification/shared/domain/constants.js'; const { values } = lodash; @@ -88,7 +88,10 @@ async function main(filePath) { logger.info('Inserting pilot certification center ids in database... '); trx = await knex.transaction(); - await trx('certification-center-features').del(); + await trx('certification-center-features') + .leftJoin('features', 'features.id', 'certification-center-features.featureId') + .where('features.key', CERTIFICATION_FEATURES.CAN_REGISTER_FOR_A_COMPLEMENTARY_CERTIFICATION_ALONE.key) + .del(); const batchInfo = await trx.batchInsert('certification-center-features', certificationCentersPilotsList); const insertedLines = _getInsertedLineNumber(batchInfo); logger.info('✅ '); diff --git a/api/tests/integration/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv_test.js b/api/tests/integration/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv_test.js index 37024355740..71f58018084 100644 --- a/api/tests/integration/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv_test.js +++ b/api/tests/integration/scripts/certification/next-gen/import-complementary-alone-feature-pilot-certification-centers-from-csv_test.js @@ -18,7 +18,6 @@ describe('Integration | Scripts | Certification | import-pilot-certification-cen const certificationCenterId1 = 1001; const certificationCenterId2 = 1002; - const certificationCenterId3 = 1003; const featureId = databaseBuilder.factory.buildFeature({ key: CERTIFICATION_FEATURES.CAN_REGISTER_FOR_A_COMPLEMENTARY_CERTIFICATION_ALONE.key, @@ -26,9 +25,6 @@ describe('Integration | Scripts | Certification | import-pilot-certification-cen databaseBuilder.factory.buildCertificationCenter({ id: certificationCenterId1, isV3Pilot: true }); databaseBuilder.factory.buildCertificationCenter({ id: certificationCenterId2, isV3Pilot: true }); - databaseBuilder.factory.buildCertificationCenter({ id: certificationCenterId3, isV3Pilot: true }); - - databaseBuilder.factory.buildCertificationCenterFeature({ certificationCenterId1, featureId }); await databaseBuilder.commit(); @@ -47,7 +43,84 @@ describe('Integration | Scripts | Certification | import-pilot-certification-cen ]); }); - context('when there is a V3 certification center in the csv file', function () { + context('when pilot certification centers are already imported', function () { + it('should removes all pilot certification centers tied to the feature ', async function () { + // given + const file = 'pilot-certification-centers-valid.csv'; + const dataWithSingleCertificationCenterId = 'certification_center_id;\n1002;\n'; + const csvFilePath = await createTempFile(file, dataWithSingleCertificationCenterId); + + const certificationCenterId1 = 1001; + const certificationCenterId2 = 1002; + + const featureId = databaseBuilder.factory.buildFeature({ + key: CERTIFICATION_FEATURES.CAN_REGISTER_FOR_A_COMPLEMENTARY_CERTIFICATION_ALONE.key, + }).id; + + databaseBuilder.factory.buildCertificationCenter({ id: certificationCenterId1, isV3Pilot: true }); + databaseBuilder.factory.buildCertificationCenter({ id: certificationCenterId2, isV3Pilot: true }); + + databaseBuilder.factory.buildCertificationCenterFeature({ certificationCenterId1, featureId }); + + await databaseBuilder.commit(); + + // when + await main(csvFilePath); + + // then + const pilotCertificationCenterList = await knex('certification-center-features').select( + 'certificationCenterId', + 'featureId', + ); + + expect(pilotCertificationCenterList).to.deep.equal([ + { certificationCenterId: certificationCenterId2, featureId }, + ]); + }); + + it('should NOT removes pilot certification centers for another feature', async function () { + // given + const file = 'pilot-certification-centers-valid.csv'; + const data = 'certification_center_id;\n1002;\n'; + const csvFilePath = await createTempFile(file, data); + + const certificationCenterId1 = 1001; + const certificationCenterId2 = 1002; + + const complementaryAloneFeatureId = databaseBuilder.factory.buildFeature({ + key: CERTIFICATION_FEATURES.CAN_REGISTER_FOR_A_COMPLEMENTARY_CERTIFICATION_ALONE.key, + }).id; + const anotherFeatureId = databaseBuilder.factory.buildFeature({ + key: 'ANOTHER_FEATURE', + }).id; + + databaseBuilder.factory.buildCertificationCenter({ id: certificationCenterId1, isV3Pilot: true }); + databaseBuilder.factory.buildCertificationCenter({ id: certificationCenterId2, isV3Pilot: true }); + + databaseBuilder.factory.buildCertificationCenterFeature({ + certificationCenterId: certificationCenterId1, + featureId: anotherFeatureId, + }); + + await databaseBuilder.commit(); + + // when + await main(csvFilePath); + + // then + const pilotCertificationCenterList = await knex('certification-center-features').select( + 'certificationCenterId', + 'featureId', + ); + + expect(pilotCertificationCenterList).to.deep.equal([ + { certificationCenterId: certificationCenterId1, featureId: anotherFeatureId }, + { certificationCenterId: certificationCenterId2, featureId: complementaryAloneFeatureId }, + ]); + }); + }); + + context('when there is a V2 certification center in the csv file', function () { it('should not import the certification center list', async function () { // given const file = 'pilot-certification-centers-invalid-v3-centers.csv'; @@ -55,23 +128,24 @@ describe('Integration | Scripts | Certification | import-pilot-certification-cen const csvFilePath = await createTempFile(file, data); const v2CertificationCenterId = 2001; const v3CertificationCenterId = 2002; - const v2CertificationCenterId2 = 2003; const featureId = databaseBuilder.factory.buildFeature({ key: CERTIFICATION_FEATURES.CAN_REGISTER_FOR_A_COMPLEMENTARY_CERTIFICATION_ALONE.key, }).id; - databaseBuilder.factory.buildCertificationCenter({ id: v2CertificationCenterId, isV3Pilot: true }); - databaseBuilder.factory.buildCertificationCenter({ id: v3CertificationCenterId, isV3Pilot: false }); - databaseBuilder.factory.buildCertificationCenter({ id: v2CertificationCenterId2, isV3Pilot: true }); - databaseBuilder.factory.buildCertificationCenterFeature({ v2CertificationCenterId, featureId }); + databaseBuilder.factory.buildCertificationCenter({ id: v2CertificationCenterId, isV3Pilot: false }); + databaseBuilder.factory.buildCertificationCenter({ id: v3CertificationCenterId, isV3Pilot: true }); + databaseBuilder.factory.buildCertificationCenterFeature({ + certificationCenterId: v3CertificationCenterId, + featureId, + }); await databaseBuilder.commit(); // when const error = await catchErr(main)(csvFilePath); // then - expect(error.message).to.equal('V2 certification centers : 2002 are not allowed as pilots'); + expect(error.message).to.equal('V2 certification centers : 2001 are not allowed as pilots'); }); }); });