Sfoglia il codice sorgente

Override split test locals (#5960)

GitOrigin-RevId: 9a5372f2c4c6d79e6d77a2f72f6dc6a86437f577
Miguel Serrano 4 anni fa
parent
commit
d48dbed536

+ 11 - 3
services/web/app/src/Features/SplitTests/SplitTestMiddleware.js

@@ -10,9 +10,17 @@ function loadAssignmentsInLocals(splitTestNames) {
         req.session.cachedSplitTestAssignments = {}
         req.session.cachedSplitTestAssignments = {}
       }
       }
       for (const splitTestName of splitTestNames) {
       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) {
     } catch (error) {

+ 48 - 0
services/web/test/unit/src/SplitTests/SplitTestMiddlewareTests.js

@@ -101,6 +101,54 @@ describe('SplitTestMiddleware', function () {
     sinon.assert.calledOnce(this.next)
     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 () {
   it('cached assignment in session is used', async function () {
     this.req.session.cachedSplitTestAssignments = {
     this.req.session.cachedSplitTestAssignments = {
       'ui-overhaul-1': 'cached-variant',
       'ui-overhaul-1': 'cached-variant',