@ddd-ts-kit/testing 0.10.0 → 0.12.0

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 (73) hide show
  1. package/README.md +21 -0
  2. package/dist/contracts/cache-purger-contract.d.ts +19 -0
  3. package/dist/contracts/cache-purger-contract.d.ts.map +1 -0
  4. package/dist/contracts/cache-purger-contract.js +69 -0
  5. package/dist/contracts/cache-purger-contract.js.map +1 -0
  6. package/dist/contracts/job-store/a-job.d.ts +24 -0
  7. package/dist/contracts/job-store/a-job.d.ts.map +1 -0
  8. package/dist/contracts/job-store/a-job.js +28 -0
  9. package/dist/contracts/job-store/a-job.js.map +1 -0
  10. package/dist/contracts/job-store/claim-suite.d.ts +15 -0
  11. package/dist/contracts/job-store/claim-suite.d.ts.map +1 -0
  12. package/dist/contracts/job-store/claim-suite.js +126 -0
  13. package/dist/contracts/job-store/claim-suite.js.map +1 -0
  14. package/dist/contracts/job-store/job-fixtures.d.ts +5 -0
  15. package/dist/contracts/job-store/job-fixtures.d.ts.map +1 -0
  16. package/dist/contracts/job-store/job-fixtures.js +5 -0
  17. package/dist/contracts/job-store/job-fixtures.js.map +1 -0
  18. package/dist/contracts/job-store/job-store-under-contract.d.ts +61 -0
  19. package/dist/contracts/job-store/job-store-under-contract.d.ts.map +1 -0
  20. package/dist/contracts/job-store/job-store-under-contract.js +2 -0
  21. package/dist/contracts/job-store/job-store-under-contract.js.map +1 -0
  22. package/dist/contracts/job-store/keep-suite.d.ts +11 -0
  23. package/dist/contracts/job-store/keep-suite.d.ts.map +1 -0
  24. package/dist/contracts/job-store/keep-suite.js +55 -0
  25. package/dist/contracts/job-store/keep-suite.js.map +1 -0
  26. package/dist/contracts/job-store/later.d.ts +3 -0
  27. package/dist/contracts/job-store/later.d.ts.map +1 -0
  28. package/dist/contracts/job-store/later.js +6 -0
  29. package/dist/contracts/job-store/later.js.map +1 -0
  30. package/dist/contracts/job-store/report-suite.d.ts +12 -0
  31. package/dist/contracts/job-store/report-suite.d.ts.map +1 -0
  32. package/dist/contracts/job-store/report-suite.js +82 -0
  33. package/dist/contracts/job-store/report-suite.js.map +1 -0
  34. package/dist/contracts/job-store/transaction-suite.d.ts +23 -0
  35. package/dist/contracts/job-store/transaction-suite.d.ts.map +1 -0
  36. package/dist/contracts/job-store/transaction-suite.js +68 -0
  37. package/dist/contracts/job-store/transaction-suite.js.map +1 -0
  38. package/dist/contracts/job-store-contract.d.ts +24 -0
  39. package/dist/contracts/job-store-contract.d.ts.map +1 -0
  40. package/dist/contracts/job-store-contract.js +22 -0
  41. package/dist/contracts/job-store-contract.js.map +1 -0
  42. package/dist/contracts/process-store-contract.d.ts +28 -0
  43. package/dist/contracts/process-store-contract.d.ts.map +1 -0
  44. package/dist/contracts/process-store-contract.js +81 -0
  45. package/dist/contracts/process-store-contract.js.map +1 -0
  46. package/dist/contracts.d.ts +4 -0
  47. package/dist/contracts.d.ts.map +1 -1
  48. package/dist/contracts.js +3 -0
  49. package/dist/contracts.js.map +1 -1
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/processes/command-matcher.d.ts +8 -0
  55. package/dist/processes/command-matcher.d.ts.map +1 -0
  56. package/dist/processes/command-matcher.js +2 -0
  57. package/dist/processes/command-matcher.js.map +1 -0
  58. package/dist/processes/given-process.d.ts +18 -0
  59. package/dist/processes/given-process.d.ts.map +1 -0
  60. package/dist/processes/given-process.js +17 -0
  61. package/dist/processes/given-process.js.map +1 -0
  62. package/dist/processes/process-outcome.d.ts +20 -0
  63. package/dist/processes/process-outcome.d.ts.map +1 -0
  64. package/dist/processes/process-outcome.js +67 -0
  65. package/dist/processes/process-outcome.js.map +1 -0
  66. package/dist/scenarios/event-mismatches.d.ts.map +1 -1
  67. package/dist/scenarios/event-mismatches.js +1 -18
  68. package/dist/scenarios/event-mismatches.js.map +1 -1
  69. package/dist/scenarios/subset-differences.d.ts +3 -0
  70. package/dist/scenarios/subset-differences.d.ts.map +1 -0
  71. package/dist/scenarios/subset-differences.js +21 -0
  72. package/dist/scenarios/subset-differences.js.map +1 -0
  73. package/package.json +6 -5
@@ -0,0 +1,67 @@
1
+ import { AssertionError } from 'node:assert';
2
+ import { isDeepStrictEqual } from 'node:util';
3
+ import { show } from '../scenarios/show.js';
4
+ import { subsetDifferences } from '../scenarios/subset-differences.js';
5
+ /** What one step of a process decided, asserted without a store, a queue or a bus. Each assertion answers the outcome, to chain. */
6
+ export class ProcessOutcome {
7
+ decision;
8
+ constructor(decision) {
9
+ this.decision = decision;
10
+ }
11
+ /** The step ignored what it was given: no state saved, nothing sent. */
12
+ thenIgnored() {
13
+ return this.holds(this.decision === undefined, `expected the step to ignore it, it decided ${show(this.decision)}`);
14
+ }
15
+ /** Also asserts that the state survives the JSON the runner stores it as: a `Date` or a class instance does not. */
16
+ thenState(expected) {
17
+ const state = this.decided().state;
18
+ const stored = state === undefined ? undefined : JSON.parse(JSON.stringify(state));
19
+ this.holds(isDeepStrictEqual(stored, state), `the state ${show(state)} is stored as JSON and read back as ${show(stored)}: keep it plain JSON data`);
20
+ return this.holds(isDeepStrictEqual(state, expected), `expected the state ${show(expected)}, decided ${show(state)}`);
21
+ }
22
+ /** Exactly these commands, in order: each by its class or the properties that matter. */
23
+ thenCommands(expected) {
24
+ const sent = this.decided().commands ?? [];
25
+ const lines = [
26
+ ...(sent.length === expected.length ? [] : [`expected ${expected.length} command(s), decided ${sent.length}`]),
27
+ ...expected.flatMap((matcher, index) => commandMismatches(sent[index], matcher, `command ${index}`)),
28
+ ];
29
+ return this.holds(lines.length === 0, lines.join('\n'));
30
+ }
31
+ thenTimeouts(expected) {
32
+ const armed = this.decided().timeouts ?? [];
33
+ return this.holds(isDeepStrictEqual(armed, expected), `expected the timeouts ${show(expected)}, decided ${show(armed)}`);
34
+ }
35
+ /** The names of the timeouts the step disarms. */
36
+ thenCancelled(expected) {
37
+ const cancelled = this.decided().cancel ?? [];
38
+ return this.holds(isDeepStrictEqual(cancelled, expected), `expected to disarm ${show(expected)}, decided ${show(cancelled)}`);
39
+ }
40
+ thenEnded() {
41
+ return this.holds(this.decided().ended === true, 'expected the process to end, it goes on');
42
+ }
43
+ decided() {
44
+ if (this.decision === undefined) {
45
+ throw new AssertionError({ message: 'expected a decision, the step ignored what it was given' });
46
+ }
47
+ return this.decision;
48
+ }
49
+ holds(condition, message) {
50
+ if (!condition) {
51
+ throw new AssertionError({ message });
52
+ }
53
+ return this;
54
+ }
55
+ }
56
+ function commandMismatches(command, matcher, where) {
57
+ if (command === undefined) {
58
+ return [`${where}: none was decided`];
59
+ }
60
+ if (typeof matcher === 'function') {
61
+ return command instanceof matcher
62
+ ? []
63
+ : [`${where}: expected an instance of ${matcher.name}, decided ${show(command)}`];
64
+ }
65
+ return subsetDifferences(command, matcher, where);
66
+ }
67
+ //# sourceMappingURL=process-outcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-outcome.js","sourceRoot":"","sources":["../../src/processes/process-outcome.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"event-mismatches.d.ts","sourceRoot":"","sources":["../../src/scenarios/event-mismatches.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAYlG"}
1
+ {"version":3,"file":"event-mismatches.d.ts","sourceRoot":"","sources":["../../src/scenarios/event-mismatches.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAYlG"}
@@ -1,6 +1,6 @@
1
- import { isDeepStrictEqual } from 'node:util';
2
1
  import { describeEvent } from './describe-event.js';
3
2
  import { show } from './show.js';
3
+ import { subsetDifferences } from './subset-differences.js';
4
4
  /** Why the event is not the one the matcher describes, one line per difference; none when it is. */
5
5
  export function eventMismatches(event, matcher, where) {
6
6
  if (typeof matcher === 'string') {
@@ -13,21 +13,4 @@ export function eventMismatches(event, matcher, where) {
13
13
  }
14
14
  return subsetDifferences(event, matcher, where);
15
15
  }
16
- function subsetDifferences(actual, expected, path) {
17
- if (isPlainObject(expected) && typeof actual === 'object' && actual !== null) {
18
- return Object.entries(expected).flatMap(([key, value]) => {
19
- // Reflect.get rather than a spread: an event class may expose a property through a getter.
20
- const recorded = Reflect.get(actual, key);
21
- return subsetDifferences(recorded, value, `${path}.${key}`);
22
- });
23
- }
24
- return isDeepStrictEqual(actual, expected) ? [] : [`${path}: expected ${show(expected)}, recorded ${show(actual)}`];
25
- }
26
- function isPlainObject(value) {
27
- if (typeof value !== 'object' || value === null) {
28
- return false;
29
- }
30
- const prototype = Object.getPrototypeOf(value);
31
- return prototype === Object.prototype || prototype === null;
32
- }
33
16
  //# sourceMappingURL=event-mismatches.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-mismatches.js","sourceRoot":"","sources":["../../src/scenarios/event-mismatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,oGAAoG;AACpG,MAAM,UAAU,eAAe,CAAC,KAAkB,EAAE,OAAqB,EAAE,KAAa;IACtF,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,mBAAmB,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,KAAK,YAAY,OAAO;YAC7B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,GAAG,KAAK,6BAA6B,OAAO,CAAC,IAAI,cAAc,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAe,EAAE,QAAiB,EAAE,IAAY;IACzE,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC7E,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACvD,2FAA2F;YAC3F,MAAM,QAAQ,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAEnD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACtH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAExD,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"event-mismatches.js","sourceRoot":"","sources":["../../src/scenarios/event-mismatches.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,oGAAoG;AACpG,MAAM,UAAU,eAAe,CAAC,KAAkB,EAAE,OAAqB,EAAE,KAAa;IACtF,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,mBAAmB,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,KAAK,YAAY,OAAO;YAC7B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,GAAG,KAAK,6BAA6B,OAAO,CAAC,IAAI,cAAc,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Where `actual` differs from the properties `expected` names, one line each: a plain object of `expected` is a subset. */
2
+ export declare function subsetDifferences(actual: unknown, expected: unknown, path: string): string[];
3
+ //# sourceMappingURL=subset-differences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subset-differences.d.ts","sourceRoot":"","sources":["../../src/scenarios/subset-differences.ts"],"names":[],"mappings":"AAGA,4HAA4H;AAC5H,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5F"}
@@ -0,0 +1,21 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { show } from './show.js';
3
+ /** Where `actual` differs from the properties `expected` names, one line each: a plain object of `expected` is a subset. */
4
+ export function subsetDifferences(actual, expected, path) {
5
+ if (isPlainObject(expected) && typeof actual === 'object' && actual !== null) {
6
+ return Object.entries(expected).flatMap(([key, value]) => {
7
+ // Reflect.get rather than a spread: an event class may expose a property through a getter.
8
+ const recorded = Reflect.get(actual, key);
9
+ return subsetDifferences(recorded, value, `${path}.${key}`);
10
+ });
11
+ }
12
+ return isDeepStrictEqual(actual, expected) ? [] : [`${path}: expected ${show(expected)}, recorded ${show(actual)}`];
13
+ }
14
+ function isPlainObject(value) {
15
+ if (typeof value !== 'object' || value === null) {
16
+ return false;
17
+ }
18
+ const prototype = Object.getPrototypeOf(value);
19
+ return prototype === Object.prototype || prototype === null;
20
+ }
21
+ //# sourceMappingURL=subset-differences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subset-differences.js","sourceRoot":"","sources":["../../src/scenarios/subset-differences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,4HAA4H;AAC5H,MAAM,UAAU,iBAAiB,CAAC,MAAe,EAAE,QAAiB,EAAE,IAAY;IAChF,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC7E,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACvD,2FAA2F;YAC3F,MAAM,QAAQ,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAEnD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACtH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAExD,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ddd-ts-kit/testing",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "Readable tests without mocks: test data builders, given/when/then scenarios and contract suites shared by fakes and real adapters.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -46,12 +46,13 @@
46
46
  "dist"
47
47
  ],
48
48
  "dependencies": {
49
- "@ddd-ts-kit/kernel": "0.10.0"
49
+ "@ddd-ts-kit/kernel": "0.12.0"
50
50
  },
51
51
  "devDependencies": {
52
- "@ddd-ts-kit/aspects": "0.10.0",
53
- "@ddd-ts-kit/events": "0.10.0",
54
- "@faker-js/faker": "^10.6.0"
52
+ "@ddd-ts-kit/aspects": "0.12.0",
53
+ "@ddd-ts-kit/events": "0.12.0",
54
+ "@faker-js/faker": "^10.6.0",
55
+ "@ddd-ts-kit/scheduling": "0.12.0"
55
56
  },
56
57
  "peerDependencies": {
57
58
  "@faker-js/faker": ">=9.0.0"