From d48dbed536a874df97563d9fa9f4d81fd97cd797 Mon Sep 17 00:00:00 2001 From: Miguel Serrano Date: Thu, 2 Dec 2021 11:14:10 +0100 Subject: [PATCH] Override split test locals (#5960) GitOrigin-RevId: 9a5372f2c4c6d79e6d77a2f72f6dc6a86437f577 --- .../SplitTests/SplitTestMiddleware.js | 14 ++++-- .../SplitTests/SplitTestMiddlewareTests.js | 48 +++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/services/web/app/src/Features/SplitTests/SplitTestMiddleware.js b/services/web/app/src/Features/SplitTests/SplitTestMiddleware.js index cff0ca3214..38ef4fcfde 100644 --- a/services/web/app/src/Features/SplitTests/SplitTestMiddleware.js +++ b/services/web/app/src/Features/SplitTests/SplitTestMiddleware.js @@ -10,9 +10,17 @@ function loadAssignmentsInLocals(splitTestNames) { req.session.cachedSplitTestAssignments = {} } for (const splitTestName of splitTestNames) { - const splitTest = await SplitTestCache.get(splitTestName) - if (splitTest) { - await _loadAssignmentInLocals(splitTest, req.session, res.locals) + if (req.query[splitTestName]) { + LocalsHelper.setSplitTestVariant( + res.locals, + splitTestName, + req.query[splitTestName] + ) + } else { + const splitTest = await SplitTestCache.get(splitTestName) + if (splitTest) { + await _loadAssignmentInLocals(splitTest, req.session, res.locals) + } } } } catch (error) { diff --git a/services/web/test/unit/src/SplitTests/SplitTestMiddlewareTests.js b/services/web/test/unit/src/SplitTests/SplitTestMiddlewareTests.js index b319c29684..5e5164fd5a 100644 --- a/services/web/test/unit/src/SplitTests/SplitTestMiddlewareTests.js +++ b/services/web/test/unit/src/SplitTests/SplitTestMiddlewareTests.js @@ -101,6 +101,54 @@ describe('SplitTestMiddleware', function () { sinon.assert.calledOnce(this.next) }) + it('variants are overridden in locals with query parameters', async function () { + this.SplitTestCache.get.withArgs('active-split-test').resolves({ + name: 'active-split-test', + getCurrentVersion: () => ({ + versionNumber: 1, + active: true, + }), + }) + + this.SplitTestV2Handler.promises.getAssignmentForSession + .withArgs(this.req.session, 'active-split-test') + .resolves({ + variant: 'default', + }) + + const middleware = this.SplitTestMiddleware.loadAssignmentsInLocals([ + 'active-split-test', + ]) + + this.req.query['active-split-test'] = 'variant' + + await middleware(this.req, this.res, this.next) + + assert.equal( + this.res.locals.splitTestVariants['active-split-test'], + 'variant' + ) + assert.deepEqual(this.req.session.cachedSplitTestAssignments, {}) // variants overriden using req.query are not cached + sinon.assert.calledOnce(this.next) + }) + + it('non-active split tests can be set in locals with query parameters', async function () { + const middleware = this.SplitTestMiddleware.loadAssignmentsInLocals([ + 'non-active-split-test', + ]) + + this.req.query['non-active-split-test'] = 'variant' + + await middleware(this.req, this.res, this.next) + + assert.equal( + this.res.locals.splitTestVariants['non-active-split-test'], + 'variant' + ) + assert.deepEqual(this.req.session.cachedSplitTestAssignments, {}) // variants overriden using req.query are not cached + sinon.assert.calledOnce(this.next) + }) + it('cached assignment in session is used', async function () { this.req.session.cachedSplitTestAssignments = { 'ui-overhaul-1': 'cached-variant',