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

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 +7 -0
  2. package/dist/core/base.worker.d.ts.map +1 -1
  3. package/dist/core/base.worker.js +94 -0
  4. package/dist/core/base.worker.js.map +1 -1
  5. package/dist/data/entities/job-audit.entity.d.ts +15 -0
  6. package/dist/data/entities/job-audit.entity.d.ts.map +1 -0
  7. package/dist/data/entities/job-audit.entity.js +14 -0
  8. package/dist/data/entities/job-audit.entity.js.map +1 -0
  9. package/dist/data/index.d.ts +5 -0
  10. package/dist/data/index.d.ts.map +1 -0
  11. package/dist/data/index.js +5 -0
  12. package/dist/data/index.js.map +1 -0
  13. package/dist/data/models/job-audit.model.d.ts +15 -0
  14. package/dist/data/models/job-audit.model.d.ts.map +1 -0
  15. package/dist/data/models/job-audit.model.js +73 -0
  16. package/dist/data/models/job-audit.model.js.map +1 -0
  17. package/dist/data/repositories/job-audit.repository.d.ts +9 -0
  18. package/dist/data/repositories/job-audit.repository.d.ts.map +1 -0
  19. package/dist/data/repositories/job-audit.repository.js +33 -0
  20. package/dist/data/repositories/job-audit.repository.js.map +1 -0
  21. package/dist/data/types/job-audit.status.d.ts +7 -0
  22. package/dist/data/types/job-audit.status.d.ts.map +1 -0
  23. package/dist/data/types/job-audit.status.js +8 -0
  24. package/dist/data/types/job-audit.status.js.map +1 -0
  25. package/dist/test/data-source.d.ts +5 -0
  26. package/dist/test/data-source.d.ts.map +1 -0
  27. package/dist/test/data-source.js +35 -0
  28. package/dist/test/data-source.js.map +1 -0
  29. package/dist/test/global-setup.d.ts +3 -0
  30. package/dist/test/global-setup.d.ts.map +1 -0
  31. package/dist/test/global-setup.js +46 -0
  32. package/dist/test/global-setup.js.map +1 -0
  33. package/dist/test/migrations/1778328780881-InitialSchemaJobAudit.d.ts +6 -0
  34. package/dist/test/migrations/1778328780881-InitialSchemaJobAudit.d.ts.map +1 -0
  35. package/dist/test/migrations/1778328780881-InitialSchemaJobAudit.js +93 -0
  36. package/dist/test/migrations/1778328780881-InitialSchemaJobAudit.js.map +1 -0
  37. package/dist/test/redis-config.d.ts +3 -0
  38. package/dist/test/redis-config.d.ts.map +1 -0
  39. package/dist/test/redis-config.js +8 -0
  40. package/dist/test/redis-config.js.map +1 -0
  41. package/dist/test/setup.d.ts +2 -0
  42. package/dist/test/setup.d.ts.map +1 -0
  43. package/dist/test/setup.js +2 -0
  44. package/dist/test/setup.js.map +1 -0
  45. package/dist/test/specs/base-worker/base.worker.int.helper.d.ts +9 -0
  46. package/dist/test/specs/base-worker/base.worker.int.helper.d.ts.map +1 -0
  47. package/dist/test/specs/base-worker/base.worker.int.helper.js +14 -0
  48. package/dist/test/specs/base-worker/base.worker.int.helper.js.map +1 -0
  49. package/dist/test/specs/base-worker/base.worker.int.spec.d.ts +2 -0
  50. package/dist/test/specs/base-worker/base.worker.int.spec.d.ts.map +1 -0
  51. package/dist/test/specs/base-worker/base.worker.int.spec.js +499 -0
  52. package/dist/test/specs/base-worker/base.worker.int.spec.js.map +1 -0
  53. package/dist/test/specs/base-worker/base.worker.unit.spec.d.ts +2 -0
  54. package/dist/test/specs/base-worker/base.worker.unit.spec.d.ts.map +1 -0
  55. package/dist/test/specs/base-worker/base.worker.unit.spec.js +265 -0
  56. package/dist/test/specs/base-worker/base.worker.unit.spec.js.map +1 -0
  57. package/dist/test/specs/data/repositories/job-audit.repository.int.spec.d.ts +2 -0
  58. package/dist/test/specs/data/repositories/job-audit.repository.int.spec.d.ts.map +1 -0
  59. package/dist/test/specs/data/repositories/job-audit.repository.int.spec.js +113 -0
  60. package/dist/test/specs/data/repositories/job-audit.repository.int.spec.js.map +1 -0
  61. package/dist/test/specs/data/repositories/job-audit.repository.unit.spec.d.ts +2 -0
  62. package/dist/test/specs/data/repositories/job-audit.repository.unit.spec.d.ts.map +1 -0
  63. package/dist/test/specs/data/repositories/job-audit.repository.unit.spec.js +43 -0
  64. package/dist/test/specs/data/repositories/job-audit.repository.unit.spec.js.map +1 -0
  65. package/dist/test/specs/utils/bull-config.utils.unit.spec.d.ts +2 -0
  66. package/dist/test/specs/utils/bull-config.utils.unit.spec.d.ts.map +1 -0
  67. package/dist/test/specs/utils/bull-config.utils.unit.spec.js +42 -0
  68. package/dist/test/specs/utils/bull-config.utils.unit.spec.js.map +1 -0
  69. package/dist/test/utils/helpers/index.d.ts +3 -0
  70. package/dist/test/utils/helpers/index.d.ts.map +1 -0
  71. package/dist/test/utils/helpers/index.js +3 -0
  72. package/dist/test/utils/helpers/index.js.map +1 -0
  73. package/dist/test/utils/helpers/job/index.d.ts +3 -0
  74. package/dist/test/utils/helpers/job/index.d.ts.map +1 -0
  75. package/dist/test/utils/helpers/job/index.js +3 -0
  76. package/dist/test/utils/helpers/job/index.js.map +1 -0
  77. package/dist/test/utils/helpers/job/test-job.utils.d.ts +6 -0
  78. package/dist/test/utils/helpers/job/test-job.utils.d.ts.map +1 -0
  79. package/dist/test/utils/helpers/job/test-job.utils.js +7 -0
  80. package/dist/test/utils/helpers/job/test-job.utils.js.map +1 -0
  81. package/dist/test/utils/helpers/job/test-worker.utils.d.ts +12 -0
  82. package/dist/test/utils/helpers/job/test-worker.utils.d.ts.map +1 -0
  83. package/dist/test/utils/helpers/job/test-worker.utils.js +14 -0
  84. package/dist/test/utils/helpers/job/test-worker.utils.js.map +1 -0
  85. package/dist/test/utils/helpers/shared/audit-repository.mock.d.ts +4 -0
  86. package/dist/test/utils/helpers/shared/audit-repository.mock.d.ts.map +1 -0
  87. package/dist/test/utils/helpers/shared/audit-repository.mock.js +5 -0
  88. package/dist/test/utils/helpers/shared/audit-repository.mock.js.map +1 -0
  89. package/dist/test/utils/helpers/shared/database-cleanup.helper.d.ts +4 -0
  90. package/dist/test/utils/helpers/shared/database-cleanup.helper.d.ts.map +1 -0
  91. package/dist/test/utils/helpers/shared/database-cleanup.helper.js +14 -0
  92. package/dist/test/utils/helpers/shared/database-cleanup.helper.js.map +1 -0
  93. package/dist/test/utils/helpers/shared/index.d.ts +5 -0
  94. package/dist/test/utils/helpers/shared/index.d.ts.map +1 -0
  95. package/dist/test/utils/helpers/shared/index.js +5 -0
  96. package/dist/test/utils/helpers/shared/index.js.map +1 -0
  97. package/dist/test/utils/helpers/shared/job-audit.factory.d.ts +5 -0
  98. package/dist/test/utils/helpers/shared/job-audit.factory.d.ts.map +1 -0
  99. package/dist/test/utils/helpers/shared/job-audit.factory.js +32 -0
  100. package/dist/test/utils/helpers/shared/job-audit.factory.js.map +1 -0
  101. package/dist/test/utils/helpers/shared/redis-cleanup.helper.d.ts +2 -0
  102. package/dist/test/utils/helpers/shared/redis-cleanup.helper.d.ts.map +1 -0
  103. package/dist/test/utils/helpers/shared/redis-cleanup.helper.js +12 -0
  104. package/dist/test/utils/helpers/shared/redis-cleanup.helper.js.map +1 -0
  105. package/dist/test/utils/index.d.ts +3 -0
  106. package/dist/test/utils/index.d.ts.map +1 -0
  107. package/dist/test/utils/index.js +3 -0
  108. package/dist/test/utils/index.js.map +1 -0
  109. package/dist/test/utils/repositories/index.d.ts +2 -0
  110. package/dist/test/utils/repositories/index.d.ts.map +1 -0
  111. package/dist/test/utils/repositories/index.js +2 -0
  112. package/dist/test/utils/repositories/index.js.map +1 -0
  113. package/dist/test/utils/repositories/job-audit-test.repository.d.ts +7 -0
  114. package/dist/test/utils/repositories/job-audit-test.repository.d.ts.map +1 -0
  115. package/dist/test/utils/repositories/job-audit-test.repository.js +9 -0
  116. package/dist/test/utils/repositories/job-audit-test.repository.js.map +1 -0
  117. package/package.json +13 -5
@@ -0,0 +1,8 @@
1
+ export const testRedisOptions = {
2
+ host: '127.0.0.1',
3
+ port: 6379,
4
+ db: 0,
5
+ password: 'password',
6
+ retryStrategy: () => null,
7
+ };
8
+ //# sourceMappingURL=redis-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-config.js","sourceRoot":"","sources":["../../src/test/redis-config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,EAAE,EAAE,CAAC;IACL,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI;CAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Job } from 'bullmq';
2
+ import type { TestWorker } from '../../utils/index.js';
3
+ export interface TestJobPayload {
4
+ email?: string;
5
+ }
6
+ export declare function getFirstJob<JobData, JobReturn, JobName extends string>(jobs: Job<JobData, JobReturn, JobName>[]): Job<JobData, JobReturn, JobName>;
7
+ export declare function processJob<JobData, JobReturn, JobName extends string>(worker: TestWorker, job: Job<JobData, JobReturn, JobName>): Promise<void>;
8
+ export declare function processJobExpectError<JobData, JobReturn, JobName extends string>(worker: TestWorker, job: Job<JobData, JobReturn, JobName>, error: Error): Promise<void>;
9
+ //# sourceMappingURL=base.worker.int.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.worker.int.helper.d.ts","sourceRoot":"","sources":["../../../../src/test/specs/base-worker/base.worker.int.helper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,SAAS,MAAM,EACpE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GACvC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAKlC;AAMD,wBAAsB,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,SAAS,MAAM,EACzE,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAEf;AAMD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,SAAS,MAAM,EACpF,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,14 @@
1
+ import { expect } from '@jest/globals';
2
+ export function getFirstJob(jobs) {
3
+ if (jobs.length === 0) {
4
+ throw new Error('No jobs in queue');
5
+ }
6
+ return jobs[0];
7
+ }
8
+ export async function processJob(worker, job) {
9
+ return worker.process(job);
10
+ }
11
+ export async function processJobExpectError(worker, job, error) {
12
+ return expect(worker.process(job)).rejects.toThrow(error);
13
+ }
14
+ //# sourceMappingURL=base.worker.int.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.worker.int.helper.js","sourceRoot":"","sources":["../../../../src/test/specs/base-worker/base.worker.int.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAcvC,MAAM,UAAU,WAAW,CACzB,IAAwC;IAExC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAkB,EAClB,GAAqC;IAErC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAc,CAAC,CAAC;AACxC,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAkB,EAClB,GAAqC,EACrC,KAAY;IAEZ,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.worker.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.worker.int.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/specs/base-worker/base.worker.int.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,499 @@
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
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.worker.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.worker.unit.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/specs/base-worker/base.worker.unit.spec.ts"],"names":[],"mappings":""}