| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- import { vi, expect } from 'vitest'
- import Path from 'node:path'
- import sinon from 'sinon'
- import mongodb from 'mongodb-legacy'
- const { ObjectId } = mongodb
- const MODULE_PATH = Path.join(
- import.meta.dirname,
- '../../../../app/src/Features/SplitTests/SplitTestSessionHandler'
- )
- describe('SplitTestSessionHandler', function () {
- beforeEach(async function (ctx) {
- ctx.SplitTestCache = {
- get: sinon.stub().resolves(),
- }
- ctx.SplitTestUserGetter = {}
- ctx.Metrics = {}
- ctx.SplitTestCache.get = sinon.stub().resolves(
- new Map(
- Object.entries({
- 'anon-test-1': {
- _id: '661f92a4669764bb03f73e37',
- name: 'anon-test-1',
- versions: [
- {
- versionNumber: 1,
- variants: [
- {
- name: 'enabled',
- },
- ],
- },
- ],
- },
- 'anon-test-2': {
- _id: '661f92a9d68ea711d6bf2df4',
- name: 'anon-test-2',
- versions: [
- {
- versionNumber: 1,
- variants: [
- {
- name: 'v-1',
- },
- {
- name: 'v-2',
- },
- ],
- },
- ],
- },
- })
- )
- )
- vi.doMock('../../../../app/src/Features/SplitTests/SplitTestCache', () => ({
- default: ctx.SplitTestCache,
- }))
- vi.doMock(
- '../../../../app/src/Features/SplitTests/SplitTestUserGetter',
- () => ({
- default: ctx.SplitTestUserGetter,
- })
- )
- vi.doMock('@overleaf/metrics', () => ({
- default: ctx.Metrics,
- }))
- vi.doMock('mongodb-legacy', () => ({
- default: { ObjectId },
- }))
- ctx.SplitTestSessionHandler = (await import(MODULE_PATH)).default
- })
- it('should read from the splitTests field', async function (ctx) {
- const session = {
- splitTests: {
- 'anon-test-1': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712872800000), // 2024-04-11 22:00:00
- },
- ],
- 'anon-test-2': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712307600000), // 2024-04-05 09:00:00
- },
- {
- variantName: 'v-2',
- versionNumber: 2,
- phase: 'release',
- assignedAt: new Date(1712581200000), // 2024-04-08 13:00:00
- },
- ],
- },
- sta: ``,
- }
- const assignments =
- await ctx.SplitTestSessionHandler.promises.getAssignments(session)
- expect(assignments).to.deep.equal({
- 'anon-test-1': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712872800000),
- },
- ],
- 'anon-test-2': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712307600000),
- },
- {
- variantName: 'v-2',
- versionNumber: 2,
- phase: 'release',
- assignedAt: new Date(1712581200000),
- },
- ],
- })
- })
- it('should read from the sta field', async function (ctx) {
- ctx.SplitTestCache.get = sinon.stub().resolves(
- new Map(
- Object.entries({
- 'anon-test-1': {
- _id: '661f92a4669764bb03f73e37',
- name: 'anon-test-1',
- versions: [
- {
- versionNumber: 1,
- variants: [
- {
- name: 'enabled',
- },
- ],
- },
- ],
- },
- 'anon-test-2': {
- _id: '661f92a9d68ea711d6bf2df4',
- name: 'anon-test-2',
- versions: [
- {
- versionNumber: 1,
- variants: [
- {
- name: 'v-1',
- },
- {
- name: 'v-2',
- },
- ],
- },
- ],
- },
- })
- )
- )
- const session = {
- sta: `Zh+SpGaXZLsD9z43_1=d:sbrvs0;Zh+SqdaOpxHWvy30_1=d:sbtqg0;Zh+SqdaOpxHWvy30_2=1:sbsi00`,
- }
- const assignments =
- await ctx.SplitTestSessionHandler.promises.getAssignments(session)
- expect(assignments).to.deep.equal({
- 'anon-test-1': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712829600000),
- },
- ],
- 'anon-test-2': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712916000000),
- },
- {
- variantName: 'v-2',
- versionNumber: 2,
- phase: 'release',
- assignedAt: new Date(1712858400000),
- },
- ],
- })
- })
- it('should deduplicate entries from the sta field', async function (ctx) {
- ctx.SplitTestCache.get = sinon.stub().resolves(
- new Map(
- Object.entries({
- 'anon-test-1': {
- _id: '661f92a4669764bb03f73e37',
- name: 'anon-test-1',
- versions: [
- {
- versionNumber: 1,
- variants: [
- {
- name: 'enabled',
- },
- ],
- },
- ],
- },
- 'anon-test-2': {
- _id: '661f92a9d68ea711d6bf2df4',
- name: 'anon-test-2',
- versions: [
- {
- versionNumber: 1,
- variants: [
- {
- name: 'v-1',
- },
- {
- name: 'v-2',
- },
- ],
- },
- ],
- },
- })
- )
- )
- const session = {
- sta: `Zh+SpGaXZLsD9z43_1=d:sbrvs0;Zh+SqdaOpxHWvy30_1=d:sbtqg0;Zh+SqdaOpxHWvy30_1=d:sbtqg0;Zh+SpGaXZLsD9z43_1=d:sbrvs0;Zh+SqdaOpxHWvy30_2=1:sbsi00;Zh+SqdaOpxHWvy30_1=d:sbtqg0`,
- }
- const assignments =
- await ctx.SplitTestSessionHandler.promises.getAssignments(session)
- expect(assignments).to.deep.equal({
- 'anon-test-1': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712829600000),
- },
- ],
- 'anon-test-2': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712916000000),
- },
- {
- variantName: 'v-2',
- versionNumber: 2,
- phase: 'release',
- assignedAt: new Date(1712858400000),
- },
- ],
- })
- })
- it('should merge assignments from both splitTests and sta fields', async function (ctx) {
- const session = {
- splitTests: {
- 'anon-test-1': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712872800000),
- },
- ],
- 'anon-test-2': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712307600000),
- },
- ],
- },
- sta: `Zh+SqdaOpxHWvy30_2=1:sbsi00`,
- }
- const assignments =
- await ctx.SplitTestSessionHandler.promises.getAssignments(session)
- expect(assignments).to.deep.equal({
- 'anon-test-1': [
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712872800000),
- },
- ],
- 'anon-test-2': [
- {
- variantName: 'v-2',
- versionNumber: 2,
- phase: 'release',
- assignedAt: new Date(1712858400000),
- },
- {
- variantName: 'default',
- versionNumber: 1,
- phase: 'release',
- assignedAt: new Date(1712307600000),
- },
- ],
- })
- })
- })
|