From af4c3a86d14a0377ed68bc1ff50d019baf74e618 Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Tue, 16 Jan 2024 13:42:25 +0100 Subject: [PATCH] fix: should not import archived child and parent (#5912) --- .../export-import-service.ts | 9 ++- .../export-import.e2e.test.ts | 62 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) 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 4d376b5291..dc5b95152f 100644 --- a/src/lib/features/export-import-toggles/export-import-service.ts +++ b/src/lib/features/export-import-toggles/export-import-service.ts @@ -305,9 +305,14 @@ export default class ExportImportService private async importDependencies(dto: ImportTogglesSchema, user: IUser) { await Promise.all( (dto.data.dependencies || []).flatMap((dependency) => { - const projectId = dto.data.features.find( + const feature = dto.data.features.find( (feature) => feature.name === dependency.feature, - )!.project!; + ); + if (!feature || !feature.project) { + return []; + } + + const projectId = feature!.project!; return dependency.dependencies.map((parentDependency) => this.dependentFeaturesService.upsertFeatureDependency( { 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 75b614cebb..abcbcfc3ad 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 @@ -1179,6 +1179,68 @@ test('should not import archived features tags', async () => { }); }); +test('should not import archived parent', async () => { + await createProjects(); + await app.createFeature('parent'); + await app.archiveFeature('parent'); + await app.importToggles({ + data: { + features: [{ name: 'child' }, { name: 'parent' }], + dependencies: [ + { + feature: 'child', + dependencies: [ + { + feature: 'parent', + }, + ], + }, + ], + featureStrategies: [], + featureEnvironments: [], + featureTags: [], + tagTypes: [], + contextFields: [], + segments: [], + }, + project: DEFAULT_PROJECT, + environment: DEFAULT_ENV, + }); + const { body } = await app.getProjectFeatures(DEFAULT_PROJECT); + expect(body).toMatchObject({ features: [{ name: 'child' }] }); +}); + +test('should not import archived child', async () => { + await createProjects(); + await app.createFeature('child'); + await app.archiveFeature('child'); + await app.importToggles({ + data: { + features: [{ name: 'child' }, { name: 'parent' }], + dependencies: [ + { + feature: 'child', + dependencies: [ + { + feature: 'parent', + }, + ], + }, + ], + featureStrategies: [], + featureEnvironments: [], + featureTags: [], + tagTypes: [], + contextFields: [], + segments: [], + }, + project: DEFAULT_PROJECT, + environment: DEFAULT_ENV, + }); + const { body } = await app.getProjectFeatures(DEFAULT_PROJECT); + expect(body).toMatchObject({ features: [{ name: 'parent' }] }); +}); + test(`should give errors with flag names if the flags don't match the project pattern`, async () => { await db.stores.environmentStore.create({ name: DEFAULT_ENV,