Skip to content

Test a queue worker

Queue workers also have two useful levels:

  • createQueueWorkerContextMock(...) for direct handler tests
  • createQueueWorkerTestHarness(...) for one real worker cycle

Handler test

Use the context mock when you want to focus on the worker logic itself.

ts
import { createQueueWorkerContextMock } from '@purista/core'

const mock = createQueueWorkerContextMock(pingJobWorkerQueueWorkerBuilder, {
  queueName: 'pingJob',
  payload: { ping: 'queued ping' },
  parameter: { requestId: 'req-1' },
})

const definition = await pingJobWorkerQueueWorkerBuilder.getDefinition()
await definition.handler(mock.context, mock.message)

expect(mock.stubs.job.complete.calledOnce).toBe(true)

Use this level when you want to verify:

  • job completion or retry logic
  • resource usage
  • handler branching

Runtime test

Use the harness when you want to verify the real worker runtime path.

ts
import { createQueueWorkerTestHarness } from '@purista/core'

const harness = await createQueueWorkerTestHarness(pingV1Service, pingJobWorkerQueueWorkerBuilder)

try {
  const result = await harness.run({
    id: 'job-1',
    queueName: 'pingJob',
    payload: { ping: 'queued ping' },
    parameter: { requestId: 'req-1' },
    headers: {},
    createdAt: Date.now(),
    attempt: 1,
    maxAttempts: 3,
    leaseExpiresAt: Date.now() + 60_000,
    leaseTtlMs: 60_000,
    traceId: 'trace-1',
    correlationId: 'corr-1',
  })

  expect(result.ackCalls).toHaveLength(1)
  expect(result.deadLetterCalls).toHaveLength(0)
} finally {
  await harness.destroy()
}

Use this level when you want to verify:

  • before and after guards
  • queue bridge acknowledgements
  • retry or dead-letter behavior