@volontariapp/database 1.12.0 → 1.13.0-snap-3e0d19d
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.
- package/CHANGELOG.md +6 -0
- package/dist/outbox/consumers/outbox.consumer.d.ts +3 -1
- package/dist/outbox/consumers/outbox.consumer.d.ts.map +1 -1
- package/dist/outbox/consumers/outbox.consumer.js +4 -2
- package/dist/outbox/consumers/outbox.consumer.js.map +1 -1
- package/dist/outbox/index.d.ts +1 -0
- package/dist/outbox/index.d.ts.map +1 -1
- package/dist/outbox/index.js +1 -0
- package/dist/outbox/index.js.map +1 -1
- package/dist/outbox/pushers/index.d.ts +2 -0
- package/dist/outbox/pushers/index.d.ts.map +1 -0
- package/dist/outbox/pushers/index.js +2 -0
- package/dist/outbox/pushers/index.js.map +1 -0
- package/dist/outbox/pushers/outbox.pusher.d.ts +6 -0
- package/dist/outbox/pushers/outbox.pusher.d.ts.map +1 -0
- package/dist/outbox/pushers/outbox.pusher.js +3 -0
- package/dist/outbox/pushers/outbox.pusher.js.map +1 -0
- package/dist/outbox/runners/outbox.runner.d.ts +2 -1
- package/dist/outbox/runners/outbox.runner.d.ts.map +1 -1
- package/dist/outbox/runners/outbox.runner.js +6 -3
- package/dist/outbox/runners/outbox.runner.js.map +1 -1
- package/dist/test/global-setup.d.ts.map +1 -1
- package/dist/test/global-setup.js +11 -1
- package/dist/test/global-setup.js.map +1 -1
- package/dist/test/outbox/consumers/outbox.consumer.int.spec.js +45 -10
- package/dist/test/outbox/consumers/outbox.consumer.int.spec.js.map +1 -1
- package/dist/test/outbox/consumers/outbox.consumer.unit.spec.js +24 -9
- package/dist/test/outbox/consumers/outbox.consumer.unit.spec.js.map +1 -1
- package/dist/test/outbox/runners/outbox.runner.int.spec.d.ts.map +1 -0
- package/dist/test/outbox/runners/outbox.runner.int.spec.js +161 -0
- package/dist/test/outbox/runners/outbox.runner.int.spec.js.map +1 -0
- package/dist/test/outbox/runners/outbox.runner.unit.spec.d.ts.map +1 -0
- package/dist/test/outbox/runners/outbox.runner.unit.spec.js +65 -0
- package/dist/test/outbox/runners/outbox.runner.unit.spec.js.map +1 -0
- package/dist/test/redis-config.d.ts +8 -0
- package/dist/test/redis-config.d.ts.map +1 -0
- package/dist/test/redis-config.js +26 -0
- package/dist/test/redis-config.js.map +1 -0
- package/dist/test/utils/helpers/outbox-pusher-mock.helper.d.ts +5 -0
- package/dist/test/utils/helpers/outbox-pusher-mock.helper.d.ts.map +1 -0
- package/dist/test/utils/helpers/outbox-pusher-mock.helper.js +8 -0
- package/dist/test/utils/helpers/outbox-pusher-mock.helper.js.map +1 -0
- package/package.json +3 -1
- package/dist/test/outbox/outbox.runner.int.spec.d.ts.map +0 -1
- package/dist/test/outbox/outbox.runner.int.spec.js +0 -102
- package/dist/test/outbox/outbox.runner.int.spec.js.map +0 -1
- package/dist/test/outbox/outbox.runner.unit.spec.d.ts.map +0 -1
- package/dist/test/outbox/outbox.runner.unit.spec.js +0 -172
- package/dist/test/outbox/outbox.runner.unit.spec.js.map +0 -1
- /package/dist/test/outbox/{outbox.runner.int.spec.d.ts → runners/outbox.runner.int.spec.d.ts} +0 -0
- /package/dist/test/outbox/{outbox.runner.unit.spec.d.ts → runners/outbox.runner.unit.spec.d.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,12 +3,14 @@ import type { OutboxEntity } from '../entities/outbox.entity.js';
|
|
|
3
3
|
import type { OutboxModel } from '../models/outbox.model.js';
|
|
4
4
|
import type { Logger } from '@volontariapp/logger';
|
|
5
5
|
import type { OutboxDispatcher } from '../dispatchers/outbox.dispatcher.js';
|
|
6
|
+
import type { OutboxPusher } from '../pushers/outbox.pusher.js';
|
|
6
7
|
export declare class OutboxConsumer<TOutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
|
|
7
8
|
protected readonly logger: Logger;
|
|
8
9
|
protected readonly repository: BaseRepository<TOutboxModel, TOutboxEntity, string>;
|
|
9
10
|
protected readonly batchSize: number;
|
|
10
11
|
protected readonly outboxDispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>;
|
|
11
|
-
|
|
12
|
+
protected readonly outboxPusher: OutboxPusher<TOutboxEntity>;
|
|
13
|
+
constructor(logger: Logger, repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, batchSize: number, outboxDispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>, outboxPusher: OutboxPusher<TOutboxEntity>);
|
|
12
14
|
fetchPendingItems(): Promise<TOutboxEntity[]>;
|
|
13
15
|
private normalizeRows;
|
|
14
16
|
processItems(entities: TOutboxEntity[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.consumer.d.ts","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.consumer.d.ts","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,qBAAa,cAAc,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;IAE5F,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACjC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC;IAClF,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC;IAClF,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC,aAAa,CAAC;gBAJzC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAC/D,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC,EAC/D,YAAY,EAAE,YAAY,CAAC,aAAa,CAAC;IAOxD,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA2CnD,OAAO,CAAC,aAAa;IA2Bf,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBtD,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAUrE"}
|
|
@@ -5,11 +5,13 @@ export class OutboxConsumer {
|
|
|
5
5
|
repository;
|
|
6
6
|
batchSize;
|
|
7
7
|
outboxDispatcher;
|
|
8
|
-
|
|
8
|
+
outboxPusher;
|
|
9
|
+
constructor(logger, repository, batchSize, outboxDispatcher, outboxPusher) {
|
|
9
10
|
this.logger = logger;
|
|
10
11
|
this.repository = repository;
|
|
11
12
|
this.batchSize = batchSize;
|
|
12
13
|
this.outboxDispatcher = outboxDispatcher;
|
|
14
|
+
this.outboxPusher = outboxPusher;
|
|
13
15
|
if (this.batchSize <= 0) {
|
|
14
16
|
throw new InvalidOutboxSizeError();
|
|
15
17
|
}
|
|
@@ -72,7 +74,7 @@ export class OutboxConsumer {
|
|
|
72
74
|
for (const item of entities) {
|
|
73
75
|
try {
|
|
74
76
|
this.logger.info(`Pushing outbox item ${item.id.toString()}`);
|
|
75
|
-
await
|
|
77
|
+
await this.outboxPusher.pushElement(item);
|
|
76
78
|
await this.outboxDispatcher.markAsCompleted(item);
|
|
77
79
|
}
|
|
78
80
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.consumer.js","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.consumer.js","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"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"}
|
package/dist/outbox/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
|
package/dist/outbox/index.js
CHANGED
package/dist/outbox/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/outbox/pushers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/outbox/pushers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { OutboxEntity } from '../entities/outbox.entity.js';
|
|
2
|
+
export declare abstract class OutboxPusher<TOutboxEntity extends OutboxEntity> {
|
|
3
|
+
abstract pushElement(entity: TOutboxEntity): Promise<void>;
|
|
4
|
+
abstract pushBulkElement(entities: TOutboxEntity[]): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=outbox.pusher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.pusher.d.ts","sourceRoot":"","sources":["../../../src/outbox/pushers/outbox.pusher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,8BAAsB,YAAY,CAAC,aAAa,SAAS,YAAY;IACnE,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1D,QAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CACnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.pusher.js","sourceRoot":"","sources":["../../../src/outbox/pushers/outbox.pusher.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,YAAY;CAGjC"}
|
|
@@ -2,6 +2,7 @@ import type { OutboxRunnerConfig } from '@volontariapp/config';
|
|
|
2
2
|
import type { OutboxDispatcher } from '../dispatchers/outbox.dispatcher.js';
|
|
3
3
|
import type { OutboxEntity, OutboxModel } from '../index.js';
|
|
4
4
|
import type { BaseRepository } from '../../core/base.repository.js';
|
|
5
|
+
import type { OutboxPusher } from '../pushers/outbox.pusher.js';
|
|
5
6
|
export declare class OutboxRunner<TOutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
|
|
6
7
|
private readonly repository;
|
|
7
8
|
private readonly config;
|
|
@@ -10,7 +11,7 @@ export declare class OutboxRunner<TOutboxModel extends OutboxModel, TOutboxEntit
|
|
|
10
11
|
private readonly logger;
|
|
11
12
|
private readonly consumer;
|
|
12
13
|
private readonly dispatcher;
|
|
13
|
-
constructor(repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, config: OutboxRunnerConfig, dispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>);
|
|
14
|
+
constructor(repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, config: OutboxRunnerConfig, dispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>, pusher: OutboxPusher<TOutboxEntity>);
|
|
14
15
|
get isRunning(): boolean;
|
|
15
16
|
start(): void;
|
|
16
17
|
private runLoop;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.runner.d.ts","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.runner.d.ts","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,qBAAa,YAAY,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;IAS1F,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAgB;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgD;gBAGxD,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAC/D,MAAM,EAAE,kBAAkB,EAC3C,UAAU,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC,EACzD,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC;IAgBrC,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,KAAK,IAAI,IAAI;YAaC,OAAO;IAoBf,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAWzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
|
|
@@ -9,12 +9,12 @@ export class OutboxRunner {
|
|
|
9
9
|
logger;
|
|
10
10
|
consumer;
|
|
11
11
|
dispatcher;
|
|
12
|
-
constructor(repository, config, dispatcher) {
|
|
12
|
+
constructor(repository, config, dispatcher, pusher) {
|
|
13
13
|
this.repository = repository;
|
|
14
14
|
this.config = config;
|
|
15
15
|
this.logger = new Logger(config.logger);
|
|
16
16
|
this.dispatcher = dispatcher;
|
|
17
|
-
this.consumer = new OutboxConsumer(this.logger, this.repository, config.batchSize, this.dispatcher);
|
|
17
|
+
this.consumer = new OutboxConsumer(this.logger, this.repository, config.batchSize, this.dispatcher, pusher);
|
|
18
18
|
}
|
|
19
19
|
get isRunning() {
|
|
20
20
|
return !!this.abortController && !this.abortController.signal.aborted;
|
|
@@ -49,7 +49,10 @@ export class OutboxRunner {
|
|
|
49
49
|
}
|
|
50
50
|
async runCycle() {
|
|
51
51
|
try {
|
|
52
|
-
await this.consumer.fetchPendingItems();
|
|
52
|
+
const items = await this.consumer.fetchPendingItems();
|
|
53
|
+
if (items.length > 0) {
|
|
54
|
+
await this.consumer.processItems(items);
|
|
55
|
+
}
|
|
53
56
|
}
|
|
54
57
|
catch (error) {
|
|
55
58
|
this.logger.error('Error during outbox run cycle', { error });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.runner.js","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.runner.js","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../../src/test/global-setup.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../../src/test/global-setup.ts"],"names":[],"mappings":";AAKA,wBA0CE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PostgresProvider } from '@volontariapp/bridge';
|
|
2
|
+
import { Redis } from 'ioredis';
|
|
2
3
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
3
4
|
export default async () => {
|
|
4
5
|
const provider = new PostgresProvider({
|
|
@@ -8,6 +9,11 @@ export default async () => {
|
|
|
8
9
|
password: 'testpassword',
|
|
9
10
|
database: 'volontariapp_test',
|
|
10
11
|
});
|
|
12
|
+
const redis = new Redis({
|
|
13
|
+
host: 'localhost',
|
|
14
|
+
port: 6379,
|
|
15
|
+
lazyConnect: true,
|
|
16
|
+
});
|
|
11
17
|
const maxAttempts = 20;
|
|
12
18
|
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
13
19
|
try {
|
|
@@ -15,12 +21,16 @@ export default async () => {
|
|
|
15
21
|
const dataSource = provider.getDriver();
|
|
16
22
|
await dataSource.query('SELECT 1');
|
|
17
23
|
await provider.disconnect();
|
|
24
|
+
await redis.connect();
|
|
25
|
+
await redis.ping();
|
|
26
|
+
await redis.quit();
|
|
18
27
|
return;
|
|
19
28
|
}
|
|
20
29
|
catch {
|
|
21
30
|
await provider.disconnect().catch(() => undefined);
|
|
31
|
+
await redis.quit().catch(() => undefined);
|
|
22
32
|
if (attempt === maxAttempts) {
|
|
23
|
-
throw new Error('Test database is not reachable. Start
|
|
33
|
+
throw new Error('Test database or Redis is not reachable. Start them before running tests.');
|
|
24
34
|
}
|
|
25
35
|
await sleep(500);
|
|
26
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-setup.js","sourceRoot":"","sources":["../../src/test/global-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"global-setup.js","sourceRoot":"","sources":["../../src/test/global-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEhF,eAAe,KAAK,IAAI,EAAE;IACxB,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC;QACpC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,mBAAmB;KAC9B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,EAAE,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC;YAEH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAG5B,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YAEnB,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll } from '@jest/globals';
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach, jest } from '@jest/globals';
|
|
2
2
|
import { testDataSource, setupIntegrationTest } from '../../utils/index.js';
|
|
3
3
|
import { OutboxModel } from '../../../outbox/models/outbox.model.js';
|
|
4
4
|
import { OutboxConsumer } from '../../../outbox/consumers/outbox.consumer.js';
|
|
@@ -7,13 +7,43 @@ import { OutboxStatus } from '../../../outbox/types/outbox.status.js';
|
|
|
7
7
|
import { makeOutboxEvent } from '../../utils/helpers/outbox-event.helper.js';
|
|
8
8
|
import { TestOutboxRepository } from '../../utils/repositories/outbox-test.repository.js';
|
|
9
9
|
import { makeLoggerMock } from '../../utils/helpers/logger-mock.helper.js';
|
|
10
|
+
import { OutboxPusher } from '../../../outbox/pushers/outbox.pusher.js';
|
|
11
|
+
import { clearTestRedis, createTestRedisConnection } from '../../redis-config.js';
|
|
12
|
+
class RealRedisPusher extends OutboxPusher {
|
|
13
|
+
redis;
|
|
14
|
+
constructor(redis) {
|
|
15
|
+
super();
|
|
16
|
+
this.redis = redis;
|
|
17
|
+
}
|
|
18
|
+
async pushElement(entity) {
|
|
19
|
+
await this.redis.set(`outbox:${entity.id}`, JSON.stringify(entity));
|
|
20
|
+
}
|
|
21
|
+
async pushBulkElement(entities) {
|
|
22
|
+
const pipeline = this.redis.pipeline();
|
|
23
|
+
for (const entity of entities) {
|
|
24
|
+
pipeline.set(`outbox:${entity.id}`, JSON.stringify(entity));
|
|
25
|
+
}
|
|
26
|
+
await pipeline.exec();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
10
29
|
describe('OutboxConsumer (Integration)', () => {
|
|
11
30
|
let repository;
|
|
12
31
|
let loggerMock;
|
|
32
|
+
let redis;
|
|
33
|
+
let pusher;
|
|
13
34
|
setupIntegrationTest([OutboxModel]);
|
|
14
35
|
beforeAll(() => {
|
|
15
36
|
loggerMock = makeLoggerMock();
|
|
16
37
|
repository = new TestOutboxRepository(testDataSource.getRepository(OutboxModel));
|
|
38
|
+
redis = createTestRedisConnection();
|
|
39
|
+
pusher = new RealRedisPusher(redis);
|
|
40
|
+
});
|
|
41
|
+
afterAll(async () => {
|
|
42
|
+
await redis.quit();
|
|
43
|
+
});
|
|
44
|
+
beforeEach(async () => {
|
|
45
|
+
await clearTestRedis();
|
|
46
|
+
jest.clearAllMocks();
|
|
17
47
|
});
|
|
18
48
|
it('should fetch waiting items and mark them as processing', async () => {
|
|
19
49
|
const repo = testDataSource.getRepository(OutboxModel);
|
|
@@ -27,7 +57,7 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
27
57
|
});
|
|
28
58
|
await repo.save([event1, event2]);
|
|
29
59
|
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
30
|
-
const singleConsumer = new OutboxConsumer(loggerMock, repository, 1, dispatcher);
|
|
60
|
+
const singleConsumer = new OutboxConsumer(loggerMock, repository, 1, dispatcher, pusher);
|
|
31
61
|
const items = await singleConsumer.fetchPendingItems();
|
|
32
62
|
expect(items).toHaveLength(1);
|
|
33
63
|
expect(items[0].status).toBe(OutboxStatus.PROCESSING);
|
|
@@ -44,8 +74,8 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
44
74
|
}));
|
|
45
75
|
await repo.save(events);
|
|
46
76
|
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
47
|
-
const consumer1 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
48
|
-
const consumer2 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
77
|
+
const consumer1 = new OutboxConsumer(loggerMock, repository, 5, dispatcher, pusher);
|
|
78
|
+
const consumer2 = new OutboxConsumer(loggerMock, repository, 5, dispatcher, pusher);
|
|
49
79
|
const [results1, results2] = await Promise.all([
|
|
50
80
|
consumer1.fetchPendingItems(),
|
|
51
81
|
consumer2.fetchPendingItems(),
|
|
@@ -67,9 +97,9 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
67
97
|
}));
|
|
68
98
|
await repo.save(events);
|
|
69
99
|
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
70
|
-
const consumer1 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
71
|
-
const consumer2 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
72
|
-
const consumer3 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
100
|
+
const consumer1 = new OutboxConsumer(loggerMock, repository, 5, dispatcher, pusher);
|
|
101
|
+
const consumer2 = new OutboxConsumer(loggerMock, repository, 5, dispatcher, pusher);
|
|
102
|
+
const consumer3 = new OutboxConsumer(loggerMock, repository, 5, dispatcher, pusher);
|
|
73
103
|
const [results1, results2, results3] = await Promise.all([
|
|
74
104
|
consumer1.fetchPendingItems(),
|
|
75
105
|
consumer2.fetchPendingItems(),
|
|
@@ -91,13 +121,13 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
91
121
|
});
|
|
92
122
|
await repo.save(event);
|
|
93
123
|
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
94
|
-
const consumer = new OutboxConsumer(loggerMock, repository, 10, dispatcher);
|
|
124
|
+
const consumer = new OutboxConsumer(loggerMock, repository, 10, dispatcher, pusher);
|
|
95
125
|
const entity = await repository.findOneOrFail({ id: event.id });
|
|
96
126
|
await consumer.markItemsAsCompleted([entity]);
|
|
97
127
|
const dbItem = await repo.findOneBy({ id: event.id });
|
|
98
128
|
expect(dbItem?.status).toBe(OutboxStatus.COMPLETED);
|
|
99
129
|
});
|
|
100
|
-
it('processItems() should process items and mark them as COMPLETED in database', async () => {
|
|
130
|
+
it('processItems() should process items, push them and mark them as COMPLETED in database', async () => {
|
|
101
131
|
const repo = testDataSource.getRepository(OutboxModel);
|
|
102
132
|
const event = makeOutboxEvent({
|
|
103
133
|
id: '00000000-0000-0000-0000-000000000101',
|
|
@@ -105,11 +135,16 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
105
135
|
});
|
|
106
136
|
await repo.save(event);
|
|
107
137
|
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
108
|
-
const consumer = new OutboxConsumer(loggerMock, repository, 10, dispatcher);
|
|
138
|
+
const consumer = new OutboxConsumer(loggerMock, repository, 10, dispatcher, pusher);
|
|
139
|
+
const pushSpy = jest.spyOn(pusher, 'pushElement');
|
|
109
140
|
const entity = await repository.findOneOrFail({ id: event.id });
|
|
110
141
|
await consumer.processItems([entity]);
|
|
142
|
+
expect(pushSpy).toHaveBeenCalledWith(entity);
|
|
111
143
|
const dbItem = await repo.findOneBy({ id: event.id });
|
|
112
144
|
expect(dbItem?.status).toBe(OutboxStatus.COMPLETED);
|
|
145
|
+
const redisItem = await redis.get(`outbox:${entity.id}`);
|
|
146
|
+
expect(redisItem).not.toBeNull();
|
|
147
|
+
expect(JSON.parse(redisItem).id).toBe(entity.id);
|
|
113
148
|
});
|
|
114
149
|
});
|
|
115
150
|
//# sourceMappingURL=outbox.consumer.int.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.consumer.int.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.int.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.consumer.int.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.int.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE5F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAE1F,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElF,MAAM,eAAgB,SAAQ,YAA0B;IACzB;IAA7B,YAA6B,KAAY;QACvC,KAAK,EAAE,CAAC;QADmB,UAAK,GAAL,KAAK,CAAO;IAEzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAoB;QACpC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAwB;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;CACF;AAED,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,UAAgC,CAAC;IACrC,IAAI,UAAsB,CAAC;IAC3B,IAAI,KAAY,CAAC;IACjB,IAAI,MAAuB,CAAC;IAE5B,oBAAoB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,GAAG,cAAc,EAAE,CAAC;QAC9B,UAAU,GAAG,IAAI,oBAAoB,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QACjF,KAAK,GAAG,yBAAyB,EAAE,CAAC;QACpC,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,eAAe,CAAC;YAC7B,EAAE,EAAE,sCAAsC;YAC1C,MAAM,EAAE,YAAY,CAAC,OAAO;SAC7B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,CAAC;YAC7B,EAAE,EAAE,sCAAsC;YAC1C,MAAM,EAAE,YAAY,CAAC,OAAO;SAC7B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAElC,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAA+B,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,cAAc,GAAG,IAAI,cAAc,CACvC,UAA+B,EAC/B,UAAU,EACV,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAC7D,eAAe,CAAC;YACd,EAAE,EAAE,qCAAqC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YAC9E,MAAM,EAAE,YAAY,CAAC,OAAO;SAC7B,CAAC,CACH,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAA+B,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG,IAAI,cAAc,CAClC,UAA+B,EAC/B,UAAU,EACV,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,cAAc,CAClC,UAA+B,EAC/B,UAAU,EACV,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAC;QACF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,SAAS,CAAC,iBAAiB,EAAE;YAC7B,SAAS,CAAC,iBAAiB,EAAE;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEjC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7D,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAErC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAC7D,eAAe,CAAC;YACd,EAAE,EAAE,qCAAqC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YAC9E,MAAM,EAAE,YAAY,CAAC,OAAO;SAC7B,CAAC,CACH,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAA+B,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG,IAAI,cAAc,CAClC,UAA+B,EAC/B,UAAU,EACV,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,cAAc,CAClC,UAA+B,EAC/B,UAAU,EACV,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,cAAc,CAClC,UAA+B,EAC/B,UAAU,EACV,CAAC,EACD,UAAU,EACV,MAAM,CACP,CAAC;QAEF,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvD,SAAS,CAAC,iBAAiB,EAAE;YAC7B,SAAS,CAAC,iBAAiB,EAAE;YAC7B,SAAS,CAAC,iBAAiB,EAAE;SAC9B,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAClF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAElF,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,eAAe,CAAC;YAC5B,EAAE,EAAE,sCAAsC;YAC1C,MAAM,EAAE,YAAY,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAA+B,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,UAA+B,EAC/B,UAAU,EACV,EAAE,EACF,UAAU,EACV,MAAM,CACP,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,eAAe,CAAC;YAC5B,EAAE,EAAE,sCAAsC;YAC1C,MAAM,EAAE,YAAY,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAA+B,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,UAA+B,EAC/B,UAAU,EACV,EAAE,EACF,UAAU,EACV,MAAM,CACP,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAGpD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import { describe, expect, it, beforeEach, jest } from '@jest/globals';
|
|
1
|
+
import { describe, expect, it, beforeEach, jest, afterEach } from '@jest/globals';
|
|
2
2
|
import { OutboxConsumer } from '../../../outbox/consumers/outbox.consumer.js';
|
|
3
3
|
import { OutboxModel } from '../../../outbox/models/outbox.model.js';
|
|
4
4
|
import { InvalidOutboxSizeError } from '@volontariapp/errors';
|
|
5
5
|
import { OutboxStatus } from '../../../outbox/types/outbox.status.js';
|
|
6
6
|
import { makeLoggerMock } from '../../utils/helpers/logger-mock.helper.js';
|
|
7
7
|
import { makeQueryRunnerMock } from '../../utils/helpers/query-runner-mock.helper.js';
|
|
8
|
+
import { makeOutboxPusherMock } from '../../utils/helpers/outbox-pusher-mock.helper.js';
|
|
8
9
|
describe('OutboxConsumer (Unit)', () => {
|
|
9
10
|
let consumer;
|
|
10
11
|
let dispatcherMock;
|
|
11
12
|
let repositoryMock;
|
|
13
|
+
let pusherMock;
|
|
12
14
|
let queryRunnerMock;
|
|
13
15
|
let loggerMock;
|
|
14
16
|
beforeEach(() => {
|
|
@@ -29,15 +31,16 @@ describe('OutboxConsumer (Unit)', () => {
|
|
|
29
31
|
markAsFailed: jest.fn(),
|
|
30
32
|
markAsProcessing: jest.fn(),
|
|
31
33
|
};
|
|
32
|
-
|
|
34
|
+
pusherMock = makeOutboxPusherMock();
|
|
35
|
+
consumer = new OutboxConsumer(loggerMock, repositoryMock, 10, dispatcherMock, pusherMock);
|
|
33
36
|
});
|
|
34
37
|
afterEach(() => {
|
|
35
38
|
jest.restoreAllMocks();
|
|
36
39
|
});
|
|
37
40
|
describe('constructor', () => {
|
|
38
41
|
it('should throw InvalidOutboxSizeError if batchSize <= 0', () => {
|
|
39
|
-
expect(() => new OutboxConsumer(loggerMock, repositoryMock, 0, dispatcherMock)).toThrow(InvalidOutboxSizeError);
|
|
40
|
-
expect(() => new OutboxConsumer(loggerMock, repositoryMock, -1, dispatcherMock)).toThrow(InvalidOutboxSizeError);
|
|
42
|
+
expect(() => new OutboxConsumer(loggerMock, repositoryMock, 0, dispatcherMock, pusherMock)).toThrow(InvalidOutboxSizeError);
|
|
43
|
+
expect(() => new OutboxConsumer(loggerMock, repositoryMock, -1, dispatcherMock, pusherMock)).toThrow(InvalidOutboxSizeError);
|
|
41
44
|
});
|
|
42
45
|
});
|
|
43
46
|
describe('fetchPendingItems', () => {
|
|
@@ -89,22 +92,34 @@ describe('OutboxConsumer (Unit)', () => {
|
|
|
89
92
|
});
|
|
90
93
|
});
|
|
91
94
|
describe('processItems', () => {
|
|
92
|
-
it('should process items and mark them as completed', async () => {
|
|
95
|
+
it('should process items, push them and mark them as completed', async () => {
|
|
93
96
|
const entities = [{ id: '1' }, { id: '2' }];
|
|
94
97
|
const completedSpy = jest.spyOn(dispatcherMock, 'markAsCompleted');
|
|
98
|
+
const pushSpy = jest.spyOn(pusherMock, 'pushElement');
|
|
95
99
|
await consumer.processItems(entities);
|
|
100
|
+
expect(pushSpy).toHaveBeenCalledTimes(2);
|
|
101
|
+
expect(pushSpy).toHaveBeenCalledWith(entities[0]);
|
|
102
|
+
expect(pushSpy).toHaveBeenCalledWith(entities[1]);
|
|
96
103
|
expect(completedSpy).toHaveBeenCalledTimes(2);
|
|
97
104
|
expect(completedSpy).toHaveBeenCalledWith(entities[0]);
|
|
98
105
|
expect(completedSpy).toHaveBeenCalledWith(entities[1]);
|
|
99
106
|
});
|
|
100
|
-
it('should mark items as failed if
|
|
107
|
+
it('should mark items as failed if pushing throws error', async () => {
|
|
108
|
+
const entities = [{ id: '1' }];
|
|
109
|
+
const error = new Error('Push error');
|
|
110
|
+
jest.spyOn(pusherMock, 'pushElement').mockRejectedValueOnce(error);
|
|
111
|
+
const failedSpy = jest.spyOn(dispatcherMock, 'markAsFailed');
|
|
112
|
+
const completedSpy = jest.spyOn(dispatcherMock, 'markAsCompleted');
|
|
113
|
+
await consumer.processItems(entities);
|
|
114
|
+
expect(completedSpy).not.toHaveBeenCalled();
|
|
115
|
+
expect(failedSpy).toHaveBeenCalledWith(entities[0], 'Push error');
|
|
116
|
+
});
|
|
117
|
+
it('should mark items as failed if marking as completed throws error', async () => {
|
|
101
118
|
const entities = [{ id: '1' }];
|
|
102
119
|
const error = new Error('Test error');
|
|
103
120
|
const completedSpy = jest
|
|
104
121
|
.spyOn(dispatcherMock, 'markAsCompleted')
|
|
105
|
-
.
|
|
106
|
-
throw error;
|
|
107
|
-
});
|
|
122
|
+
.mockRejectedValueOnce(error);
|
|
108
123
|
const failedSpy = jest.spyOn(dispatcherMock, 'markAsFailed');
|
|
109
124
|
await consumer.processItems(entities);
|
|
110
125
|
expect(completedSpy).toHaveBeenCalledWith(entities[0]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.consumer.unit.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.unit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.consumer.unit.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.unit.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.runner.int.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/runners/outbox.runner.int.spec.ts"],"names":[],"mappings":""}
|