eletrotupi / tcc/ api/tests/mocks/queue.tsc901c35af9c84b6a29e5185545ced1129f33b8f4
1.4 KB | 60 lines Raw
1
import { vi } from 'vitest'
2

3
export type RecordedJob = {
4
  queue: string
5
  name: string
6
  data: unknown
7
  options?: unknown
8
}
9

10
// Every job enqueued through a mocked queue lands here, so specs can assert
11
// on what the controllers/services scheduled without a real Valkey
12
export const recordedJobs: RecordedJob[] = []
13

14
function createQueueMock(name: string) {
15
  return {
16
    name,
17

18
    add: vi.fn(async (jobName: string, data: unknown, options?: unknown) => {
19
      recordedJobs.push({ queue: name, name: jobName, data, options })
20

21
      return {}
22
    }),
23

24
    addBulk: vi.fn(async (jobs: { name: string; data: unknown; opts?: unknown }[] = []) => {
25
      for (const job of jobs) {
26
        recordedJobs.push({
27
          queue: name,
28
          name: job.name,
29
          data: job.data,
30
          options: job.opts
31
        })
32
      }
33
      return []
34
    }),
35

36
    getRepeatableJobs: vi.fn(async () => []),
37
    removeRepeatableByKey: vi.fn(async () => undefined),
38
  }
39
}
40

41
const queues = new Map<string, ReturnType<typeof createQueueMock>>()
42

43
export function getQueueMock(name: string) {
44
  if (!queues.has(name)) {
45
    queues.set(name, createQueueMock(name))
46
  }
47

48
  return queues.get(name)!
49
}
50

51
export function resetQueueMocks() {
52
  recordedJobs.length = 0
53

54
  for (const queue of queues.values()) {
55
    queue.add.mockClear()
56
    queue.addBulk.mockClear()
57
    queue.getRepeatableJobs.mockClear()
58
    queue.removeRepeatableByKey.mockClear()
59
  }
60
}