@relaybus/testing 0.3.1 → 0.4.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.
- package/README.md +48 -2
- package/dist/chunk-IOWTZMTG.cjs +230 -0
- package/dist/chunk-IOWTZMTG.cjs.map +1 -0
- package/dist/chunk-ZZZXYZJ3.js +222 -0
- package/dist/chunk-ZZZXYZJ3.js.map +1 -0
- package/dist/codec-contract.cjs +36 -0
- package/dist/codec-contract.cjs.map +1 -0
- package/dist/codec-contract.d.cts +178 -0
- package/dist/codec-contract.d.ts +178 -0
- package/dist/codec-contract.js +3 -0
- package/dist/codec-contract.js.map +1 -0
- package/dist/index.cjs +92 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +64 -2
- package/dist/index.js.map +1 -1
- package/dist/jest.cjs +56 -0
- package/dist/jest.cjs.map +1 -0
- package/dist/jest.d.cts +10 -0
- package/dist/jest.d.ts +10 -0
- package/dist/jest.js +26 -0
- package/dist/jest.js.map +1 -0
- package/package.json +40 -4
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { NewDelivery, EventEnvelope, EventStore, Clock, Transport, TransportMessageHandler } from '@relaybus/core';
|
|
2
|
+
import { KafkaCodecContractOptions, RabbitMqCodecContractOptions } from './codec-contract.cjs';
|
|
3
|
+
export { BodyComparison, CodecContractError, KafkaCapturedRecord, KafkaCodecCase, KafkaDeliveredRecord, KafkaWrittenRecord, RabbitMqCapturedMessage, RabbitMqCodecCase, RabbitMqDeliveredMessage, RabbitMqWrittenMessage, TestFramework, WireBytes, assertKafkaCodecCase, assertRabbitMqCodecCase, kafkaCodecMismatches, rabbitMqCodecMismatches, registerKafkaCodecContract, registerRabbitMqCodecContract } from './codec-contract.cjs';
|
|
2
4
|
|
|
3
5
|
declare function at(offsetMs: number): Date;
|
|
4
6
|
declare function createEnvelope(overrides?: Partial<EventEnvelope>): EventEnvelope;
|
|
@@ -83,4 +85,10 @@ declare class InMemoryTransport implements Transport {
|
|
|
83
85
|
close(): Promise<void>;
|
|
84
86
|
}
|
|
85
87
|
|
|
86
|
-
|
|
88
|
+
/** Registers one Vitest test per captured Kafka record (see `registerKafkaCodecContract`). */
|
|
89
|
+
declare function kafkaCodecContract(name: string, options: KafkaCodecContractOptions): void;
|
|
90
|
+
/** Registers one Vitest test per captured RabbitMQ message (see `registerRabbitMqCodecContract`). */
|
|
91
|
+
declare function rabbitMqCodecContract(name: string, options: RabbitMqCodecContractOptions): void;
|
|
92
|
+
|
|
93
|
+
export { FakeClock, InMemoryTransport, KafkaCodecContractOptions, RabbitMqCodecContractOptions, at, createDelivery, createEnvelope, eventStoreContract, kafkaCodecContract, rabbitMqCodecContract };
|
|
94
|
+
export type { EventStoreContractOptions, PublishedMessage };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { NewDelivery, EventEnvelope, EventStore, Clock, Transport, TransportMessageHandler } from '@relaybus/core';
|
|
2
|
+
import { KafkaCodecContractOptions, RabbitMqCodecContractOptions } from './codec-contract.js';
|
|
3
|
+
export { BodyComparison, CodecContractError, KafkaCapturedRecord, KafkaCodecCase, KafkaDeliveredRecord, KafkaWrittenRecord, RabbitMqCapturedMessage, RabbitMqCodecCase, RabbitMqDeliveredMessage, RabbitMqWrittenMessage, TestFramework, WireBytes, assertKafkaCodecCase, assertRabbitMqCodecCase, kafkaCodecMismatches, rabbitMqCodecMismatches, registerKafkaCodecContract, registerRabbitMqCodecContract } from './codec-contract.js';
|
|
2
4
|
|
|
3
5
|
declare function at(offsetMs: number): Date;
|
|
4
6
|
declare function createEnvelope(overrides?: Partial<EventEnvelope>): EventEnvelope;
|
|
@@ -83,4 +85,10 @@ declare class InMemoryTransport implements Transport {
|
|
|
83
85
|
close(): Promise<void>;
|
|
84
86
|
}
|
|
85
87
|
|
|
86
|
-
|
|
88
|
+
/** Registers one Vitest test per captured Kafka record (see `registerKafkaCodecContract`). */
|
|
89
|
+
declare function kafkaCodecContract(name: string, options: KafkaCodecContractOptions): void;
|
|
90
|
+
/** Registers one Vitest test per captured RabbitMQ message (see `registerRabbitMqCodecContract`). */
|
|
91
|
+
declare function rabbitMqCodecContract(name: string, options: RabbitMqCodecContractOptions): void;
|
|
92
|
+
|
|
93
|
+
export { FakeClock, InMemoryTransport, KafkaCodecContractOptions, RabbitMqCodecContractOptions, at, createDelivery, createEnvelope, eventStoreContract, kafkaCodecContract, rabbitMqCodecContract };
|
|
94
|
+
export type { EventStoreContractOptions, PublishedMessage };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { registerKafkaCodecContract, registerRabbitMqCodecContract } from './chunk-ZZZXYZJ3.js';
|
|
2
|
+
export { CodecContractError, assertKafkaCodecCase, assertRabbitMqCodecCase, kafkaCodecMismatches, rabbitMqCodecMismatches, registerKafkaCodecContract, registerRabbitMqCodecContract } from './chunk-ZZZXYZJ3.js';
|
|
1
3
|
import { describe, beforeEach, afterEach, it, expect } from 'vitest';
|
|
2
4
|
import { createUuidV7 } from '@relaybus/core';
|
|
3
5
|
|
|
4
|
-
// src/event-store-contract.ts
|
|
5
6
|
function createDeferred() {
|
|
6
7
|
let resolve;
|
|
7
8
|
const promise = new Promise((onResolve) => {
|
|
@@ -1242,6 +1243,60 @@ function lostLeasesContract(suite) {
|
|
|
1242
1243
|
});
|
|
1243
1244
|
});
|
|
1244
1245
|
}
|
|
1246
|
+
function unsortedPayload() {
|
|
1247
|
+
return {
|
|
1248
|
+
zulu: "last letter first",
|
|
1249
|
+
b: { yankee: [{ zz: 1, a: 2, mm: { q: null, c: true } }, [], {}], alpha: {} },
|
|
1250
|
+
longestKeyOfTheObject: 1,
|
|
1251
|
+
a: '\xE7\u011F\u0131\xF6\u015F\xFC \u{1F680} \u2028 "quoted" \\ tab ',
|
|
1252
|
+
exponent: 1e21,
|
|
1253
|
+
tiny: 5e-324,
|
|
1254
|
+
fraction: 0.1 + 0.2,
|
|
1255
|
+
negative: -42.5,
|
|
1256
|
+
maxSafe: Number.MAX_SAFE_INTEGER,
|
|
1257
|
+
minSafe: Number.MIN_SAFE_INTEGER,
|
|
1258
|
+
emptyObject: {},
|
|
1259
|
+
emptyArray: [],
|
|
1260
|
+
"7": "integer-like key",
|
|
1261
|
+
mixed: ["z", { d: 4, c: 3 }, 0, false, null]
|
|
1262
|
+
};
|
|
1263
|
+
}
|
|
1264
|
+
function payloadFidelityContract(suite) {
|
|
1265
|
+
const { append, claim } = suite;
|
|
1266
|
+
describe("payload fidelity", () => {
|
|
1267
|
+
it("hands out the payload and headers with their key order, as published", async () => {
|
|
1268
|
+
const event = createEnvelope({
|
|
1269
|
+
payload: unsortedPayload(),
|
|
1270
|
+
headers: { zz: "last", traceparent: "00-abc-def-01", a: "first", tenant: "acme" }
|
|
1271
|
+
});
|
|
1272
|
+
await append([{ event, deliveries: [createDelivery("handler-a")] }]);
|
|
1273
|
+
const [claimed] = await claim(["handler-a"]);
|
|
1274
|
+
expect(JSON.stringify(claimed.event.payload)).toBe(JSON.stringify(event.payload));
|
|
1275
|
+
expect(JSON.stringify(claimed.event.headers)).toBe(JSON.stringify(event.headers));
|
|
1276
|
+
});
|
|
1277
|
+
it("keeps the order of a payload appended in a batch and of a top-level array", async () => {
|
|
1278
|
+
const object = createEnvelope({ payload: unsortedPayload() });
|
|
1279
|
+
const list = createEnvelope({ payload: [{ zz: 1, a: { y: 2, b: 1 } }, "x", 1e21] });
|
|
1280
|
+
const scalar = createEnvelope({ payload: "plain text" });
|
|
1281
|
+
await append([
|
|
1282
|
+
{ event: object, deliveries: [createDelivery("handler-a", at(1))] },
|
|
1283
|
+
{ event: list, deliveries: [createDelivery("handler-a", at(2))] },
|
|
1284
|
+
{ event: scalar, deliveries: [createDelivery("handler-a", at(3))] }
|
|
1285
|
+
]);
|
|
1286
|
+
const claimed = await claim(["handler-a"], at(10));
|
|
1287
|
+
expect(claimed.map((delivery) => JSON.stringify(delivery.event.payload))).toEqual(
|
|
1288
|
+
[object, list, scalar].map((event) => JSON.stringify(event.payload))
|
|
1289
|
+
);
|
|
1290
|
+
});
|
|
1291
|
+
it("keeps the order for a handler added to an event that already exists", async () => {
|
|
1292
|
+
const event = createEnvelope({ payload: unsortedPayload() });
|
|
1293
|
+
await append([{ event, deliveries: [createDelivery("handler-a")] }]);
|
|
1294
|
+
await append([{ event, deliveries: [createDelivery("handler-b")] }]);
|
|
1295
|
+
const [claimed] = await claim(["handler-b"]);
|
|
1296
|
+
expect(JSON.stringify(claimed.event.payload)).toBe(JSON.stringify(event.payload));
|
|
1297
|
+
});
|
|
1298
|
+
});
|
|
1299
|
+
}
|
|
1245
1300
|
|
|
1246
1301
|
// src/event-store-contract.ts
|
|
1247
1302
|
function eventStoreContract(name, options) {
|
|
@@ -1290,6 +1345,7 @@ function eventStoreContract(name, options) {
|
|
|
1290
1345
|
orderingAndLeasesContract(suite);
|
|
1291
1346
|
completionContract(suite);
|
|
1292
1347
|
lostLeasesContract(suite);
|
|
1348
|
+
payloadFidelityContract(suite);
|
|
1293
1349
|
});
|
|
1294
1350
|
}
|
|
1295
1351
|
|
|
@@ -1415,7 +1471,13 @@ async function deliverWithRedeliveries(handler, delivery) {
|
|
|
1415
1471
|
}
|
|
1416
1472
|
}
|
|
1417
1473
|
}
|
|
1474
|
+
function kafkaCodecContract(name, options) {
|
|
1475
|
+
registerKafkaCodecContract({ describe: describe, it: it }, { name, options });
|
|
1476
|
+
}
|
|
1477
|
+
function rabbitMqCodecContract(name, options) {
|
|
1478
|
+
registerRabbitMqCodecContract({ describe: describe, it: it }, { name, options });
|
|
1479
|
+
}
|
|
1418
1480
|
|
|
1419
|
-
export { FakeClock, InMemoryTransport, at, createDelivery, createEnvelope, eventStoreContract };
|
|
1481
|
+
export { FakeClock, InMemoryTransport, at, createDelivery, createEnvelope, eventStoreContract, kafkaCodecContract, rabbitMqCodecContract };
|
|
1420
1482
|
//# sourceMappingURL=index.js.map
|
|
1421
1483
|
//# sourceMappingURL=index.js.map
|