@volontariapp/workers 0.1.1-snap-7bc2fb2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/core/base.worker.d.ts +0 -7
  2. package/dist/core/base.worker.d.ts.map +1 -1
  3. package/dist/core/base.worker.js +0 -94
  4. package/dist/core/base.worker.js.map +1 -1
  5. package/package.json +3 -11
  6. package/dist/data/entities/job-audit.entity.d.ts +0 -15
  7. package/dist/data/entities/job-audit.entity.d.ts.map +0 -1
  8. package/dist/data/entities/job-audit.entity.js +0 -14
  9. package/dist/data/entities/job-audit.entity.js.map +0 -1
  10. package/dist/data/index.d.ts +0 -5
  11. package/dist/data/index.d.ts.map +0 -1
  12. package/dist/data/index.js +0 -5
  13. package/dist/data/index.js.map +0 -1
  14. package/dist/data/models/job-audit.model.d.ts +0 -15
  15. package/dist/data/models/job-audit.model.d.ts.map +0 -1
  16. package/dist/data/models/job-audit.model.js +0 -73
  17. package/dist/data/models/job-audit.model.js.map +0 -1
  18. package/dist/data/repositories/job-audit.repository.d.ts +0 -9
  19. package/dist/data/repositories/job-audit.repository.d.ts.map +0 -1
  20. package/dist/data/repositories/job-audit.repository.js +0 -33
  21. package/dist/data/repositories/job-audit.repository.js.map +0 -1
  22. package/dist/data/types/job-audit.status.d.ts +0 -7
  23. package/dist/data/types/job-audit.status.d.ts.map +0 -1
  24. package/dist/data/types/job-audit.status.js +0 -8
  25. package/dist/data/types/job-audit.status.js.map +0 -1
  26. package/dist/test/data-source.d.ts +0 -5
  27. package/dist/test/data-source.d.ts.map +0 -1
  28. package/dist/test/data-source.js +0 -35
  29. package/dist/test/data-source.js.map +0 -1
  30. package/dist/test/global-setup.d.ts +0 -3
  31. package/dist/test/global-setup.d.ts.map +0 -1
  32. package/dist/test/global-setup.js +0 -46
  33. package/dist/test/global-setup.js.map +0 -1
  34. package/dist/test/migrations/1778328780881-InitialSchemaJobAudit.d.ts +0 -6
  35. package/dist/test/migrations/1778328780881-InitialSchemaJobAudit.d.ts.map +0 -1
  36. package/dist/test/migrations/1778328780881-InitialSchemaJobAudit.js +0 -93
  37. package/dist/test/migrations/1778328780881-InitialSchemaJobAudit.js.map +0 -1
  38. package/dist/test/redis-config.d.ts +0 -3
  39. package/dist/test/redis-config.d.ts.map +0 -1
  40. package/dist/test/redis-config.js +0 -8
  41. package/dist/test/redis-config.js.map +0 -1
  42. package/dist/test/setup.d.ts +0 -2
  43. package/dist/test/setup.d.ts.map +0 -1
  44. package/dist/test/setup.js +0 -2
  45. package/dist/test/setup.js.map +0 -1
  46. package/dist/test/specs/base-worker/base.worker.int.helper.d.ts +0 -9
  47. package/dist/test/specs/base-worker/base.worker.int.helper.d.ts.map +0 -1
  48. package/dist/test/specs/base-worker/base.worker.int.helper.js +0 -14
  49. package/dist/test/specs/base-worker/base.worker.int.helper.js.map +0 -1
  50. package/dist/test/specs/base-worker/base.worker.int.spec.d.ts +0 -2
  51. package/dist/test/specs/base-worker/base.worker.int.spec.d.ts.map +0 -1
  52. package/dist/test/specs/base-worker/base.worker.int.spec.js +0 -499
  53. package/dist/test/specs/base-worker/base.worker.int.spec.js.map +0 -1
  54. package/dist/test/specs/base-worker/base.worker.unit.spec.d.ts +0 -2
  55. package/dist/test/specs/base-worker/base.worker.unit.spec.d.ts.map +0 -1
  56. package/dist/test/specs/base-worker/base.worker.unit.spec.js +0 -265
  57. package/dist/test/specs/base-worker/base.worker.unit.spec.js.map +0 -1
  58. package/dist/test/specs/data/repositories/job-audit.repository.int.spec.d.ts +0 -2
  59. package/dist/test/specs/data/repositories/job-audit.repository.int.spec.d.ts.map +0 -1
  60. package/dist/test/specs/data/repositories/job-audit.repository.int.spec.js +0 -113
  61. package/dist/test/specs/data/repositories/job-audit.repository.int.spec.js.map +0 -1
  62. package/dist/test/specs/data/repositories/job-audit.repository.unit.spec.d.ts +0 -2
  63. package/dist/test/specs/data/repositories/job-audit.repository.unit.spec.d.ts.map +0 -1
  64. package/dist/test/specs/data/repositories/job-audit.repository.unit.spec.js +0 -43
  65. package/dist/test/specs/data/repositories/job-audit.repository.unit.spec.js.map +0 -1
  66. package/dist/test/specs/utils/bull-config.utils.unit.spec.d.ts +0 -2
  67. package/dist/test/specs/utils/bull-config.utils.unit.spec.d.ts.map +0 -1
  68. package/dist/test/specs/utils/bull-config.utils.unit.spec.js +0 -42
  69. package/dist/test/specs/utils/bull-config.utils.unit.spec.js.map +0 -1
  70. package/dist/test/utils/helpers/index.d.ts +0 -3
  71. package/dist/test/utils/helpers/index.d.ts.map +0 -1
  72. package/dist/test/utils/helpers/index.js +0 -3
  73. package/dist/test/utils/helpers/index.js.map +0 -1
  74. package/dist/test/utils/helpers/job/index.d.ts +0 -3
  75. package/dist/test/utils/helpers/job/index.d.ts.map +0 -1
  76. package/dist/test/utils/helpers/job/index.js +0 -3
  77. package/dist/test/utils/helpers/job/index.js.map +0 -1
  78. package/dist/test/utils/helpers/job/test-job.utils.d.ts +0 -6
  79. package/dist/test/utils/helpers/job/test-job.utils.d.ts.map +0 -1
  80. package/dist/test/utils/helpers/job/test-job.utils.js +0 -7
  81. package/dist/test/utils/helpers/job/test-job.utils.js.map +0 -1
  82. package/dist/test/utils/helpers/job/test-worker.utils.d.ts +0 -12
  83. package/dist/test/utils/helpers/job/test-worker.utils.d.ts.map +0 -1
  84. package/dist/test/utils/helpers/job/test-worker.utils.js +0 -14
  85. package/dist/test/utils/helpers/job/test-worker.utils.js.map +0 -1
  86. package/dist/test/utils/helpers/shared/audit-repository.mock.d.ts +0 -4
  87. package/dist/test/utils/helpers/shared/audit-repository.mock.d.ts.map +0 -1
  88. package/dist/test/utils/helpers/shared/audit-repository.mock.js +0 -5
  89. package/dist/test/utils/helpers/shared/audit-repository.mock.js.map +0 -1
  90. package/dist/test/utils/helpers/shared/database-cleanup.helper.d.ts +0 -4
  91. package/dist/test/utils/helpers/shared/database-cleanup.helper.d.ts.map +0 -1
  92. package/dist/test/utils/helpers/shared/database-cleanup.helper.js +0 -14
  93. package/dist/test/utils/helpers/shared/database-cleanup.helper.js.map +0 -1
  94. package/dist/test/utils/helpers/shared/index.d.ts +0 -5
  95. package/dist/test/utils/helpers/shared/index.d.ts.map +0 -1
  96. package/dist/test/utils/helpers/shared/index.js +0 -5
  97. package/dist/test/utils/helpers/shared/index.js.map +0 -1
  98. package/dist/test/utils/helpers/shared/job-audit.factory.d.ts +0 -5
  99. package/dist/test/utils/helpers/shared/job-audit.factory.d.ts.map +0 -1
  100. package/dist/test/utils/helpers/shared/job-audit.factory.js +0 -32
  101. package/dist/test/utils/helpers/shared/job-audit.factory.js.map +0 -1
  102. package/dist/test/utils/helpers/shared/redis-cleanup.helper.d.ts +0 -2
  103. package/dist/test/utils/helpers/shared/redis-cleanup.helper.d.ts.map +0 -1
  104. package/dist/test/utils/helpers/shared/redis-cleanup.helper.js +0 -12
  105. package/dist/test/utils/helpers/shared/redis-cleanup.helper.js.map +0 -1
  106. package/dist/test/utils/index.d.ts +0 -3
  107. package/dist/test/utils/index.d.ts.map +0 -1
  108. package/dist/test/utils/index.js +0 -3
  109. package/dist/test/utils/index.js.map +0 -1
  110. package/dist/test/utils/repositories/index.d.ts +0 -2
  111. package/dist/test/utils/repositories/index.d.ts.map +0 -1
  112. package/dist/test/utils/repositories/index.js +0 -2
  113. package/dist/test/utils/repositories/index.js.map +0 -1
  114. package/dist/test/utils/repositories/job-audit-test.repository.d.ts +0 -7
  115. package/dist/test/utils/repositories/job-audit-test.repository.d.ts.map +0 -1
  116. package/dist/test/utils/repositories/job-audit-test.repository.js +0 -9
  117. package/dist/test/utils/repositories/job-audit-test.repository.js.map +0 -1
@@ -1,499 +0,0 @@
1
- import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach, jest, } from '@jest/globals';
2
- import { Queue } from 'bullmq';
3
- import { databaseMapper } from '@volontariapp/database';
4
- import { createMock } from '@volontariapp/testing';
5
- import { testDataSource, initializeTestDb, closeTestDb } from '../../data-source.js';
6
- import { clearTestDatabase, clearTestRedis } from '../../utils/index.js';
7
- import { JobAuditModel } from '../../../data/models/job-audit.model.js';
8
- import { JobAuditEntity } from '../../../data/entities/job-audit.entity.js';
9
- import { JobAuditStatus } from '../../../data/types/job-audit.status.js';
10
- import { JobAuditRepository } from '../../../data/repositories/job-audit.repository.js';
11
- import { TestWorker } from '../../utils/index.js';
12
- import { testRedisOptions } from '../../redis-config.js';
13
- import { getFirstJob, processJob, processJobExpectError, } from './base.worker.int.helper.js';
14
- describe('BaseWorker — Integration', () => {
15
- let modelRepo;
16
- let auditRepo;
17
- beforeAll(async () => {
18
- databaseMapper.registerBidirectional(JobAuditModel, JobAuditEntity);
19
- await initializeTestDb();
20
- modelRepo = testDataSource.getRepository(JobAuditModel);
21
- auditRepo = new JobAuditRepository(modelRepo);
22
- });
23
- afterAll(async () => {
24
- await closeTestDb();
25
- });
26
- beforeEach(async () => {
27
- await clearTestDatabase(modelRepo);
28
- jest.clearAllMocks();
29
- });
30
- afterEach(async () => {
31
- await clearTestRedis();
32
- jest.restoreAllMocks();
33
- });
34
- describe('Succès — PROCESSING → COMPLETED (Redis)', () => {
35
- it('enregistre audit COMPLETED avec timestamps depuis Redis', async () => {
36
- const jobId = 'int-redis-success-001';
37
- const queue = new Queue('test-success-queue', {
38
- connection: testRedisOptions,
39
- });
40
- const worker = new TestWorker(auditRepo);
41
- worker.processJob.mockResolvedValue(undefined);
42
- try {
43
- await queue.add('SEND_WELCOME_EMAIL', { email: 'test@example.com' }, { jobId });
44
- const jobs = await queue.getJobs(['waiting']);
45
- const job = getFirstJob(jobs);
46
- job.attemptsMade = 0;
47
- const beforeProcess = new Date();
48
- await processJob(worker, job);
49
- const afterProcess = new Date();
50
- const audit = await auditRepo.findByJobId(jobId);
51
- expect(audit).not.toBeNull();
52
- if (audit) {
53
- expect(audit.status).toBe(JobAuditStatus.COMPLETED);
54
- expect(audit.startedAt).toBeDefined();
55
- expect(audit.finishedAt).toBeDefined();
56
- if (audit.startedAt && audit.finishedAt) {
57
- expect(audit.startedAt.getTime()).toBeGreaterThanOrEqual(beforeProcess.getTime());
58
- expect(audit.finishedAt.getTime()).toBeLessThanOrEqual(afterProcess.getTime());
59
- expect(audit.startedAt.getTime()).toBeLessThanOrEqual(audit.finishedAt.getTime());
60
- }
61
- }
62
- }
63
- finally {
64
- await queue.close();
65
- }
66
- });
67
- it('enregistre jobType, workerId, currentAttempt depuis Redis', async () => {
68
- const jobId = 'int-redis-meta-001';
69
- const queue = new Queue('test-meta-queue', {
70
- connection: testRedisOptions,
71
- });
72
- const worker = new TestWorker(auditRepo);
73
- worker.processJob.mockResolvedValue(undefined);
74
- try {
75
- await queue.add('SEND_WELCOME_EMAIL', { email: 'user@test.com' }, { jobId });
76
- const jobs = await queue.getJobs(['waiting']);
77
- expect(jobs).toHaveLength(1);
78
- const job = jobs[0];
79
- job.attemptsMade = 0;
80
- await processJob(worker, job);
81
- const audit = await auditRepo.findByJobId(jobId);
82
- expect(audit).not.toBeNull();
83
- if (audit) {
84
- expect(audit.jobType).toBe('SEND_WELCOME_EMAIL');
85
- expect(audit.workerId).toBeDefined();
86
- expect(typeof audit.workerId).toBe('string');
87
- expect(audit.currentAttempt).toBe(1);
88
- }
89
- }
90
- finally {
91
- await queue.close();
92
- }
93
- });
94
- });
95
- describe('Échec — PROCESSING → FAILED (Redis)', () => {
96
- it('enregistre error_message et error_stack depuis Redis', async () => {
97
- const jobId = 'int-redis-fail-001';
98
- const queue = new Queue('test-fail-queue', {
99
- connection: testRedisOptions,
100
- });
101
- const worker = new TestWorker(auditRepo);
102
- const jobError = new Error('Redis job processing error');
103
- worker.processJob.mockRejectedValue(jobError);
104
- try {
105
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
106
- const jobs = await queue.getJobs(['waiting']);
107
- const job = jobs[0];
108
- job.attemptsMade = 0;
109
- await processJobExpectError(worker, job, jobError);
110
- const audit = await auditRepo.findByJobId(jobId);
111
- expect(audit).not.toBeNull();
112
- if (audit) {
113
- expect(audit.status).toBe(JobAuditStatus.FAILED);
114
- expect(audit.errorMessage).toBe('Redis job processing error');
115
- expect(audit.errorStack).toContain('Error: Redis job processing error');
116
- expect(audit.finishedAt).toBeDefined();
117
- }
118
- }
119
- finally {
120
- await queue.close();
121
- }
122
- });
123
- it('gère string-error (non-Error thrown) depuis Redis', async () => {
124
- const jobId = 'int-redis-fail-string-001';
125
- const queue = new Queue('test-fail-string-queue', {
126
- connection: testRedisOptions,
127
- });
128
- const worker = new TestWorker(auditRepo);
129
- worker.processJob.mockRejectedValue('custom-error-string');
130
- try {
131
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
132
- const jobs = await queue.getJobs(['waiting']);
133
- const job = jobs[0];
134
- job.attemptsMade = 0;
135
- await expect(processJob(worker, job)).rejects.toBe('custom-error-string');
136
- const audit = await auditRepo.findByJobId(jobId);
137
- expect(audit).not.toBeNull();
138
- if (audit) {
139
- expect(audit.status).toBe(JobAuditStatus.FAILED);
140
- expect(audit.errorMessage).toBe('custom-error-string');
141
- expect(audit.errorStack).toBeNull();
142
- }
143
- }
144
- finally {
145
- await queue.close();
146
- }
147
- });
148
- it('enregistre error lors de audit failure (DB failure)', async () => {
149
- const jobId = 'int-redis-audit-fail-001';
150
- const queue = new Queue('test-audit-fail-queue', {
151
- connection: testRedisOptions,
152
- });
153
- const mockAuditRepo = createMock();
154
- mockAuditRepo.findByJobId.mockResolvedValue(null);
155
- mockAuditRepo.upsert.mockResolvedValue({
156
- jobId,
157
- status: JobAuditStatus.PROCESSING,
158
- });
159
- mockAuditRepo.updateWhere.mockRejectedValue(new Error('DB connection lost'));
160
- const worker = new TestWorker(mockAuditRepo);
161
- const jobError = new Error('Job processing failed');
162
- worker.processJob.mockRejectedValue(jobError);
163
- const upsertSpy = jest.spyOn(mockAuditRepo, 'upsert');
164
- const updateWhereSpy = jest.spyOn(mockAuditRepo, 'updateWhere');
165
- try {
166
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
167
- const jobs = await queue.getJobs(['waiting']);
168
- const job = getFirstJob(jobs);
169
- job.attemptsMade = 0;
170
- await expect(processJob(worker, job)).rejects.toThrow('DB connection lost');
171
- expect(upsertSpy).toHaveBeenCalled();
172
- expect(updateWhereSpy).toHaveBeenCalled();
173
- }
174
- finally {
175
- await queue.close();
176
- }
177
- });
178
- });
179
- describe('Retry — Upsert & Increment (Redis)', () => {
180
- it('crée une seule row audit (Redis idempotent COMPLETED)', async () => {
181
- const jobId = 'int-redis-single-row-001';
182
- const queue = new Queue('test-single-row-queue', {
183
- connection: testRedisOptions,
184
- });
185
- const worker = new TestWorker(auditRepo);
186
- worker.processJob.mockResolvedValue(undefined);
187
- const processJobSpy = jest.spyOn(worker, 'processJob');
188
- try {
189
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
190
- let jobs = await queue.getJobs(['waiting']);
191
- let job = jobs[0];
192
- job.attemptsMade = 0;
193
- await processJob(worker, job);
194
- const allAudits = await modelRepo.find({ where: { jobId } });
195
- expect(allAudits).toHaveLength(1);
196
- expect(allAudits[0].status).toBe(JobAuditStatus.COMPLETED);
197
- processJobSpy.mockClear();
198
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
199
- jobs = await queue.getJobs(['waiting']);
200
- job = getFirstJob(jobs);
201
- job.attemptsMade = 1;
202
- await processJob(worker, job);
203
- const finalAudits = await modelRepo.find({ where: { jobId } });
204
- expect(finalAudits).toHaveLength(1);
205
- expect(finalAudits[0].status).toBe(JobAuditStatus.COMPLETED);
206
- expect(processJobSpy).not.toHaveBeenCalled();
207
- }
208
- finally {
209
- await queue.close();
210
- }
211
- });
212
- it('incrémente currentAttempt basé sur job.attemptsMade depuis Redis', async () => {
213
- const jobId = 'int-redis-attempt-increment-001';
214
- const queue = new Queue('test-attempt-queue', {
215
- connection: testRedisOptions,
216
- });
217
- const worker = new TestWorker(auditRepo);
218
- worker.processJob.mockResolvedValue(undefined);
219
- const processJobSpy = jest.spyOn(worker, 'processJob');
220
- try {
221
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
222
- let jobs = await queue.getJobs(['waiting']);
223
- let job = jobs[0];
224
- job.attemptsMade = 0;
225
- await processJob(worker, job);
226
- let audit = await auditRepo.findByJobId(jobId);
227
- expect(audit?.currentAttempt).toBe(1);
228
- expect(audit?.status).toBe(JobAuditStatus.COMPLETED);
229
- processJobSpy.mockClear();
230
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
231
- jobs = await queue.getJobs(['waiting']);
232
- job = getFirstJob(jobs);
233
- job.attemptsMade = 1;
234
- await processJob(worker, job);
235
- audit = await auditRepo.findByJobId(jobId);
236
- expect(audit?.currentAttempt).toBe(1);
237
- expect(audit?.status).toBe(JobAuditStatus.COMPLETED);
238
- expect(processJobSpy).not.toHaveBeenCalled();
239
- }
240
- finally {
241
- await queue.close();
242
- }
243
- });
244
- });
245
- describe('Graceful Degradation', () => {
246
- it("fonctionne sans auditRepo (pas d'audit créé)", async () => {
247
- const jobId = 'int-redis-no-audit-001';
248
- const queue = new Queue('test-no-audit-queue', {
249
- connection: testRedisOptions,
250
- });
251
- const worker = new TestWorker();
252
- worker.processJob.mockResolvedValue(undefined);
253
- const processJobSpy = jest.spyOn(worker, 'processJob');
254
- try {
255
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
256
- const jobs = await queue.getJobs(['waiting']);
257
- const job = jobs[0];
258
- job.attemptsMade = 0;
259
- await expect(worker.process(job)).resolves.toBeUndefined();
260
- const allAudits = await modelRepo.find({ where: { jobId } });
261
- expect(allAudits).toHaveLength(0);
262
- expect(processJobSpy).toHaveBeenCalledTimes(1);
263
- }
264
- finally {
265
- await queue.close();
266
- }
267
- });
268
- it('fonctionne sans job.id (graceful skip)', async () => {
269
- const jobId = 'int-redis-no-id-001';
270
- const queue = new Queue('test-no-id-queue', {
271
- connection: testRedisOptions,
272
- });
273
- const worker = new TestWorker(auditRepo);
274
- worker.processJob.mockResolvedValue(undefined);
275
- const processJobSpy = jest.spyOn(worker, 'processJob');
276
- try {
277
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
278
- const jobs = await queue.getJobs(['waiting']);
279
- const job = jobs[0];
280
- job.attemptsMade = 0;
281
- job.id = undefined;
282
- await expect(worker.process(job)).resolves.toBeUndefined();
283
- const allAudits = await modelRepo.find({ where: { jobId } });
284
- expect(allAudits).toHaveLength(0);
285
- expect(processJobSpy).toHaveBeenCalledTimes(1);
286
- }
287
- finally {
288
- await queue.close();
289
- }
290
- });
291
- });
292
- describe('Timestamp Consistency (Redis)', () => {
293
- it('timestamps cohérents depuis Redis', async () => {
294
- const jobId = 'int-redis-ts-001';
295
- const queue = new Queue('test-ts-queue', {
296
- connection: testRedisOptions,
297
- });
298
- const worker = new TestWorker(auditRepo);
299
- worker.processJob.mockResolvedValue(undefined);
300
- try {
301
- const beforeStart = new Date();
302
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
303
- const jobs = await queue.getJobs(['waiting']);
304
- const job = jobs[0];
305
- job.attemptsMade = 0;
306
- await processJob(worker, job);
307
- const afterEnd = new Date();
308
- const audit = await auditRepo.findByJobId(jobId);
309
- expect(audit).not.toBeNull();
310
- if (audit) {
311
- expect(audit.startedAt).toBeDefined();
312
- expect(audit.finishedAt).toBeDefined();
313
- if (audit.startedAt && audit.finishedAt) {
314
- expect(audit.startedAt.getTime()).toBeGreaterThanOrEqual(beforeStart.getTime());
315
- expect(audit.finishedAt.getTime()).toBeLessThanOrEqual(afterEnd.getTime());
316
- expect(audit.startedAt.getTime()).toBeLessThanOrEqual(audit.finishedAt.getTime());
317
- }
318
- }
319
- }
320
- finally {
321
- await queue.close();
322
- }
323
- });
324
- });
325
- describe('Idempotence — Job déjà COMPLETED (Redis)', () => {
326
- it('ignore processJob si statut COMPLETED depuis Redis', async () => {
327
- const jobId = 'int-redis-idempotent-001';
328
- const queue = new Queue('test-idempotent-queue', {
329
- connection: testRedisOptions,
330
- });
331
- const worker = new TestWorker(auditRepo);
332
- worker.processJob.mockResolvedValue(undefined);
333
- const processJobSpy = jest.spyOn(worker, 'processJob');
334
- try {
335
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
336
- let jobs = await queue.getJobs(['waiting']);
337
- let job = jobs[0];
338
- job.attemptsMade = 0;
339
- await processJob(worker, job);
340
- let audit = await auditRepo.findByJobId(jobId);
341
- expect(audit?.status).toBe(JobAuditStatus.COMPLETED);
342
- processJobSpy.mockClear();
343
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
344
- jobs = await queue.getJobs(['waiting']);
345
- job = getFirstJob(jobs);
346
- job.attemptsMade = 1;
347
- await processJob(worker, job);
348
- expect(processJobSpy).not.toHaveBeenCalled();
349
- audit = await auditRepo.findByJobId(jobId);
350
- expect(audit?.status).toBe(JobAuditStatus.COMPLETED);
351
- const allAudits = await modelRepo.find({ where: { jobId } });
352
- expect(allAudits).toHaveLength(1);
353
- }
354
- finally {
355
- await queue.close();
356
- }
357
- });
358
- it('log warning quand job déjà complété depuis Redis', async () => {
359
- const jobId = 'int-redis-idempotent-warn-001';
360
- const queue = new Queue('test-idempotent-warn-queue', {
361
- connection: testRedisOptions,
362
- });
363
- const worker = new TestWorker(auditRepo);
364
- worker.processJob.mockResolvedValue(undefined);
365
- const warnSpy = jest.spyOn(worker.logger, 'warn');
366
- try {
367
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
368
- let jobs = await queue.getJobs(['waiting']);
369
- let job = jobs[0];
370
- job.attemptsMade = 0;
371
- await processJob(worker, job);
372
- warnSpy.mockClear();
373
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
374
- jobs = await queue.getJobs(['waiting']);
375
- job = getFirstJob(jobs);
376
- job.attemptsMade = 1;
377
- await processJob(worker, job);
378
- expect(warnSpy).toHaveBeenCalledWith('Job already processed, skipping', {
379
- jobId,
380
- type: 'SEND_WELCOME_EMAIL',
381
- });
382
- }
383
- finally {
384
- await queue.close();
385
- }
386
- });
387
- });
388
- describe('Audit failure resilience (Redis)', () => {
389
- it('rejette si updateWhere échoue après succès depuis Redis', async () => {
390
- const jobId = 'int-redis-audit-fail-success-001';
391
- const queue = new Queue('test-audit-fail-success-queue', {
392
- connection: testRedisOptions,
393
- });
394
- const mockAuditRepo = createMock();
395
- mockAuditRepo.findByJobId.mockResolvedValue(null);
396
- mockAuditRepo.upsert.mockResolvedValue({
397
- jobId,
398
- status: JobAuditStatus.PROCESSING,
399
- });
400
- mockAuditRepo.updateWhere.mockImplementation((_where, data) => {
401
- if (data.status === JobAuditStatus.COMPLETED) {
402
- throw new Error('DB failure on COMPLETED update');
403
- }
404
- return Promise.resolve({});
405
- });
406
- const worker = new TestWorker(mockAuditRepo);
407
- worker.processJob.mockResolvedValue(undefined);
408
- const upsertSpy = jest.spyOn(mockAuditRepo, 'upsert');
409
- const updateWhereSpy = jest.spyOn(mockAuditRepo, 'updateWhere');
410
- const processJobSpy = jest.spyOn(worker, 'processJob');
411
- try {
412
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
413
- const jobs = await queue.getJobs(['waiting']);
414
- const job = jobs[0];
415
- job.attemptsMade = 0;
416
- await expect(worker.process(job)).rejects.toThrow('DB failure on COMPLETED update');
417
- expect(upsertSpy).toHaveBeenCalled();
418
- expect(updateWhereSpy).toHaveBeenCalled();
419
- expect(processJobSpy).toHaveBeenCalledTimes(1);
420
- }
421
- finally {
422
- await queue.close();
423
- }
424
- });
425
- it('rejette si updateWhere échoue lors de failure depuis Redis', async () => {
426
- const jobId = 'int-redis-audit-fail-failure-001';
427
- const queue = new Queue('test-audit-fail-failure-queue', {
428
- connection: testRedisOptions,
429
- });
430
- const jobError = new Error('Job processing failed');
431
- const mockAuditRepo = createMock();
432
- mockAuditRepo.findByJobId.mockResolvedValue(null);
433
- mockAuditRepo.upsert.mockResolvedValue({
434
- jobId,
435
- status: JobAuditStatus.PROCESSING,
436
- });
437
- mockAuditRepo.updateWhere.mockImplementation((_where, data) => {
438
- if (data.status === JobAuditStatus.FAILED) {
439
- throw new Error('DB failure on FAILED update');
440
- }
441
- return Promise.resolve({});
442
- });
443
- const worker = new TestWorker(mockAuditRepo);
444
- worker.processJob.mockRejectedValue(jobError);
445
- const upsertSpy = jest.spyOn(mockAuditRepo, 'upsert');
446
- const updateWhereSpy = jest.spyOn(mockAuditRepo, 'updateWhere');
447
- const processJobSpy = jest.spyOn(worker, 'processJob');
448
- try {
449
- await queue.add('SEND_WELCOME_EMAIL', {}, { jobId });
450
- const jobs = await queue.getJobs(['waiting']);
451
- const job = jobs[0];
452
- job.attemptsMade = 0;
453
- let thrown;
454
- try {
455
- await worker.process(job);
456
- }
457
- catch (error) {
458
- thrown = error;
459
- }
460
- expect(thrown instanceof Error && thrown.message).toBe('DB failure on FAILED update');
461
- expect(upsertSpy).toHaveBeenCalled();
462
- expect(updateWhereSpy).toHaveBeenCalled();
463
- expect(processJobSpy).toHaveBeenCalledTimes(1);
464
- }
465
- finally {
466
- await queue.close();
467
- }
468
- });
469
- });
470
- describe('Type de Job Invalide (Redis)', () => {
471
- it("traite job de type différent sans corrompre l'audit depuis Redis", async () => {
472
- const jobId = 'int-redis-wrong-type-001';
473
- const queue = new Queue('test-wrong-type-queue', {
474
- connection: testRedisOptions,
475
- });
476
- const worker = new TestWorker(auditRepo);
477
- worker.processJob.mockResolvedValue(undefined);
478
- const processJobSpy = jest.spyOn(worker, 'processJob');
479
- try {
480
- await queue.add('DIFFERENT_JOB_TYPE', {}, { jobId });
481
- const jobs = await queue.getJobs(['waiting']);
482
- const job = jobs[0];
483
- job.attemptsMade = 0;
484
- await processJob(worker, job);
485
- const audit = await auditRepo.findByJobId(jobId);
486
- expect(audit).not.toBeNull();
487
- if (audit) {
488
- expect(audit.status).toBe(JobAuditStatus.COMPLETED);
489
- expect(audit.jobType).toBe('DIFFERENT_JOB_TYPE');
490
- }
491
- expect(processJobSpy).toHaveBeenCalledTimes(1);
492
- }
493
- finally {
494
- await queue.close();
495
- }
496
- });
497
- });
498
- });
499
- //# sourceMappingURL=base.worker.int.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.worker.int.spec.js","sourceRoot":"","sources":["../../../../src/test/specs/base-worker/base.worker.int.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=base.worker.unit.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.worker.unit.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/specs/base-worker/base.worker.unit.spec.ts"],"names":[],"mappings":""}