|
1 | 1 | import { test } from '@japa/runner' |
2 | 2 | import { setTimeout } from 'node:timers/promises' |
3 | 3 | import { Worker } from '../src/worker.js' |
4 | | -import { memory } from './_mocks/memory_adapter.js' |
| 4 | +import { MemoryAdapter, memory } from './_mocks/memory_adapter.js' |
5 | 5 | import { ChaosAdapter } from './_mocks/chaos_adapter.js' |
6 | 6 | import type { QueueManagerConfig } from '../src/types/main.js' |
7 | 7 | import { Locator } from '../src/locator.js' |
8 | 8 | import { Job } from '../src/job.js' |
| 9 | +import { QueueManager } from '../src/queue_manager.js' |
9 | 10 | import * as errors from '../src/exceptions.js' |
10 | 11 |
|
11 | 12 | const config = { |
12 | 13 | default: 'memory', |
13 | 14 | adapters: { memory: memory() }, |
14 | 15 | } satisfies QueueManagerConfig |
15 | 16 |
|
| 17 | +class DestroyAwareMemoryAdapter extends MemoryAdapter { |
| 18 | + destroyed = false |
| 19 | + |
| 20 | + override async pushOn(...args: Parameters<MemoryAdapter['pushOn']>) { |
| 21 | + if (this.destroyed) { |
| 22 | + throw new Error('adapter is destroyed') |
| 23 | + } |
| 24 | + |
| 25 | + return super.pushOn(...args) |
| 26 | + } |
| 27 | + |
| 28 | + override destroy(): Promise<void> { |
| 29 | + this.destroyed = true |
| 30 | + |
| 31 | + return super.destroy() |
| 32 | + } |
| 33 | +} |
| 34 | + |
16 | 35 | test.group('Worker', () => { |
17 | 36 | test('should create a worker with a unique worker ID', ({ assert, cleanup }) => { |
18 | 37 | const worker1 = new Worker(config) |
@@ -773,6 +792,50 @@ test.group('Worker', () => { |
773 | 792 | assert.isTrue(jobCompleted, 'Job should have completed before worker stopped') |
774 | 793 | }) |
775 | 794 |
|
| 795 | + test('should not destroy the shared adapter when stopping', async ({ assert, cleanup }) => { |
| 796 | + const adapters: DestroyAwareMemoryAdapter[] = [] |
| 797 | + |
| 798 | + const localConfig = { |
| 799 | + default: 'memory', |
| 800 | + adapters: { |
| 801 | + memory: () => { |
| 802 | + const adapter = new DestroyAwareMemoryAdapter() |
| 803 | + adapters.push(adapter) |
| 804 | + return adapter |
| 805 | + }, |
| 806 | + }, |
| 807 | + } |
| 808 | + |
| 809 | + const worker = new Worker(localConfig) |
| 810 | + |
| 811 | + cleanup(async () => { |
| 812 | + await QueueManager.destroy() |
| 813 | + }) |
| 814 | + |
| 815 | + await worker.init() |
| 816 | + |
| 817 | + const firstAdapter = QueueManager.use() |
| 818 | + |
| 819 | + await worker.stop() |
| 820 | + |
| 821 | + const secondAdapter = QueueManager.use() |
| 822 | + |
| 823 | + assert.strictEqual(secondAdapter, firstAdapter) |
| 824 | + assert.equal(adapters.length, 1) |
| 825 | + assert.isFalse(adapters[0].destroyed) |
| 826 | + |
| 827 | + await secondAdapter.pushOn('default', { |
| 828 | + id: 'post-stop-job', |
| 829 | + name: 'TestJob', |
| 830 | + payload: {}, |
| 831 | + attempts: 0, |
| 832 | + }) |
| 833 | + |
| 834 | + await QueueManager.destroy() |
| 835 | + |
| 836 | + assert.isTrue(adapters[0].destroyed) |
| 837 | + }) |
| 838 | + |
776 | 839 | test('should handle job that fails permanently', async ({ assert, cleanup }) => { |
777 | 840 | let failedCalled = false |
778 | 841 |
|
|
0 commit comments