From f3fbfeab20d4023adb432beb4af593fe625909c9 Mon Sep 17 00:00:00 2001 From: Antoine Clausse Date: Fri, 20 Mar 2026 13:40:39 +0100 Subject: [PATCH] [web] Fix feature refresh handling in ProjectController (#32353) * Update tests to check that refreshed features are used correctly * Fix feature refresh handling in ProjectController GitOrigin-RevId: 14c0cedf72f6cfe6657aa35fab16e319a37231e7 --- .../src/Features/Project/ProjectController.mjs | 3 ++- .../unit/src/Project/ProjectController.test.mjs | 15 +++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/services/web/app/src/Features/Project/ProjectController.mjs b/services/web/app/src/Features/Project/ProjectController.mjs index 204c00a3a4..2fe0c388c2 100644 --- a/services/web/app/src/Features/Project/ProjectController.mjs +++ b/services/web/app/src/Features/Project/ProjectController.mjs @@ -1082,10 +1082,11 @@ const _ProjectController = { refreshTimeoutHandler(), (async () => { try { - user.features = await FeaturesUpdater.promises.refreshFeatures( + const { features } = await FeaturesUpdater.promises.refreshFeatures( user._id, 'load-editor' ) + user.features = features metrics.inc('features-refresh', 1, { path: 'load-editor', status: 'success', diff --git a/services/web/test/unit/src/Project/ProjectController.test.mjs b/services/web/test/unit/src/Project/ProjectController.test.mjs index ca6f2f84df..a03bf57f0d 100644 --- a/services/web/test/unit/src/Project/ProjectController.test.mjs +++ b/services/web/test/unit/src/Project/ProjectController.test.mjs @@ -169,7 +169,10 @@ describe('ProjectController', function () { ctx.FeaturesUpdater = { featuresEpochIsCurrent: sinon.stub().returns(true), promises: { - refreshFeatures: sinon.stub().resolves(ctx.user), + refreshFeatures: sinon.stub().resolves({ + features: { symbolPalette: true }, + featuresChanged: true, + }), }, } ctx.BrandVariationsHandler = { @@ -1112,16 +1115,20 @@ describe('ProjectController', function () { }) it('should refresh the user features if the epoch is outdated', async function (ctx) { - await new Promise(resolve => { + ctx.Features.hasFeature.withArgs('saas').returns(true) + await new Promise((resolve, reject) => { ctx.FeaturesUpdater.featuresEpochIsCurrent = sinon.stub().returns(false) - ctx.res.render = () => { + ctx.res.render = (_, data) => { ctx.FeaturesUpdater.promises.refreshFeatures.should.have.been.calledWith( ctx.user._id, 'load-editor' ) + expect(data.showSymbolPalette).to.equal(true) resolve() } - ctx.ProjectController.loadEditor(ctx.req, ctx.res) + ctx.ProjectController.loadEditor(ctx.req, ctx.res, err => { + if (err) reject(err) + }) }) })