@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.
- package/LICENSE +22 -0
- package/package.json +28 -0
- package/src/assignment.js +22 -0
- package/src/call.js +29 -0
- package/src/cascade.js +32 -0
- package/src/composition.js +26 -0
- package/src/connector.js +122 -0
- package/src/context.js +43 -0
- package/src/contract/conditions.js +21 -0
- package/src/contract/index.js +7 -0
- package/src/contract/reply.js +22 -0
- package/src/contract/request.js +49 -0
- package/src/contract/schemas/error.yaml +7 -0
- package/src/contract/schemas/index.js +7 -0
- package/src/contract/schemas/query.yaml +31 -0
- package/src/discovery.js +33 -0
- package/src/emission.js +23 -0
- package/src/entities/changeset.js +46 -0
- package/src/entities/entity.js +48 -0
- package/src/entities/factory.js +33 -0
- package/src/entities/index.js +5 -0
- package/src/entities/set.js +15 -0
- package/src/event.js +33 -0
- package/src/exceptions.js +88 -0
- package/src/exposition.js +24 -0
- package/src/index.js +43 -0
- package/src/locator.js +49 -0
- package/src/observation.js +19 -0
- package/src/operation.js +61 -0
- package/src/query/criteria.js +41 -0
- package/src/query/options.js +40 -0
- package/src/query.js +36 -0
- package/src/receiver.js +36 -0
- package/src/remote.js +17 -0
- package/src/runtime.js +38 -0
- package/src/state.js +95 -0
- package/src/transition.js +50 -0
- package/src/transmission.js +33 -0
- package/test/call.fixtures.js +25 -0
- package/test/call.test.js +52 -0
- package/test/cascade.fixtures.js +11 -0
- package/test/cascade.test.js +42 -0
- package/test/connector.fixtures.js +40 -0
- package/test/connector.test.js +199 -0
- package/test/contract/conditions.test.js +26 -0
- package/test/contract/contract.fixtures.js +27 -0
- package/test/contract/request.test.js +99 -0
- package/test/emission.fixtures.js +16 -0
- package/test/emission.test.js +35 -0
- package/test/entities/entity.fixtures.js +26 -0
- package/test/entities/entity.test.js +64 -0
- package/test/entities/factory.fixtures.js +18 -0
- package/test/entities/factory.test.js +48 -0
- package/test/entities/set.fixtures.js +11 -0
- package/test/entities/set.test.js +12 -0
- package/test/event.fixtures.js +28 -0
- package/test/event.test.js +106 -0
- package/test/locator.test.js +34 -0
- package/test/query.fixtures.js +100 -0
- package/test/query.test.js +86 -0
- package/test/receiver.fixtures.js +22 -0
- package/test/receiver.test.js +66 -0
- package/test/runtime.fixtures.js +19 -0
- package/test/runtime.test.js +40 -0
- package/test/state.fixtures.js +46 -0
- package/test/state.test.js +54 -0
- package/test/transmission.fixtures.js +15 -0
- 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
|
+
})
|