SplitTestMiddleware.test.mjs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { vi } from 'vitest'
  2. import sinon from 'sinon'
  3. import MockResponse from '../helpers/MockResponse.js'
  4. import MockRequest from '../helpers/MockRequest.js'
  5. const modulePath = '../../../../app/src/Features/SplitTests/SplitTestMiddleware'
  6. describe('SplitTestMiddleware', function () {
  7. beforeEach(async function (ctx) {
  8. vi.doMock(
  9. '../../../../app/src/Features/SplitTests/SplitTestHandler.js',
  10. () => ({
  11. default: (ctx.SplitTestHandler = {
  12. promises: {
  13. getAssignment: sinon.stub().resolves(),
  14. },
  15. }),
  16. })
  17. )
  18. ctx.SplitTestMiddleware = (await import(modulePath)).default
  19. ctx.req = new MockRequest()
  20. ctx.res = new MockResponse()
  21. ctx.next = sinon.stub()
  22. })
  23. it('assign multiple split test variants in locals', async function (ctx) {
  24. ctx.SplitTestHandler.promises.getAssignment
  25. .withArgs(ctx.req, 'ui-overhaul')
  26. .resolves({
  27. variant: 'default',
  28. })
  29. ctx.SplitTestHandler.promises.getAssignment
  30. .withArgs(ctx.req, 'other-test')
  31. .resolves({
  32. variant: 'foobar',
  33. })
  34. const middleware = ctx.SplitTestMiddleware.loadAssignmentsInLocals([
  35. 'ui-overhaul',
  36. 'other-test',
  37. ])
  38. await middleware(ctx.req, ctx.res, ctx.next)
  39. sinon.assert.calledWith(
  40. ctx.SplitTestHandler.promises.getAssignment,
  41. ctx.req,
  42. ctx.res,
  43. 'ui-overhaul'
  44. )
  45. sinon.assert.calledWith(
  46. ctx.SplitTestHandler.promises.getAssignment,
  47. ctx.req,
  48. ctx.res,
  49. 'other-test'
  50. )
  51. sinon.assert.calledOnce(ctx.next)
  52. })
  53. it('assign no split test variant in locals', async function (ctx) {
  54. const middleware = ctx.SplitTestMiddleware.loadAssignmentsInLocals([])
  55. await middleware(ctx.req, ctx.res, ctx.next)
  56. sinon.assert.notCalled(ctx.SplitTestHandler.promises.getAssignment)
  57. sinon.assert.calledOnce(ctx.next)
  58. })
  59. it('exception thrown by assignment does not fail the request', async function (ctx) {
  60. ctx.SplitTestHandler.promises.getAssignment
  61. .withArgs(ctx.req, ctx.res, 'some-test')
  62. .throws(new Error('failure'))
  63. const middleware = ctx.SplitTestMiddleware.loadAssignmentsInLocals([
  64. 'some-test',
  65. ])
  66. await middleware(ctx.req, ctx.res, ctx.next)
  67. sinon.assert.calledWith(
  68. ctx.SplitTestHandler.promises.getAssignment,
  69. ctx.req,
  70. ctx.res,
  71. 'some-test'
  72. )
  73. sinon.assert.calledOnce(ctx.next)
  74. })
  75. })