diff --git a/lib/routes/feature.js b/lib/routes/feature.js index 458ee98d1d..3629dc5692 100644 --- a/lib/routes/feature.js +++ b/lib/routes/feature.js @@ -99,6 +99,23 @@ module.exports = function (app, config) { .catch(error => handleErrors(req, res, error)); }); + app.post('/features/:featureName/toggle', (req, res) => { + const featureName = req.params.featureName; + const userName = extractUser(req); + + featureToggleStore.getFeature(featureName) + .then((feature) => { + feature.enabled = !feature.enabled; + return eventStore.store({ + type: FEATURE_UPDATED, + createdBy: userName, + data: feature, + }); + }) + .then(() => res.status(200).end()) + .catch(error => handleErrors(req, res, error)); + }); + app.delete('/features/:featureName', (req, res) => { const featureName = req.params.featureName; const userName = extractUser(req); diff --git a/test/e2e/feature-api.test.js b/test/e2e/feature-api.test.js index 7b00d0e51c..172e48840c 100644 --- a/test/e2e/feature-api.test.js +++ b/test/e2e/feature-api.test.js @@ -98,6 +98,24 @@ test.serial('can change status of feature toggle that does exist', async t => { .expect(200).then(destroy); }); +test.serial('can not toggle of feature that does not exist', async t => { + const { request, destroy } = await setupApp('feature_api_serial'); + logger.setLevel('FATAL'); + return request + .post('/features/should-not-exist/toggle') + .set('Content-Type', 'application/json') + .expect(404).then(destroy); +}); + +test.serial('can toggle a feature that does exist', async t => { + const { request, destroy } = await setupApp('feature_api_serial'); + logger.setLevel('FATAL'); + return request + .post('/features/featureY/toggle') + .set('Content-Type', 'application/json') + .expect(200).then(destroy); +}); + test.serial('archives a feature by name', async t => { const { request, destroy } = await setupApp('feature_api_serial'); return request