From 9e085d0ce0244406e7983df46e09ea50f29a769c Mon Sep 17 00:00:00 2001 From: Fredrik Oseberg Date: Wed, 12 Jan 2022 11:42:12 +0100 Subject: [PATCH] fix: add tests for move project --- src/lib/services/feature-toggle-service.ts | 22 +++++ src/lib/services/project-service.ts | 11 --- .../e2e/services/access-service.e2e.test.ts | 85 ++++++++++++++++++- 3 files changed, 105 insertions(+), 13 deletions(-) diff --git a/src/lib/services/feature-toggle-service.ts b/src/lib/services/feature-toggle-service.ts index 71d7315291..b7baef6253 100644 --- a/src/lib/services/feature-toggle-service.ts +++ b/src/lib/services/feature-toggle-service.ts @@ -834,6 +834,28 @@ class FeatureToggleService { return { ...legacyFeature, enabled, strategies }; } + async changeProject( + featureName: string, + newProject: string, + createdBy: string, + ): Promise { + const feature = await this.featureToggleStore.get(featureName); + const oldProject = feature.project; + feature.project = newProject; + await this.featureToggleStore.update(newProject, feature); + + const tags = await this.tagStore.getAllTagsForFeature(featureName); + await this.eventStore.store( + new FeatureChangeProjectEvent({ + createdBy, + oldProject, + newProject, + featureName, + tags, + }), + ); + } + async getArchivedFeatures(): Promise { return this.getFeatureToggles({}, true); } diff --git a/src/lib/services/project-service.ts b/src/lib/services/project-service.ts index b30b3d8ade..0788c937ca 100644 --- a/src/lib/services/project-service.ts +++ b/src/lib/services/project-service.ts @@ -227,17 +227,6 @@ export default class ProjectService { newProjectId, ); - const tags = await this.tagStore.getAllTagsForFeature(featureName); - await this.eventStore.store( - new FeatureChangeProjectEvent({ - createdBy: user.username, - oldProject: currentProjectId, - newProject: newProjectId, - featureName, - tags, - }), - ); - return updatedFeature; } diff --git a/src/test/e2e/services/access-service.e2e.test.ts b/src/test/e2e/services/access-service.e2e.test.ts index 9c21b47777..020d54ef34 100644 --- a/src/test/e2e/services/access-service.e2e.test.ts +++ b/src/test/e2e/services/access-service.e2e.test.ts @@ -169,7 +169,7 @@ const hasCommonProjectAccess = async (user, projectName, condition) => { }; const hasFullProjectAccess = async (user, projectName, condition) => { - const { DELETE_PROJECT, UPDATE_PROJECT } = permissions; + const { DELETE_PROJECT, UPDATE_PROJECT, MOVE_FEATURE_TOGGLE } = permissions; expect( await accessService.hasPermission(user, DELETE_PROJECT, projectName), @@ -177,6 +177,13 @@ const hasFullProjectAccess = async (user, projectName, condition) => { expect( await accessService.hasPermission(user, UPDATE_PROJECT, projectName), ).toBe(condition); + expect( + await accessService.hasPermission( + user, + MOVE_FEATURE_TOGGLE, + projectName, + ), + ); hasCommonProjectAccess(user, projectName, condition); }; @@ -281,7 +288,7 @@ test('should have project admin to default project as editor', async () => { test('should not have project admin to other projects as editor', async () => { const projectName = 'unusedprojectname'; const user = editorUser; - hasFullProjectAccess(projectName, user, false); + hasFullProjectAccess(user, projectName, false); }); test('cannot add CREATE_FEATURE without defining project', async () => { @@ -675,3 +682,77 @@ test('Should be denied access to delete a role that is in use', async () => { ); } }); + +test('Should be denied move feature toggle to project where the user does not have access', async () => { + const user = editorUser; + const editorUser2 = await createUserEditorAccess( + 'seconduser', + 'bob2@gmail.com', + ); + + const projectOrigin = { + id: 'projectOrigin', + name: 'New project', + description: 'Blah', + }; + const projectDest = { + id: 'projectDest', + name: 'New project', + description: 'Blah', + }; + await projectService.createProject(projectOrigin, user.id); + await projectService.createProject(projectDest, editorUser2.id); + + const featureToggle = { name: 'moveableToggle' }; + + await featureToggleService.createFeatureToggle( + projectOrigin.id, + featureToggle, + user.username, + ); + + try { + await projectService.changeProject( + projectDest.id, + featureToggle.name, + user, + projectOrigin.id, + ); + } catch (e) { + expect(e.toString()).toBe( + 'NoAccessError: You need permission=MOVE_FEATURE_TOGGLE to perform this action', + ); + } +}); + +test('Should be allowed move feature toggle to project when the user has access', async () => { + const user = editorUser; + + const projectOrigin = { + id: 'projectOrigin1', + name: 'New project', + description: 'Blah', + }; + const projectDest = { + id: 'projectDest2', + name: 'New project', + description: 'Blah', + }; + await projectService.createProject(projectOrigin, user); + await projectService.createProject(projectDest, user); + + const featureToggle = { name: 'moveableToggle2' }; + + await featureToggleService.createFeatureToggle( + projectOrigin.id, + featureToggle, + user.username, + ); + + await projectService.changeProject( + projectDest.id, + featureToggle.name, + user, + projectOrigin.id, + ); +});