-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathactors-workflow.test.ts
More file actions
113 lines (87 loc) · 3.17 KB
/
actors-workflow.test.ts
File metadata and controls
113 lines (87 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import { UserState, ChangeUserNameResponse, ChangeUserName } from './protos/user_test'
import * as crypto from 'crypto'
import spawn, { payloadFor, SpawnSystem } from '../src/spawn'
import { createRandomActor, createUserActor } from './stubs/actors'
import { describe, beforeAll, afterAll, test, expect } from 'bun:test'
function timeout(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
describe('testing workflows', () => {
const randomActorName = crypto.randomUUID()
let system: SpawnSystem
beforeAll(async () => {
system = spawn.createSystem('SpawnSysTest')
createUserActor(system)
createRandomActor(system, randomActorName)
const registered = await system.register()
if (registered.status?.message != 'Accepted') throw new Error('Failed to register system')
})
afterAll(async () => {
await system.destroy()
})
test('settting new name and getting it after piped', async () => {
const payload = payloadFor(ChangeUserName, ChangeUserName.create({ newName: 'newNameInput' }))
const action = 'pipeTest'
const newNameResponse = await spawn.invoke('MockUserActor', {
system: 'SpawnSysTest',
action,
payload,
response: ChangeUserNameResponse
})
expect(newNameResponse.newName).toBe('transformed newNameInputInternal')
const userState = await spawn.invoke(`MockUserActor`, {
system: 'SpawnSysTest',
action: 'getState',
response: UserState
})
expect(userState.name).toBe('pipe_initial')
})
test('settting new name and getting it after forwarded', async () => {
const payload = payloadFor(ChangeUserName, ChangeUserName.create({ newName: 'newNameForward' }))
const action = 'forwardTest'
const newNameResponse = await spawn.invoke('MockUserActor', {
system: 'SpawnSysTest',
action,
payload,
response: ChangeUserNameResponse
})
expect(newNameResponse.newName).toBe('transformed newNameForward')
const userState = await spawn.invoke(`MockUserActor`, {
system: 'SpawnSysTest',
action: 'getState',
response: UserState
})
expect(userState.name).toBe('forward_initial')
})
test('calling effects to another actor schedule for 1 second in the future', async () => {
const payload = payloadFor(ChangeUserName, ChangeUserName.create({ newName: 'newNameForward' }))
const action = 'effectsTest'
await spawn.invoke('MockUserActor', {
system: 'SpawnSysTest',
action,
payload,
response: ChangeUserNameResponse
})
await timeout(1_500)
const userState = await spawn.invoke(`MockUserActor`, {
system: 'SpawnSysTest',
action: 'getState',
response: UserState
})
expect(userState.name).toBe('afterEffect')
})
test('calling broadcast and seeing its effect in another actor', async () => {
const action = 'broadcastTest'
await spawn.invoke('MockUserActor', {
system: 'SpawnSysTest',
action
})
await timeout(100)
const userState = await spawn.invoke(randomActorName, {
system: 'SpawnSysTest',
action: 'getState',
response: UserState
})
expect(userState.name).toBe('afterBroadcast')
})
})