@toa.io/core 0.1.0-alpha.12

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 (68) hide show
  1. package/LICENSE +22 -0
  2. package/package.json +28 -0
  3. package/src/assignment.js +22 -0
  4. package/src/call.js +29 -0
  5. package/src/cascade.js +32 -0
  6. package/src/composition.js +26 -0
  7. package/src/connector.js +122 -0
  8. package/src/context.js +43 -0
  9. package/src/contract/conditions.js +21 -0
  10. package/src/contract/index.js +7 -0
  11. package/src/contract/reply.js +22 -0
  12. package/src/contract/request.js +49 -0
  13. package/src/contract/schemas/error.yaml +7 -0
  14. package/src/contract/schemas/index.js +7 -0
  15. package/src/contract/schemas/query.yaml +31 -0
  16. package/src/discovery.js +33 -0
  17. package/src/emission.js +23 -0
  18. package/src/entities/changeset.js +46 -0
  19. package/src/entities/entity.js +48 -0
  20. package/src/entities/factory.js +33 -0
  21. package/src/entities/index.js +5 -0
  22. package/src/entities/set.js +15 -0
  23. package/src/event.js +33 -0
  24. package/src/exceptions.js +88 -0
  25. package/src/exposition.js +24 -0
  26. package/src/index.js +43 -0
  27. package/src/locator.js +49 -0
  28. package/src/observation.js +19 -0
  29. package/src/operation.js +61 -0
  30. package/src/query/criteria.js +41 -0
  31. package/src/query/options.js +40 -0
  32. package/src/query.js +36 -0
  33. package/src/receiver.js +36 -0
  34. package/src/remote.js +17 -0
  35. package/src/runtime.js +38 -0
  36. package/src/state.js +95 -0
  37. package/src/transition.js +50 -0
  38. package/src/transmission.js +33 -0
  39. package/test/call.fixtures.js +25 -0
  40. package/test/call.test.js +52 -0
  41. package/test/cascade.fixtures.js +11 -0
  42. package/test/cascade.test.js +42 -0
  43. package/test/connector.fixtures.js +40 -0
  44. package/test/connector.test.js +199 -0
  45. package/test/contract/conditions.test.js +26 -0
  46. package/test/contract/contract.fixtures.js +27 -0
  47. package/test/contract/request.test.js +99 -0
  48. package/test/emission.fixtures.js +16 -0
  49. package/test/emission.test.js +35 -0
  50. package/test/entities/entity.fixtures.js +26 -0
  51. package/test/entities/entity.test.js +64 -0
  52. package/test/entities/factory.fixtures.js +18 -0
  53. package/test/entities/factory.test.js +48 -0
  54. package/test/entities/set.fixtures.js +11 -0
  55. package/test/entities/set.test.js +12 -0
  56. package/test/event.fixtures.js +28 -0
  57. package/test/event.test.js +106 -0
  58. package/test/locator.test.js +34 -0
  59. package/test/query.fixtures.js +100 -0
  60. package/test/query.test.js +86 -0
  61. package/test/receiver.fixtures.js +22 -0
  62. package/test/receiver.test.js +66 -0
  63. package/test/runtime.fixtures.js +19 -0
  64. package/test/runtime.test.js +40 -0
  65. package/test/state.fixtures.js +46 -0
  66. package/test/state.test.js +54 -0
  67. package/test/transmission.fixtures.js +15 -0
  68. package/test/transmission.test.js +46 -0
@@ -0,0 +1,46 @@
1
+ 'use strict'
2
+
3
+ const { generate } = require('randomstring')
4
+
5
+ const storage = {
6
+ name: 'dummy',
7
+ get: jest.fn(() => ({ id: generate() })),
8
+ find: jest.fn(() => ([{ id: generate() }])),
9
+ add: jest.fn(() => true),
10
+ set: jest.fn(() => true),
11
+ store: jest.fn(() => true)
12
+ }
13
+
14
+ const factory = {
15
+ entity: jest.fn(() => ({ [generate()]: generate() })),
16
+ set: jest.fn(() => ({ [generate()]: generate() }))
17
+ }
18
+
19
+ const query = generate()
20
+
21
+ const entity = {
22
+ get: jest.fn(() => ({ [generate()]: generate() })),
23
+ event: jest.fn(() => ({ state: { [generate()]: generate() }, changeset: { [generate()]: generate() } }))
24
+ }
25
+
26
+ const initial = {
27
+ initial: true,
28
+ ...entity
29
+ }
30
+
31
+ const unchanged = {
32
+ ...entity,
33
+ event: jest.fn(() => ({ state: { [generate()]: generate() }, changeset: {} }))
34
+ }
35
+
36
+ const emitter = {
37
+ emit: jest.fn()
38
+ }
39
+
40
+ exports.storage = storage
41
+ exports.factory = factory
42
+ exports.emitter = emitter
43
+ exports.query = query
44
+ exports.entity = entity
45
+ exports.initial = initial
46
+ exports.unchanged = unchanged
@@ -0,0 +1,54 @@
1
+ 'use strict'
2
+
3
+ const { State } = require('../src/state')
4
+ const fixtures = require('./state.fixtures')
5
+
6
+ let state
7
+
8
+ beforeAll(() => {
9
+ delete global.TOA_INTEGRATION_OMIT_EMISSION
10
+ })
11
+
12
+ afterAll(() => {
13
+ global.TOA_INTEGRATION_OMIT_EMISSION = true
14
+ })
15
+
16
+ beforeEach(() => {
17
+ jest.clearAllMocks()
18
+
19
+ state = new State(fixtures.storage, fixtures.factory, fixtures.emitter)
20
+ })
21
+
22
+ it('should provide entity', async () => {
23
+ const entity = await state.entity(fixtures.query)
24
+
25
+ expect(fixtures.storage.get).toHaveBeenCalledWith(fixtures.query)
26
+ expect(entity).toStrictEqual(fixtures.factory.entity.mock.results[0].value)
27
+ expect(fixtures.factory.entity).toHaveBeenCalledWith(fixtures.storage.get.mock.results[0].value)
28
+ })
29
+
30
+ it('should provide set', async () => {
31
+ const set = await state.set(fixtures.query)
32
+
33
+ expect(fixtures.storage.find).toHaveBeenCalledWith(fixtures.query)
34
+ expect(set).toStrictEqual(fixtures.factory.set.mock.results[0].value)
35
+ expect(fixtures.factory.set).toHaveBeenCalledWith(fixtures.storage.find.mock.results[0].value)
36
+ })
37
+
38
+ it('should store entity', async () => {
39
+ await state.commit(fixtures.initial)
40
+
41
+ expect(fixtures.storage.store).toHaveBeenCalledWith(fixtures.initial.get.mock.results[0].value)
42
+ })
43
+
44
+ it('should emit', async () => {
45
+ await state.commit(fixtures.entity)
46
+
47
+ expect(fixtures.emitter.emit).toHaveBeenCalledWith(fixtures.entity.event.mock.results[0].value)
48
+ })
49
+
50
+ it('should not emit if state has not been changed', async () => {
51
+ await state.commit(fixtures.unchanged)
52
+
53
+ expect(fixtures.emitter.emit).not.toHaveBeenCalled()
54
+ })
@@ -0,0 +1,15 @@
1
+ 'use strict'
2
+
3
+ const { generate } = require('randomstring')
4
+
5
+ const binding = (index) => ({
6
+ request: jest.fn(async (request) => {
7
+ if (request?.pick !== undefined && request.pick !== index) return false
8
+
9
+ return { output: generate() }
10
+ })
11
+ })
12
+
13
+ const bindings = [0, 1, 2, 3, 4].map(binding)
14
+
15
+ exports.bindings = bindings
@@ -0,0 +1,46 @@
1
+ 'use strict'
2
+
3
+ jest.mock('../src/connector')
4
+
5
+ const { Connector } = require('../src/connector')
6
+ const { Transmission } = require('../src/transmission')
7
+ const { codes } = require('../src/exceptions')
8
+ const fixtures = require('./transmission.fixtures')
9
+
10
+ let transmission
11
+
12
+ beforeEach(() => {
13
+ jest.clearAllMocks()
14
+ })
15
+
16
+ beforeEach(() => {
17
+ transmission = new Transmission(fixtures.bindings)
18
+ })
19
+
20
+ it('should be instance of Connector depending on bindings', () => {
21
+ expect(transmission).toBeInstanceOf(Connector)
22
+ expect(Connector.mock.instances[0].depends).toHaveBeenCalledWith(fixtures.bindings)
23
+ })
24
+
25
+ it('should pass arguments and return value', async () => {
26
+ const request = { foo: 'bar' }
27
+ const result = await transmission.request(request)
28
+
29
+ expect(fixtures.bindings[0].request).toHaveBeenCalledWith(request)
30
+ expect(result).toBe(await fixtures.bindings[0].request.mock.results[0].value)
31
+ })
32
+
33
+ it('should pick bindings sequentially', async () => {
34
+ let result = await transmission.request()
35
+ expect(result).toBe(await fixtures.bindings[0].request.mock.results[0].value)
36
+
37
+ result = await transmission.request({ pick: 1 })
38
+ expect(result).toBe(await fixtures.bindings[1].request.mock.results[0]?.value)
39
+ })
40
+
41
+ it('should throw exception if none succeeded', async () => {
42
+ await expect(transmission.request({ pick: 5 })).rejects.toMatchObject({ code: codes.Transmission })
43
+
44
+ fixtures.bindings.forEach((binding) =>
45
+ expect(binding.request).toHaveBeenCalled())
46
+ })