diff --git a/src/lib/services/feature-toggle-service.ts b/src/lib/services/feature-toggle-service.ts index 235cb3e1f0..6a58cd553c 100644 --- a/src/lib/services/feature-toggle-service.ts +++ b/src/lib/services/feature-toggle-service.ts @@ -661,7 +661,7 @@ class FeatureToggleService { if (hasOnlyDisabledStrategies) { // Disable the feature in the environment if it only has disabled strategies - await this.updateEnabled( + await this.unprotectedUpdateEnabled( projectId, featureName, environment, diff --git a/src/test/e2e/api/admin/project/features.e2e.test.ts b/src/test/e2e/api/admin/project/features.e2e.test.ts index 255f501664..f3efc73935 100644 --- a/src/test/e2e/api/admin/project/features.e2e.test.ts +++ b/src/test/e2e/api/admin/project/features.e2e.test.ts @@ -2925,3 +2925,166 @@ test('should disable strategies in place', async () => { expect(updatedStrategies[0].id).toBe(updatedStrategyOne.id); expect(updatedStrategies[0].disabled).toBe(updatedStrategyOne.disabled); }); + +test('Disabling last strategy for feature environment should disable that environment', async () => { + const envName = 'last_strategy_disable_env'; + const featureName = 'last_strategy_disable_feature'; + // Create environment + await db.stores.environmentStore.create({ + name: envName, + type: 'test', + }); + // Connect environment to project + await app.request + .post('/api/admin/projects/default/environments') + .send({ + environment: envName, + }) + .expect(200); + await app.request + .post('/api/admin/projects/default/features') + .send({ name: featureName }) + .expect(201); + let strategyId; + await app.request + .post( + `/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`, + ) + .send({ + name: 'default', + parameters: { + userId: 'string', + }, + }) + .expect(200) + .expect((res) => { + strategyId = res.body.id; + }); + // Enable feature_environment + await app.request + .post( + `/api/admin/projects/default/features/${featureName}/environments/${envName}/on`, + ) + .send({}) + .expect(200); + await app.request + .get( + `/api/admin/projects/default/features/${featureName}/environments/${envName}`, + ) + .expect(200) + .expect((res) => { + expect(res.body.enabled).toBeTruthy(); + }); + // Disable last strategy, this should also disable the environment + await app.request + .patch( + `/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies/${strategyId}`, + ) + .send([ + { + path: '/disabled', + value: true, + op: 'replace', + }, + ]) + .expect(200); + await app.request + .get( + `/api/admin/projects/default/features/${featureName}/environments/${envName}`, + ) + .expect(200) + .expect((res) => { + expect(res.body.enabled).toBeFalsy(); + }); +}); + +test('Enabling a feature environment should add the default strategy when only disabled strategies', async () => { + const envName = 'add_default_strategy'; + const featureName = 'add_default_strategy_feature'; + // Create environment + await db.stores.environmentStore.create({ + name: envName, + type: 'test', + }); + // Connect environment to project + await app.request + .post('/api/admin/projects/default/environments') + .send({ + environment: envName, + }) + .expect(200); + await app.request + .post('/api/admin/projects/default/features') + .send({ name: featureName }) + .expect(201); + let strategyId; + await app.request + .post( + `/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`, + ) + .send({ + name: 'default', + parameters: { + userId: 'string', + }, + }) + .expect(200) + .expect((res) => { + strategyId = res.body.id; + }); + // Enable feature_environment + await app.request + .post( + `/api/admin/projects/default/features/${featureName}/environments/${envName}/on`, + ) + .send({}) + .expect(200); + await app.request + .get( + `/api/admin/projects/default/features/${featureName}/environments/${envName}`, + ) + .expect(200) + .expect((res) => { + expect(res.body.enabled).toBeTruthy(); + }); + // Disable last strategy, this should also disable the environment + await app.request + .patch( + `/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies/${strategyId}`, + ) + .send([ + { + path: '/disabled', + value: true, + op: 'replace', + }, + ]) + .expect(200); + await app.request + .get( + `/api/admin/projects/default/features/${featureName}/environments/${envName}`, + ) + .expect(200) + .expect((res) => { + expect(res.body.enabled).toBeFalsy(); + }); + + // Enable feature_environment + await app.request + .post( + `/api/admin/projects/default/features/${featureName}/environments/${envName}/on`, + ) + .send({}) + .expect(200); + await app.request + .get( + `/api/admin/projects/default/features/${featureName}/environments/${envName}`, + ) + .expect(200) + .expect((res) => { + expect(res.body.enabled).toBeTruthy(); + expect(res.body.strategies.length).toBe(2); + expect(res.body.strategies[0].disabled).toBeTruthy(); + expect(res.body.strategies[1].disabled).toBeFalsy(); + }); +});