@toa.io/core 1.0.0-alpha.273 → 1.0.0-alpha.277

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 (93) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +8 -7
  3. package/src/assignment.js +2 -6
  4. package/src/call.js +5 -7
  5. package/src/cascade.js +2 -6
  6. package/src/component.js +4 -8
  7. package/src/composition.js +3 -7
  8. package/src/connector.js +2 -6
  9. package/src/context.js +2 -6
  10. package/src/contract/contract.js +2 -6
  11. package/src/contract/index.js +2 -7
  12. package/src/contract/reply.js +4 -8
  13. package/src/contract/request.js +4 -8
  14. package/src/contract/schemas/index.js +7 -9
  15. package/src/discovery.js +3 -7
  16. package/src/effect.js +2 -6
  17. package/src/emission.js +2 -6
  18. package/src/entities/changeset.js +2 -6
  19. package/src/entities/entity.js +3 -7
  20. package/src/entities/factory.js +5 -9
  21. package/src/entities/index.js +1 -5
  22. package/src/entities/newid.js +2 -4
  23. package/src/entities/set.js +2 -6
  24. package/src/event.js +3 -7
  25. package/src/exceptions.js +37 -30
  26. package/src/exposition.js +2 -6
  27. package/src/guard.js +1 -5
  28. package/src/index.js +28 -55
  29. package/src/locator.js +2 -6
  30. package/src/observation.js +2 -6
  31. package/src/operation.js +4 -8
  32. package/src/outbox/index.js +1 -6
  33. package/src/outbox/outbox.js +5 -10
  34. package/src/query/criteria.js +3 -7
  35. package/src/query/options.js +2 -6
  36. package/src/query.js +5 -6
  37. package/src/receiver.js +4 -8
  38. package/src/reflection.js +2 -6
  39. package/src/remote.js +3 -7
  40. package/src/state.js +2 -6
  41. package/src/transition.js +4 -8
  42. package/src/transmission.js +3 -7
  43. package/src/unmanaged.js +2 -6
  44. package/test/call.fixtures.js +8 -12
  45. package/test/call.test.js +21 -9
  46. package/test/component.fixtures.js +5 -8
  47. package/test/component.test.js +22 -11
  48. package/test/connector.fixtures.js +5 -11
  49. package/test/connector.test.js +42 -41
  50. package/test/context.fixtures.js +8 -12
  51. package/test/context.test.js +18 -7
  52. package/test/contract/conditions.test.js +8 -6
  53. package/test/contract/contract.fixtures.js +12 -17
  54. package/test/contract/request.test.js +51 -40
  55. package/test/discovery.test.js +25 -17
  56. package/test/emission.fixtures.js +5 -8
  57. package/test/emission.test.js +29 -12
  58. package/test/entities/entity.fixtures.js +7 -11
  59. package/test/entities/entity.test.js +30 -19
  60. package/test/entities/factory.fixtures.js +22 -10
  61. package/test/entities/factory.test.js +29 -17
  62. package/test/entities/set.fixtures.js +6 -8
  63. package/test/entities/set.test.js +6 -5
  64. package/test/event.fixtures.js +9 -14
  65. package/test/event.test.js +57 -31
  66. package/test/locator.test.js +25 -24
  67. package/test/outbox.test.js +44 -37
  68. package/test/query.fixtures.js +1 -5
  69. package/test/query.test.js +28 -17
  70. package/test/receiver.fixtures.js +8 -12
  71. package/test/receiver.test.js +45 -22
  72. package/test/reflection.test.js +7 -6
  73. package/test/state.fixtures.js +24 -32
  74. package/test/state.test.js +35 -30
  75. package/test/transmission.fixtures.js +4 -6
  76. package/test/transmission.test.js +33 -15
  77. package/types/atomicity.d.ts +1 -1
  78. package/types/bindings.d.ts +1 -1
  79. package/types/bridges.ts +3 -3
  80. package/types/component.d.ts +4 -4
  81. package/types/context.d.ts +4 -4
  82. package/types/entity.d.ts +2 -2
  83. package/types/event.d.ts +1 -1
  84. package/types/extensions.d.ts +8 -7
  85. package/types/index.ts +16 -16
  86. package/types/operations.d.ts +1 -1
  87. package/types/outbox.d.ts +2 -2
  88. package/types/receiver.d.ts +2 -2
  89. package/types/reflection.d.ts +1 -1
  90. package/types/remote.d.ts +1 -1
  91. package/types/request.d.ts +1 -1
  92. package/types/state.d.ts +2 -2
  93. package/types/storages.d.ts +3 -3
package/src/index.js CHANGED
@@ -1,55 +1,28 @@
1
- const { Assignment } = require('./assignment')
2
- const { Call } = require('./call')
3
- const { Cascade } = require('./cascade')
4
- const { Composition } = require('./composition')
5
- const { Connector } = require('./connector')
6
- const { Context } = require('./context')
7
- const { Discovery } = require('./discovery')
8
- const { Effect } = require('./effect')
9
- const { Emission } = require('./emission')
10
- const { Event } = require('./event')
11
- const { Exposition } = require('./exposition')
12
- const { Locator } = require('./locator')
13
- const { Observation } = require('./observation')
14
- const { Outbox } = require('./outbox')
15
- const { Operation } = require('./operation')
16
- const { Query } = require('./query')
17
- const { Receiver } = require('./receiver')
18
- const { Reflection } = require('./reflection')
19
- const { Remote } = require('./remote')
20
- const { Component } = require('./component')
21
- const { State } = require('./state')
22
- const { Transition } = require('./transition')
23
- const { Transmission } = require('./transmission')
24
- const { Unmanaged } = require('./unmanaged')
25
- const { Guard } = require('./guard')
26
-
27
- exports.entities = require('./entities')
28
- exports.exceptions = require('./exceptions')
29
- exports.contract = require('./contract')
30
-
31
- exports.Assignment = Assignment
32
- exports.Call = Call
33
- exports.Cascade = Cascade
34
- exports.Component = Component
35
- exports.Composition = Composition
36
- exports.Connector = Connector
37
- exports.Context = Context
38
- exports.Discovery = Discovery
39
- exports.Effect = Effect
40
- exports.Emission = Emission
41
- exports.Event = Event
42
- exports.Exposition = Exposition
43
- exports.Locator = Locator
44
- exports.Observation = Observation
45
- exports.Outbox = Outbox
46
- exports.Operation = Operation
47
- exports.Query = Query
48
- exports.Receiver = Receiver
49
- exports.Reflection = Reflection
50
- exports.Remote = Remote
51
- exports.State = State
52
- exports.Transition = Transition
53
- exports.Transmission = Transmission
54
- exports.Unmanaged = Unmanaged
55
- exports.Guard = Guard
1
+ export { Assignment } from './assignment.js'
2
+ export { Call } from './call.js'
3
+ export { Cascade } from './cascade.js'
4
+ export { Component } from './component.js'
5
+ export { Composition } from './composition.js'
6
+ export { Connector } from './connector.js'
7
+ export { Context } from './context.js'
8
+ export { Discovery } from './discovery.js'
9
+ export { Effect } from './effect.js'
10
+ export { Emission } from './emission.js'
11
+ export { Event } from './event.js'
12
+ export { Exposition } from './exposition.js'
13
+ export { Locator } from './locator.js'
14
+ export { Observation } from './observation.js'
15
+ export { Outbox } from './outbox/index.js'
16
+ export { Operation } from './operation.js'
17
+ export { Query } from './query.js'
18
+ export { Receiver } from './receiver.js'
19
+ export { Reflection } from './reflection.js'
20
+ export { Remote } from './remote.js'
21
+ export { State } from './state.js'
22
+ export { Transition } from './transition.js'
23
+ export { Transmission } from './transmission.js'
24
+ export { Unmanaged } from './unmanaged.js'
25
+ export { Guard } from './guard.js'
26
+ export * as entities from './entities/index.js'
27
+ export * as exceptions from './exceptions.js'
28
+ export * as contract from './contract/index.js'
package/src/locator.js CHANGED
@@ -1,11 +1,9 @@
1
- 'use strict'
2
-
3
- const { concat } = require('@toa.io/generic')
1
+ import { concat } from '@toa.io/generic'
4
2
 
5
3
  /**
6
4
  * @implements {toa.core.Locator}
7
5
  */
8
- class Locator {
6
+ export class Locator {
9
7
  name
10
8
  namespace
11
9
 
@@ -50,5 +48,3 @@ class Locator {
50
48
  }
51
49
 
52
50
  const DOT = '.'
53
-
54
- exports.Locator = Locator
@@ -1,12 +1,8 @@
1
- 'use strict'
1
+ import { Operation } from './operation.js'
2
2
 
3
- const { Operation } = require('./operation')
4
-
5
- class Observation extends Operation {
3
+ export class Observation extends Operation {
6
4
  async run (store) {
7
5
  if (store.scope === null || (store.scope?.deleted === true && store.request.query?.options?.deleted !== true)) store.reply = null
8
6
  else await super.run(store)
9
7
  }
10
8
  }
11
-
12
- exports.Observation = Observation
package/src/operation.js CHANGED
@@ -1,10 +1,8 @@
1
- 'use strict'
1
+ import { Connector } from './connector.js'
2
+ import { SystemException, RequestContractException } from './exceptions.js'
3
+ import { Readable } from 'node:stream'
2
4
 
3
- const { Connector } = require('./connector')
4
- const { SystemException, RequestContractException } = require('./exceptions')
5
- const { Readable } = require('node:stream')
6
-
7
- class Operation extends Connector {
5
+ export class Operation extends Connector {
8
6
  scope
9
7
 
10
8
  /**
@@ -95,5 +93,3 @@ class Operation extends Connector {
95
93
  return this.scope[this.#scope](query, this.mutable)
96
94
  }
97
95
  }
98
-
99
- exports.Operation = Operation
@@ -1,6 +1 @@
1
- 'use strict'
2
-
3
- const { Outbox, LANES } = require('./outbox')
4
-
5
- exports.Outbox = Outbox
6
- exports.LANES = LANES
1
+ export { Outbox, LANES } from './outbox.js'
@@ -1,8 +1,6 @@
1
- 'use strict'
2
-
3
- const { console } = require('openspan')
4
- const { Connector } = require('../connector')
5
- const { newid } = require('../entities/newid')
1
+ import { console } from 'openspan'
2
+ import { Connector } from '../connector.js'
3
+ import { newid } from '../entities/newid.js'
6
4
 
7
5
  /**
8
6
  * Owns the intent to publish. A row is built before the write so that the storage can commit
@@ -15,7 +13,7 @@ const { newid } = require('../entities/newid')
15
13
  * A storage that cannot commit a row atomically has no outbox, and this degrades to the
16
14
  * inline emission it replaces.
17
15
  */
18
- class Outbox extends Connector {
16
+ export class Outbox extends Connector {
19
17
  #emission
20
18
  #storage
21
19
  #atom
@@ -278,7 +276,7 @@ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms).unref())
278
276
  * lanes nobody reads any more. It is also the ceiling on replicas of one component, and a
279
277
  * power of two so that the common replica counts divide evenly.
280
278
  */
281
- const LANES = 128
279
+ export const LANES = 128
282
280
 
283
281
  /** one cycle reads, publishes and marks; in steady state it finds nothing to read */
284
282
  const INTERVAL = 5000
@@ -296,6 +294,3 @@ const BATCH = 200
296
294
  const DRAIN = 10_000
297
295
  const INFLIGHT = 1000
298
296
  const PUBLISHED = 10_000
299
-
300
- exports.Outbox = Outbox
301
- exports.LANES = LANES
@@ -1,9 +1,7 @@
1
- 'use strict'
1
+ import { parse } from '@rsql/parser'
2
+ import { QuerySyntaxException } from '../exceptions.js'
2
3
 
3
- const { parse } = require('@rsql/parser')
4
- const { QuerySyntaxException } = require('../exceptions')
5
-
6
- const criteria = (criteria, properties) => {
4
+ export const criteria = (criteria, properties) => {
7
5
  let ast
8
6
 
9
7
  try {
@@ -37,5 +35,3 @@ const COERCE = {
37
35
  integer: Number.parseInt,
38
36
  boolean: (value) => value === 'true'
39
37
  }
40
-
41
- exports.criteria = criteria
@@ -1,8 +1,6 @@
1
- 'use strict'
1
+ import { QuerySyntaxException } from '../exceptions.js'
2
2
 
3
- const { QuerySyntaxException } = require('../exceptions')
4
-
5
- const options = (options, properties, system) => {
3
+ export const options = (options, properties, system) => {
6
4
  if (options.sort !== undefined) options.sort = sort(options.sort, properties)
7
5
 
8
6
  if (options.projection !== undefined) projection(options.projection, properties)
@@ -37,5 +35,3 @@ const projection = (projection, properties) => {
37
35
  if (!projection.includes(property))
38
36
  projection.push(property)
39
37
  }
40
-
41
- exports.options = options
package/src/query.js CHANGED
@@ -1,9 +1,10 @@
1
- 'use strict'
1
+ import { empty } from '@toa.io/generic'
2
+ import * as criteria from './query/criteria.js'
3
+ import * as options from './query/options.js'
2
4
 
3
- const { empty } = require('@toa.io/generic')
4
- const parse = { ...require('./query/criteria'), ...require('./query/options') }
5
+ const parse = { ...criteria, ...options }
5
6
 
6
- class Query {
7
+ export class Query {
7
8
  #properties
8
9
  #system
9
10
 
@@ -67,5 +68,3 @@ class Query {
67
68
  }
68
69
 
69
70
  const LIMIT = 1024
70
-
71
- exports.Query = Query
package/src/receiver.js CHANGED
@@ -1,13 +1,11 @@
1
- 'use strict'
2
-
3
- const { console, decode, run } = require('openspan')
4
- const { add } = require('@toa.io/generic')
5
- const { Connector } = require('./connector')
1
+ import { console, decode, run } from 'openspan'
2
+ import { add } from '@toa.io/generic'
3
+ import { Connector } from './connector.js'
6
4
 
7
5
  /**
8
6
  * @implements {toa.core.Receiver}
9
7
  */
10
- class Receiver extends Connector {
8
+ export class Receiver extends Connector {
11
9
  /** @type {boolean} */
12
10
  #conditioned
13
11
 
@@ -123,5 +121,3 @@ class Receiver extends Connector {
123
121
  return this.#adaptive ? await this.#bridge.request(payload, ...(this.#arguments ?? [])) : { input: payload }
124
122
  }
125
123
  }
126
-
127
- exports.Receiver = Receiver
package/src/reflection.js CHANGED
@@ -1,11 +1,9 @@
1
- 'use strict'
2
-
3
- const { Connector } = require('./connector')
1
+ import { Connector } from './connector.js'
4
2
 
5
3
  /**
6
4
  * @implements {toa.core.Reflection}
7
5
  */
8
- class Reflection extends Connector {
6
+ export class Reflection extends Connector {
9
7
  /** @type {toa.core.reflection.Source} */
10
8
  #source
11
9
 
@@ -24,5 +22,3 @@ class Reflection extends Connector {
24
22
  this.value = await this.#source()
25
23
  }
26
24
  }
27
-
28
- exports.Reflection = Reflection
package/src/remote.js CHANGED
@@ -1,9 +1,7 @@
1
- 'use strict'
1
+ import assert from 'node:assert'
2
+ import { Component } from './component.js'
2
3
 
3
- const assert = require('node:assert')
4
- const { Component } = require('./component')
5
-
6
- class Remote extends Component {
4
+ export class Remote extends Component {
7
5
  kind = 'client'
8
6
 
9
7
  explain (endpoint) {
@@ -14,5 +12,3 @@ class Remote extends Component {
14
12
  return this.operations[endpoint].explain()
15
13
  }
16
14
  }
17
-
18
- exports.Remote = Remote
package/src/state.js CHANGED
@@ -1,8 +1,6 @@
1
- 'use strict'
1
+ import { StatePreconditionException, StateNotFoundException } from './exceptions.js'
2
2
 
3
- const { StatePreconditionException, StateNotFoundException } = require('./exceptions')
4
-
5
- class State {
3
+ export class State {
6
4
  storage
7
5
 
8
6
  #associated
@@ -138,5 +136,3 @@ class State {
138
136
 
139
137
  /** an effect never commits what `ensure` hands it, see `Effect` */
140
138
  const NOT_MUTABLE = false
141
-
142
- exports.State = State
package/src/transition.js CHANGED
@@ -1,10 +1,8 @@
1
- 'use strict'
1
+ import { retry } from '@toa.io/generic'
2
+ import { Operation } from './operation.js'
3
+ import { StateConcurrencyException, StateNotFoundException } from './exceptions.js'
2
4
 
3
- const { retry } = require('@toa.io/generic')
4
- const { Operation } = require('./operation')
5
- const { StateConcurrencyException, StateNotFoundException } = require('./exceptions')
6
-
7
- class Transition extends Operation {
5
+ export class Transition extends Operation {
8
6
  /** a transition is the only operation that commits */
9
7
  mutable = true
10
8
 
@@ -61,5 +59,3 @@ const RETRY = {
61
59
  dispersion: 1,
62
60
  retries: 32
63
61
  }
64
-
65
- exports.Transition = Transition
@@ -1,9 +1,7 @@
1
- 'use strict'
1
+ import { Connector } from './connector.js'
2
+ import { TransmissionException } from './exceptions.js'
2
3
 
3
- const { Connector } = require('./connector')
4
- const { TransmissionException } = require('./exceptions')
5
-
6
- class Transmission extends Connector {
4
+ export class Transmission extends Connector {
7
5
  #bindings
8
6
 
9
7
  constructor (bindings) {
@@ -38,5 +36,3 @@ class Transmission extends Connector {
38
36
  return reply
39
37
  }
40
38
  }
41
-
42
- exports.Transmission = Transmission
package/src/unmanaged.js CHANGED
@@ -1,11 +1,7 @@
1
- 'use strict'
1
+ import { Operation } from './operation.js'
2
2
 
3
- const { Operation } = require('./operation')
4
-
5
- class Unmanaged extends Operation {
3
+ export class Unmanaged extends Operation {
6
4
  acquire (context) {
7
5
  context.state = this.scope.storage.raw
8
6
  }
9
7
  }
10
-
11
- exports.Unmanaged = Unmanaged
@@ -1,18 +1,18 @@
1
- 'use strict'
1
+ import { mock } from 'node:test'
2
2
 
3
- const { generate } = require('randomstring')
3
+ import { generate } from 'randomstring'
4
4
 
5
5
  // noinspection JSCheckFunctionSignatures
6
- const transmission = {
7
- request: jest.fn((request) => ({ [request.invalid ? 'exception' : 'output']: generate() })),
8
- link: jest.fn()
6
+ export const transmission = {
7
+ request: mock.fn((request) => ({ [request.invalid ? 'exception' : 'output']: generate() })),
8
+ link: mock.fn()
9
9
  }
10
10
 
11
- const contract = {
12
- fit: jest.fn(() => null)
11
+ export const contract = {
12
+ fit: mock.fn(() => null)
13
13
  }
14
14
 
15
- const request = () => ({
15
+ export const request = () => ({
16
16
  ok: {
17
17
  input: { [generate()]: generate() },
18
18
  query: { [generate()]: generate() }
@@ -21,7 +21,3 @@ const request = () => ({
21
21
  invalid: true
22
22
  }
23
23
  })
24
-
25
- exports.transmission = transmission
26
- exports.contract = contract
27
- exports.request = request
package/test/call.test.js CHANGED
@@ -1,18 +1,20 @@
1
- 'use strict'
1
+ import { it, beforeEach, mock } from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+ import { isDeepStrictEqual } from 'node:util'
2
4
 
3
- const fixtures = require('./call.fixtures')
4
- const { Call } = require('../src/call')
5
+ import * as fixtures from './call.fixtures.js'
6
+ import { Call } from '../src/call.js'
5
7
 
6
8
  let call
7
9
 
8
10
  beforeEach(() => {
9
- jest.clearAllMocks()
11
+ resetCalls()
10
12
 
11
13
  call = new Call(fixtures.transmission, fixtures.contract)
12
14
  })
13
15
 
14
16
  it('should depend on transmission', () => {
15
- expect(fixtures.transmission.link).toHaveBeenLastCalledWith(call)
17
+ assert.ok(((invocation) => invocation.arguments.length === 1 && isDeepStrictEqual(invocation.arguments[0], call))(fixtures.transmission.link.mock.calls.at(-1) ?? { arguments: [] }))
16
18
  })
17
19
 
18
20
  it('should call transmission', async () => {
@@ -20,7 +22,7 @@ it('should call transmission', async () => {
20
22
 
21
23
  await call.invoke(request)
22
24
 
23
- expect(fixtures.transmission.request).toHaveBeenCalledWith(request)
25
+ assert.ok(fixtures.transmission.request.mock.calls.some((invocation) => invocation.arguments.length === 1 && isDeepStrictEqual(invocation.arguments[0], request)))
24
26
  })
25
27
 
26
28
  it('should fit request', async () => {
@@ -28,7 +30,7 @@ it('should fit request', async () => {
28
30
 
29
31
  await call.invoke(request)
30
32
 
31
- expect(fixtures.contract.fit).toHaveBeenLastCalledWith(request)
33
+ assert.ok(((invocation) => invocation.arguments.length === 1 && isDeepStrictEqual(invocation.arguments[0], request))(fixtures.contract.fit.mock.calls.at(-1) ?? { arguments: [] }))
32
34
  })
33
35
 
34
36
  it('should return reply', async () => {
@@ -36,11 +38,21 @@ it('should return reply', async () => {
36
38
 
37
39
  const reply = await call.invoke(request)
38
40
 
39
- expect(reply).toStrictEqual(fixtures.transmission.request.mock.results[0].value.output)
41
+ assert.deepStrictEqual(reply, fixtures.transmission.request.mock.calls[0].result.output)
40
42
  })
41
43
 
42
44
  it('should throw received exceptions', async () => {
43
45
  const request = fixtures.request().bad
44
46
 
45
- await expect(call.invoke(request)).rejects.toBeDefined()
47
+ await assert.rejects(call.invoke(request), (error) => { assert.notStrictEqual(error, undefined); return true })
46
48
  })
49
+
50
+ function resetCalls (target = [assert, fixtures], seen = new Set()) {
51
+ if (target === null || typeof target !== 'object' || seen.has(target)) return
52
+
53
+ seen.add(target)
54
+
55
+ for (const value of Object.values(target))
56
+ if (typeof value === 'function' && value.mock !== undefined) value.mock.resetCalls()
57
+ else resetCalls(value, seen)
58
+ }
@@ -1,10 +1,10 @@
1
- 'use strict'
1
+ import { mock } from 'node:test'
2
2
 
3
- const randomstring = require('randomstring')
3
+ import randomstring from 'randomstring'
4
4
 
5
- const invocation = () => jest.fn(() => randomstring.generate())
5
+ const invocation = () => mock.fn(() => randomstring.generate())
6
6
 
7
- const invocations = {
7
+ export const invocations = {
8
8
  foo: {
9
9
  invoke: invocation('foo'),
10
10
  link: () => null
@@ -15,7 +15,4 @@ const invocations = {
15
15
  }
16
16
  }
17
17
 
18
- const locator = {}
19
-
20
- exports.invocations = invocations
21
- exports.locator = locator
18
+ export const locator = {}
@@ -1,9 +1,11 @@
1
- 'use strict'
1
+ import { describe, it, beforeEach, mock } from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+ import { isDeepStrictEqual } from 'node:util'
2
4
 
3
- const { Component } = require('../src/component')
4
- const { codes } = require('../src/exceptions')
5
- const fixtures = require('./component.fixtures')
6
- const { AssertionError } = require('node:assert')
5
+ import { Component } from '../src/component.js'
6
+ import { codes } from '../src/exceptions.js'
7
+ import * as fixtures from './component.fixtures.js'
8
+ import { AssertionError } from 'node:assert'
7
9
 
8
10
  describe('Invocations', () => {
9
11
  const name = ['foo', 'bar'][Math.floor(2 * Math.random())]
@@ -11,18 +13,17 @@ describe('Invocations', () => {
11
13
  const component = new Component(fixtures.locator, fixtures.invocations)
12
14
 
13
15
  beforeEach(() => {
14
- jest.clearAllMocks()
16
+ resetCalls()
15
17
  })
16
18
 
17
19
  it('should invoke', async () => {
18
20
  await component.invoke(name)
19
21
 
20
- expect(invocation.invoke).toHaveBeenCalled()
22
+ assert.ok(invocation.invoke.mock.callCount() > 0)
21
23
  })
22
24
 
23
25
  it('should throw on unknown invocation name', async () => {
24
- await expect(() => component.invoke('baz'))
25
- .rejects.toThrow(AssertionError)
26
+ await assert.rejects(() => component.invoke('baz'), AssertionError)
26
27
  })
27
28
 
28
29
  it('should invoke input and query', async () => {
@@ -30,12 +31,22 @@ describe('Invocations', () => {
30
31
  const query = { test: Math.random() }
31
32
  await component.invoke(name, { input, query })
32
33
 
33
- expect(invocation.invoke).toHaveBeenCalledWith({ input, query })
34
+ assert.ok(invocation.invoke.mock.calls.some((call) => call.arguments.length === 1 && isDeepStrictEqual(call.arguments[0], { input, query })))
34
35
  })
35
36
 
36
37
  it('should return io', async () => {
37
38
  const io = await component.invoke(name)
38
39
 
39
- expect(io).toBe(fixtures.invocations[name].invoke.mock.results[0].value)
40
+ assert.strictEqual(io, fixtures.invocations[name].invoke.mock.calls[0].result)
40
41
  })
41
42
  })
43
+
44
+ function resetCalls (target = [assert, fixtures], seen = new Set()) {
45
+ if (target === null || typeof target !== 'object' || seen.has(target)) return
46
+
47
+ seen.add(target)
48
+
49
+ for (const value of Object.values(target))
50
+ if (typeof value === 'function' && value.mock !== undefined) value.mock.resetCalls()
51
+ else resetCalls(value, seen)
52
+ }
@@ -1,9 +1,7 @@
1
- 'use strict'
1
+ import { random, timeout } from '@toa.io/generic'
2
+ import { Connector } from '../src/connector.js'
2
3
 
3
- const { random, timeout } = require('@toa.io/generic')
4
- const { Connector } = require('../src/connector')
5
-
6
- class TestConnector extends Connector {
4
+ export class TestConnector extends Connector {
7
5
  #label
8
6
  #seq
9
7
 
@@ -29,7 +27,7 @@ class TestConnector extends Connector {
29
27
  }
30
28
  }
31
29
 
32
- class FailingConnector extends Connector {
30
+ export class FailingConnector extends Connector {
33
31
  async open () {
34
32
  await timeout(random(10))
35
33
  throw new Error('FailingConnector')
@@ -37,12 +35,8 @@ class FailingConnector extends Connector {
37
35
  }
38
36
 
39
37
  /** Stands for a connector waiting for something that never arrives. */
40
- class StuckConnector extends Connector {
38
+ export class StuckConnector extends Connector {
41
39
  async open () {
42
40
  return new Promise(() => undefined)
43
41
  }
44
42
  }
45
-
46
- exports.TestConnector = TestConnector
47
- exports.FailingConnector = FailingConnector
48
- exports.StuckConnector = StuckConnector