From 63e300da3bf9d9d875c54b1eb1f55ec2c8af7b3b Mon Sep 17 00:00:00 2001 From: David Leek Date: Mon, 3 Jun 2024 12:10:12 +0200 Subject: [PATCH] chore: change to fs/promises and add an import from file e2e test (#7240) --- .../export-import-service.ts | 2 +- .../export-import.e2e.test.ts | 28 ++++++++ .../export-import-toggles/import-data.json | 64 +++++++++++++++++++ .../import-file-reader.ts | 8 --- src/lib/util/read-file.ts | 4 ++ 5 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 src/lib/features/export-import-toggles/import-data.json delete mode 100644 src/lib/features/export-import-toggles/import-file-reader.ts create mode 100644 src/lib/util/read-file.ts diff --git a/src/lib/features/export-import-toggles/export-import-service.ts b/src/lib/features/export-import-toggles/export-import-service.ts index 64679c1447..f55c7cec89 100644 --- a/src/lib/features/export-import-toggles/export-import-service.ts +++ b/src/lib/features/export-import-toggles/export-import-service.ts @@ -57,7 +57,7 @@ import type { IDependentFeaturesReadModel } from '../dependent-features/dependen import groupBy from 'lodash.groupby'; import { allSettledWithRejection } from '../../util/allSettledWithRejection'; import type { ISegmentReadModel } from '../segment/segment-read-model-type'; -import { readFile } from './import-file-reader'; +import { readFile } from '../../util/read-file'; export type IImportService = { validate( diff --git a/src/lib/features/export-import-toggles/export-import.e2e.test.ts b/src/lib/features/export-import-toggles/export-import.e2e.test.ts index e700b7862e..fe81d5d3c4 100644 --- a/src/lib/features/export-import-toggles/export-import.e2e.test.ts +++ b/src/lib/features/export-import-toggles/export-import.e2e.test.ts @@ -1280,3 +1280,31 @@ test(`should give errors with flag names if the flags don't match the project pa expect(body.message).toContain(pattern); expect(body.message).toContain(flagName); }); + +test('should import features from file', async () => { + await db.stores.environmentStore.create({ + name: DEFAULT_ENV, + type: 'production', + }); + + await db.stores.projectStore.create({ + name: DEFAULT_PROJECT, + description: '', + id: DEFAULT_PROJECT, + mode: 'open' as const, + }); + await app.linkProjectToEnvironment(DEFAULT_PROJECT, DEFAULT_ENV); + + await app.services.importService.importFromFile( + 'src/lib/features/export-import-toggles/import-data.json', + DEFAULT_PROJECT, + DEFAULT_ENV, + ); + const { body: importedFeature } = await getFeature(defaultFeatureName); + expect(importedFeature).toMatchObject({ + name: defaultFeatureName, + project: DEFAULT_PROJECT, + type: 'release', + variants, + }); +}); diff --git a/src/lib/features/export-import-toggles/import-data.json b/src/lib/features/export-import-toggles/import-data.json new file mode 100644 index 0000000000..24ad0c8c2d --- /dev/null +++ b/src/lib/features/export-import-toggles/import-data.json @@ -0,0 +1,64 @@ +{ + "features": [ + { "project": "old_project", "name": "first_feature", "type": "release" } + ], + "featureStrategies": [ + { + "featureName": "first_feature", + "id": "798cb25a-2abd-47bd-8a95-40ec13472309", + "name": "default", + "parameters": {}, + "constraints": [ + { + "values": ["conduit"], + "inverted": false, + "operator": "IN", + "contextName": "appName", + "caseInsensitive": false + } + ] + } + ], + "featureEnvironments": [ + { + "enabled": true, + "environment": "irrelevant", + "featureName": "first_feature", + "name": "first_feature", + "variants": [ + { + "name": "variantA", + "weight": 500, + "payload": { "type": "string", "value": "payloadA" }, + "overrides": [], + "stickiness": "default", + "weightType": "variable" + }, + { + "name": "variantB", + "weight": 500, + "payload": { "type": "string", "value": "payloadB" }, + "overrides": [], + "stickiness": "default", + "weightType": "variable" + } + ] + } + ], + "featureTags": [ + { "featureName": "first_feature", "tagType": "simple", "tagValue": "tag1" }, + { "featureName": "first_feature", "tagType": "simple", "tagValue": "tag2" }, + { + "featureName": "first_feature", + "tagType": "special_tag", + "tagValue": "feature_tagged" + } + ], + "tagTypes": [ + { "name": "bestt", "description": "test" }, + { "name": "special_tag", "description": "this is my special tag" }, + { "name": "special_tag", "description": "this is my special tag" } + ], + "contextFields": [], + "segments": [] +} diff --git a/src/lib/features/export-import-toggles/import-file-reader.ts b/src/lib/features/export-import-toggles/import-file-reader.ts deleted file mode 100644 index 1b1c14f187..0000000000 --- a/src/lib/features/export-import-toggles/import-file-reader.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as fs from 'fs'; - -export const readFile: (file: string) => Promise = async (file) => - new Promise((resolve, reject) => - fs.readFile(file, (err, v) => - err ? reject(err) : resolve(v.toString('utf-8')), - ), - ); diff --git a/src/lib/util/read-file.ts b/src/lib/util/read-file.ts new file mode 100644 index 0000000000..dc2d951ce6 --- /dev/null +++ b/src/lib/util/read-file.ts @@ -0,0 +1,4 @@ +import { promises as fs } from 'fs'; + +export const readFile: (file: string) => Promise = async (file) => + await fs.readFile(file, 'utf-8');