@sockethub/server 5.0.0-alpha.3 → 5.0.0-alpha.6

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 (127) hide show
  1. package/README.md +54 -60
  2. package/bin/sockethub +4 -3
  3. package/package.json +42 -60
  4. package/res/socket.io.js +4908 -0
  5. package/res/sockethub-client.js +602 -0
  6. package/res/sockethub-client.min.js +19 -0
  7. package/sockethub.config.example.json +2 -3
  8. package/src/bootstrap/init.d.ts +20 -7
  9. package/src/bootstrap/init.test.ts +211 -0
  10. package/src/bootstrap/init.ts +152 -75
  11. package/src/bootstrap/load-platforms.ts +151 -0
  12. package/src/config.test.ts +27 -22
  13. package/src/config.ts +82 -78
  14. package/src/defaults.json +24 -16
  15. package/src/index.ts +67 -27
  16. package/src/janitor.test.ts +211 -0
  17. package/src/janitor.ts +145 -77
  18. package/src/listener.ts +151 -57
  19. package/src/middleware/create-activity-object.test.ts +28 -8
  20. package/src/middleware/create-activity-object.ts +17 -8
  21. package/src/middleware/expand-activity-stream.test.data.ts +332 -346
  22. package/src/middleware/expand-activity-stream.test.ts +65 -66
  23. package/src/middleware/expand-activity-stream.ts +29 -19
  24. package/src/middleware/store-credentials.test.ts +74 -62
  25. package/src/middleware/store-credentials.ts +15 -15
  26. package/src/middleware/validate.test.data.ts +240 -242
  27. package/src/middleware/validate.test.ts +39 -78
  28. package/src/middleware/validate.ts +63 -39
  29. package/src/middleware.test.ts +168 -138
  30. package/src/middleware.ts +62 -43
  31. package/src/platform-instance.test.ts +507 -213
  32. package/src/platform-instance.ts +337 -219
  33. package/src/platform.test.ts +375 -0
  34. package/src/platform.ts +306 -139
  35. package/src/process-manager.ts +75 -51
  36. package/src/routes.test.ts +43 -89
  37. package/src/routes.ts +40 -77
  38. package/src/sentry.test.ts +106 -0
  39. package/src/sentry.ts +19 -0
  40. package/src/sockethub.ts +186 -153
  41. package/src/util.ts +5 -0
  42. package/coverage/tmp/coverage-93126-1649152190997-0.json +0 -1
  43. package/dist/bootstrap/init.d.ts +0 -18
  44. package/dist/bootstrap/init.js +0 -63
  45. package/dist/bootstrap/init.js.map +0 -1
  46. package/dist/bootstrap/platforms.js +0 -75
  47. package/dist/common.d.ts +0 -3
  48. package/dist/common.js +0 -20
  49. package/dist/common.js.map +0 -1
  50. package/dist/config.d.ts +0 -6
  51. package/dist/config.js +0 -102
  52. package/dist/config.js.map +0 -1
  53. package/dist/crypto.d.ts +0 -10
  54. package/dist/crypto.js +0 -38
  55. package/dist/crypto.js.map +0 -1
  56. package/dist/defaults.json +0 -28
  57. package/dist/index.d.ts +0 -2
  58. package/dist/index.js +0 -25
  59. package/dist/index.js.map +0 -1
  60. package/dist/janitor.d.ts +0 -15
  61. package/dist/janitor.js +0 -89
  62. package/dist/janitor.js.map +0 -1
  63. package/dist/listener.d.ts +0 -28
  64. package/dist/listener.js +0 -91
  65. package/dist/listener.js.map +0 -1
  66. package/dist/middleware/create-activity-object.d.ts +0 -6
  67. package/dist/middleware/create-activity-object.js +0 -19
  68. package/dist/middleware/create-activity-object.js.map +0 -1
  69. package/dist/middleware/expand-activity-stream.d.ts +0 -2
  70. package/dist/middleware/expand-activity-stream.js +0 -33
  71. package/dist/middleware/expand-activity-stream.js.map +0 -1
  72. package/dist/middleware/expand-activity-stream.test.data.d.ts +0 -480
  73. package/dist/middleware/expand-activity-stream.test.data.js +0 -360
  74. package/dist/middleware/expand-activity-stream.test.data.js.map +0 -1
  75. package/dist/middleware/store-credentials.d.ts +0 -3
  76. package/dist/middleware/store-credentials.js +0 -19
  77. package/dist/middleware/store-credentials.js.map +0 -1
  78. package/dist/middleware/validate.d.ts +0 -2
  79. package/dist/middleware/validate.js +0 -58
  80. package/dist/middleware/validate.js.map +0 -1
  81. package/dist/middleware/validate.test.data.d.ts +0 -532
  82. package/dist/middleware/validate.test.data.js +0 -263
  83. package/dist/middleware/validate.test.data.js.map +0 -1
  84. package/dist/middleware.d.ts +0 -10
  85. package/dist/middleware.js +0 -54
  86. package/dist/middleware.js.map +0 -1
  87. package/dist/platform-instance.d.ts +0 -77
  88. package/dist/platform-instance.js +0 -211
  89. package/dist/platform-instance.js.map +0 -1
  90. package/dist/platform.d.ts +0 -6
  91. package/dist/platform.js +0 -187
  92. package/dist/platform.js.map +0 -1
  93. package/dist/process-manager.d.ts +0 -11
  94. package/dist/process-manager.js +0 -78
  95. package/dist/process-manager.js.map +0 -1
  96. package/dist/routes.d.ts +0 -13
  97. package/dist/routes.js +0 -83
  98. package/dist/routes.js.map +0 -1
  99. package/dist/sockethub.d.ts +0 -39
  100. package/dist/sockethub.js +0 -119
  101. package/dist/sockethub.js.map +0 -1
  102. package/dist/store.d.ts +0 -5
  103. package/dist/store.js +0 -17
  104. package/dist/store.js.map +0 -1
  105. package/src/bootstrap/platforms.js +0 -75
  106. package/src/common.test.ts +0 -54
  107. package/src/common.ts +0 -14
  108. package/src/config.d.ts +0 -2
  109. package/src/crypto.d.ts +0 -5
  110. package/src/crypto.test.ts +0 -41
  111. package/src/crypto.ts +0 -41
  112. package/src/janitor.d.ts +0 -8
  113. package/src/middleware/validate.d.ts +0 -1
  114. package/src/middleware.d.ts +0 -21
  115. package/src/sockethub.d.ts +0 -1
  116. package/src/store.test.ts +0 -28
  117. package/src/store.ts +0 -17
  118. package/test/init-suite.js +0 -41
  119. package/test/queue.functional.test.js +0 -0
  120. package/test/sockethub-suite.js +0 -25
  121. package/tsconfig.json +0 -18
  122. package/views/examples/dummy.ejs +0 -93
  123. package/views/examples/feeds.ejs +0 -90
  124. package/views/examples/irc.ejs +0 -239
  125. package/views/examples/shared.js +0 -72
  126. package/views/examples/xmpp.ejs +0 -191
  127. package/views/index.ejs +0 -17
@@ -1,261 +1,259 @@
1
1
  export default [
2
- {
3
- "name": "mismatched types",
4
- "valid": false,
5
- "type": "credentials",
6
- "input":{
7
- "id":"blah",
8
- "type":"send",
9
- "context":"fake",
10
- "actor":{
11
- "id":"dood@irc.freenode.net",
12
- "type":"person",
13
- "name":"dood"
14
- },
15
- "target":{
16
- "id":"irc.freenode.net/service",
17
- "type":"person",
18
- "name":"service"
19
- },
20
- "object":{
21
- "type":"credentials",
22
- "user": 'foo',
23
- "pass": 'bar'
24
- }
2
+ {
3
+ name: "mismatched types",
4
+ valid: false,
5
+ type: "credentials",
6
+ input: {
7
+ id: "blah",
8
+ type: "send",
9
+ context: "fakeplatform",
10
+ actor: {
11
+ id: "dood@irc.freenode.net",
12
+ type: "person",
13
+ name: "dood",
14
+ },
15
+ target: {
16
+ id: "irc.freenode.net/service",
17
+ type: "person",
18
+ name: "service",
19
+ },
20
+ object: {
21
+ type: "credentials",
22
+ user: "foo",
23
+ pass: "bar",
24
+ },
25
+ },
26
+ error: "Error: credential activity streams must have credentials set as type",
25
27
  },
26
- 'error': "Error: credential activity streams must have credentials set as type"
27
- },
28
- {
29
- "name": "basic",
30
- "valid":true,
31
- "type":"credentials",
32
- "input":{
33
- "id":"blah",
34
- "type":"credentials",
35
- "context":"fake",
36
- "actor":{
37
- "id":"dood@irc.freenode.net",
38
- "type":"person",
39
- "name":"dood"
40
- },
41
- "object":{
42
- 'type': 'credentials',
43
- "user": 'foo',
44
- "pass": 'bar'
45
- }
28
+ {
29
+ name: "basic",
30
+ valid: true,
31
+ type: "credentials",
32
+ input: {
33
+ id: "blah",
34
+ type: "credentials",
35
+ context: "fakeplatform",
36
+ actor: {
37
+ id: "dood@irc.freenode.net",
38
+ type: "person",
39
+ name: "dood",
40
+ },
41
+ object: {
42
+ type: "credentials",
43
+ user: "foo",
44
+ pass: "bar",
45
+ },
46
+ },
47
+ output: "same",
46
48
  },
47
- "output":"same"
48
- },
49
- {
50
- "name":"no type specified",
51
- "valid":false,
52
- "type":"credentials",
53
- "input":{
54
- "actor":"hyper_rau@localhost",
55
- "context":"fake",
56
- "object":{
57
- "username":"hyper_rau",
58
- "password":"123",
59
- "server":"localhost",
60
- "port":5222,
61
- "resource":"laptop"
62
- }
49
+ {
50
+ name: "no type specified",
51
+ valid: false,
52
+ type: "credentials",
53
+ input: {
54
+ actor: "hyper_rau@localhost",
55
+ context: "fakeplatform",
56
+ object: {
57
+ username: "hyper_rau",
58
+ password: "123",
59
+ server: "localhost",
60
+ port: 5222,
61
+ resource: "laptop",
62
+ },
63
+ },
64
+ error: "Error: credential activity streams must have credentials set as type",
63
65
  },
64
- "error": "Error: credential activity streams must have credentials set as type"
65
- },
66
- {
67
- "name":"basic person",
68
- "type":"activity-object",
69
- "valid":true,
70
- "input":{
71
- "id":"blah",
72
- "type":"person",
73
- "name":"dood"
66
+ {
67
+ name: "basic person",
68
+ type: "activity-object",
69
+ valid: true,
70
+ input: {
71
+ id: "blah",
72
+ type: "person",
73
+ name: "dood",
74
+ },
75
+ output: "same",
74
76
  },
75
- "output":"same"
76
- },
77
- {
78
- "name":"person with extras",
79
- "valid":true,
80
- "type":"activity-object",
81
- "input":{
82
- "id":"blah",
83
- "type":"person",
84
- "name":"bob",
85
- "hello":"there",
86
- "i":[
87
- "am",
88
- "extras"
89
- ]
77
+ {
78
+ name: "person with extras",
79
+ valid: true,
80
+ type: "activity-object",
81
+ input: {
82
+ id: "blah",
83
+ type: "person",
84
+ name: "bob",
85
+ hello: "there",
86
+ i: ["am", "extras"],
87
+ },
88
+ output: "same",
90
89
  },
91
- "output":"same"
92
- },
93
- {
94
- "name":"alone credentials (as activity-object)",
95
- "valid":false,
96
- "type":"activity-object",
97
- "input":{
98
- "type":"credentials",
99
- "nick":"sh-9K3Vk",
100
- "port":6667,
101
- "secure":false,
102
- "server":"irc.freenode.net"
90
+ {
91
+ name: "alone credentials (as activity-object)",
92
+ valid: false,
93
+ type: "activity-object",
94
+ input: {
95
+ type: "credentials",
96
+ nick: "sh-9K3Vk",
97
+ port: 6667,
98
+ secure: false,
99
+ server: "irc.freenode.net",
100
+ },
101
+ error:
102
+ "Error: /object: must match exactly one schema in oneOf: " +
103
+ "credentials, feed, message, me, person, room, service, website, " +
104
+ "attendance, presence, relationship, topic, address",
103
105
  },
104
- "error":
105
- "Error: /object: must match exactly one schema in oneOf: " +
106
- "credentials, feed, message, me, person, room, service, website, " +
107
- "attendance, presence, relationship, topic, address"
108
- },
109
- {
110
- "name":"alone credentials (as credentials)",
111
- "valid":false,
112
- "type":"credentials",
113
- "input":{
114
- "type":"credentials",
115
- "nick":"sh-9K3Vk",
116
- "port":6667,
117
- "secure":false,
118
- "server":"irc.freenode.net"
106
+ {
107
+ name: "alone credentials (as credentials)",
108
+ valid: false,
109
+ type: "credentials",
110
+ input: {
111
+ type: "credentials",
112
+ nick: "sh-9K3Vk",
113
+ port: 6667,
114
+ secure: false,
115
+ server: "irc.freenode.net",
116
+ },
117
+ error: "Error: platform context undefined not registered with this Sockethub instance.",
119
118
  },
120
- "error": "Error: platform context undefined not registered with this Sockethub instance."
121
- },
122
- {
123
- "name":"new person",
124
- "valid":true,
125
- "type":"activity-object",
126
- "input":{
127
- "id":"sh-9K3Vk@irc.freenode.net",
128
- "type":"person",
129
- "name":"sh-9K3Vk",
130
- "image":{
131
- "height":250,
132
- "mediaType":"image/jpeg",
133
- "url":"http://example.org/image.jpg",
134
- "width":250
135
- },
136
- "url":"http://sockethub.org"
119
+ {
120
+ name: "new person",
121
+ valid: true,
122
+ type: "activity-object",
123
+ input: {
124
+ id: "sh-9K3Vk@irc.freenode.net",
125
+ type: "person",
126
+ name: "sh-9K3Vk",
127
+ image: {
128
+ height: 250,
129
+ mediaType: "image/jpeg",
130
+ url: "https://example.org/image.jpg",
131
+ width: 250,
132
+ },
133
+ url: "https://sockethub.org",
134
+ },
135
+ output: "same",
137
136
  },
138
- "output":"same"
139
- },
140
- {
141
- "name":"new person",
142
- "valid":true,
143
- "type":"activity-object",
144
- "input":{
145
- "id":"irc://sh-9K3Vk@irc.freenode.net",
146
- "type":"person",
147
- "name":"sh-9K3Vk",
148
- "url":"http://sockethub.org"
137
+ {
138
+ name: "new person",
139
+ valid: true,
140
+ type: "activity-object",
141
+ input: {
142
+ id: "irc://sh-9K3Vk@irc.freenode.net",
143
+ type: "person",
144
+ name: "sh-9K3Vk",
145
+ url: "https://sockethub.org",
146
+ },
147
+ output: "same",
149
148
  },
150
- "output":"same"
151
- },
152
- {
153
- "name":"bad parent object",
154
- "valid":false,
155
- "type":"activity-stream",
156
- "input":{
157
- "string":"this is a string",
158
- "array":[
159
- "this",
160
- "is",
161
- {
162
- "an":"array"
163
- }
164
- ],
165
- "as":{
166
- "id":"blah",
167
- "type":"send",
168
- "context":"hello",
169
- "actor":{
170
- "name":"dood"
149
+ {
150
+ name: "bad parent object",
151
+ valid: false,
152
+ type: "activity-stream",
153
+ input: {
154
+ string: "this is a string",
155
+ array: [
156
+ "this",
157
+ "is",
158
+ {
159
+ an: "array",
160
+ },
161
+ ],
162
+ as: {
163
+ id: "blah",
164
+ type: "send",
165
+ context: "hello",
166
+ actor: {
167
+ name: "dood",
168
+ },
169
+ target: {
170
+ type: "person",
171
+ name: "bob",
172
+ },
173
+ object: {
174
+ type: "credentials",
175
+ },
176
+ },
177
+ noId: {
178
+ name: "dood",
179
+ },
180
+ noId2: {
181
+ type: "person",
182
+ name: "bob",
183
+ },
184
+ noDisplayName: {
185
+ id: "larg",
186
+ },
171
187
  },
172
- "target":{
173
- "type":"person",
174
- "name":"bob"
188
+ error: "Error: platform context undefined not registered with this Sockethub instance.",
189
+ },
190
+ {
191
+ name: "unexpected AS",
192
+ valid: false,
193
+ type: "message",
194
+ input: {
195
+ actor: "irc://uuu@localhost",
196
+ type: "join",
197
+ context: "fakeplatform",
198
+ target: "irc://irc.dooder.net/a-room",
175
199
  },
176
- "object":{
177
- "type":"credentials"
178
- }
179
- },
180
- "noId":{
181
- "name":"dood"
182
- },
183
- "noId2":{
184
- "type":"person",
185
- "name":"bob"
186
- },
187
- "noDisplayName":{
188
- "id":"larg"
189
- }
200
+ error: "Error: [fakeplatform] /actor: must be object",
190
201
  },
191
- "error": "Error: platform context undefined not registered with this Sockethub instance."
192
- },
193
- {
194
- "name":"unexpected AS",
195
- "valid":false,
196
- "type":"message",
197
- "input":{
198
- "actor":"irc://uuu@localhost",
199
- "type":"join",
200
- "context":"fake",
201
- "target":"irc://irc.dooder.net/a-room"
202
+ {
203
+ name: "missing type property",
204
+ valid: false,
205
+ type: "message",
206
+ input: {
207
+ actor: { id: "irc://uuu@localhost", type: "person" },
208
+ context: "fakeplatform",
209
+ target: { id: "irc://irc.dooder.net/a-room", type: "room" },
210
+ },
211
+ error: "Error: [fakeplatform] activity stream: must have required property 'type'",
202
212
  },
203
- "error": "Error: /actor: must be object"
204
- },
205
- {
206
- "name":"missing type property",
207
- "valid":false,
208
- "type":"message",
209
- "input":{
210
- "actor": { "id": "irc://uuu@localhost", "type": "person" },
211
- "context":"fake",
212
- "target": { "id": "irc://irc.dooder.net/a-room", "type": "room" }
213
+ {
214
+ name: "invalid context property",
215
+ valid: false,
216
+ type: "message",
217
+ input: {
218
+ actor: { id: "irc://uuu@localhost", type: "person" },
219
+ type: "foo",
220
+ context: "foobar111",
221
+ target: { id: "irc://irc.dooder.net/a-room", type: "room" },
222
+ },
223
+ error: "Error: platform context foobar111 not registered with this Sockethub instance.",
213
224
  },
214
- "error": "Error: activity stream: must have required property \'type\'"
215
- },
216
- {
217
- "name":"invalid context property",
218
- "valid":false,
219
- "type":"message",
220
- "input":{
221
- "actor": { "id": "irc://uuu@localhost", "type": "person" },
222
- "type":"foo",
223
- "context": "foobar",
224
- "target": { "id": "irc://irc.dooder.net/a-room", "type": "room" }
225
+ {
226
+ name: "missing actor property",
227
+ valid: false,
228
+ type: "message",
229
+ input: {
230
+ type: "foo",
231
+ context: "fakeplatform",
232
+ target: { id: "irc://irc.dooder.net/a-room", type: "room" },
233
+ },
234
+ error: "Error: [fakeplatform] activity stream: must have required property 'actor'",
225
235
  },
226
- "error": "Error: platform context foobar not registered with this Sockethub instance."
227
- },
228
- {
229
- "name":"missing actor property",
230
- "valid":false,
231
- "type":"message",
232
- "input":{
233
- "type": "foo",
234
- "context":"fake",
235
- "target": { "id": "irc://irc.dooder.net/a-room", "type": "room" }
236
+ {
237
+ name: "traditional message",
238
+ valid: true,
239
+ type: "message",
240
+ input: {
241
+ type: "echo",
242
+ context: "fakeplatform",
243
+ actor: { id: "irc://uuu@localhost", type: "person" },
244
+ },
236
245
  },
237
- "error": "Error: activity stream: must have required property \'actor\'"
238
- },
239
- {
240
- "name":"traditional message",
241
- "valid":true,
242
- "type":"message",
243
- "input":{
244
- "type": "echo",
245
- "context": "fake",
246
- "actor": { "id": "irc://uuu@localhost", "type": "person" }
247
- }
248
- },
249
- {
250
- "name":"message with wrong type",
251
- "valid":false,
252
- "type":"message",
253
- "input":{
254
- "type": "foorg",
255
- "context": "fake",
256
- "actor": { "id": "irc://uuu@localhost", "type": "person" }
246
+ {
247
+ name: "message with wrong type",
248
+ valid: false,
249
+ type: "message",
250
+ input: {
251
+ type: "foorg",
252
+ context: "fakeplatform",
253
+ actor: { id: "irc://uuu@localhost", type: "person" },
254
+ },
255
+ error:
256
+ "Error: platform type foorg not supported by fakeplatform platform. " +
257
+ "(types: credentials, echo, fail)",
257
258
  },
258
- "error": "Error: platform type foorg not supported by fake platform. " +
259
- "(types: credentials, echo, fail)"
260
- }
261
259
  ];
@@ -1,83 +1,44 @@
1
- import { expect } from 'chai';
2
- import proxyquire from 'proxyquire';
1
+ import { describe, expect, it } from "bun:test";
2
+ import type { ActivityStream } from "@sockethub/schemas";
3
+ import getInitObject from "../bootstrap/init.js";
4
+ import { initMockFakePlatform } from "../bootstrap/init.test.js";
5
+ import validate from "./validate.js";
6
+ import asObjects from "./validate.test.data.js";
3
7
 
4
- proxyquire.noPreserveCache();
5
- proxyquire.noCallThru();
8
+ describe("Middleware: Validate", async () => {
9
+ const loadInitMock = await initMockFakePlatform("fakeplatform");
10
+ const initObj = await getInitObject(loadInitMock);
6
11
 
7
- class FakeSockethubPlatform {
8
- constructor() {}
9
- get config() {
10
- return {};
11
- }
12
- get schema() {
13
- return {
14
- name: 'fake',
15
- version: 'infinity',
16
- credentials: {},
17
- messages: {
18
- "required": ["type"],
19
- "properties": {
20
- "type": {
21
- "enum": ["echo", "fail"]
22
- }
23
- }
24
- }
25
- }
26
- }
27
- }
28
- const modules = {
29
- 'fake-sockethub-platform': FakeSockethubPlatform
30
- }
31
-
32
- // @ts-ignore
33
- import platformLoad from './../bootstrap/platforms';
34
- const platforms = platformLoad(['fake-sockethub-platform'], (module) => {
35
- return modules[module];
36
- });
37
- const validateMod = proxyquire('./validate', {
38
- '../bootstrap/init': {
39
- platforms: platforms
40
- }
41
- });
42
- const validate = validateMod.default;
43
-
44
- import asObjects from "./validate.test.data";
45
-
46
- describe('platformLoad', () => {
47
- it('loads all platforms', () => {
48
- const expectedPlatforms = ['fake'];
49
- expect(platforms.size).to.equal(expectedPlatforms.length);
50
- for (let platform of expectedPlatforms) {
51
- expect(platforms.has(platform)).to.be.true;
52
- }
53
- });
54
- });
55
-
56
- describe('Middleware: Validate', () => {
57
-
58
- describe('AS object validations', () => {
59
- asObjects.forEach((obj) => {
60
- it(`${obj.type}: ${obj.name}, should ${obj.valid ? 'pass' : 'fail'}`, (done) => {
61
- // @ts-ignore
62
- validate(obj.type, 'tests')(obj.input, (msg) => {
63
- if (obj.output) {
64
- if (obj.output === 'same') {
65
- expect(msg).to.eql(obj.input);
66
- } else {
67
- expect(msg).to.eql(obj.output);
68
- }
69
- }
70
- if (obj.valid) {
71
- expect(msg).to.not.be.instanceof(Error);
72
- } else {
73
- expect(msg).to.be.instanceof(Error);
74
- if (obj.error) {
75
- expect(msg.toString()).to.equal(obj.error);
76
- }
77
- }
78
- done();
12
+ describe("AS object validations", () => {
13
+ asObjects.forEach((obj) => {
14
+ it(`${obj.type}: ${obj.name}, should ${
15
+ obj.valid ? "pass" : "fail"
16
+ }`, (done) => {
17
+ validate(
18
+ obj.type,
19
+ "tests",
20
+ initObj,
21
+ )(obj.input as ActivityStream, (msg) => {
22
+ if (obj.output) {
23
+ if (obj.output === "same") {
24
+ // @ts-ignore
25
+ expect(msg).toEqual(obj.input);
26
+ } else {
27
+ // @ts-ignore
28
+ expect(msg).toEqual(obj.output);
29
+ }
30
+ }
31
+ if (obj.valid) {
32
+ expect(msg).not.toBeInstanceOf(Error);
33
+ } else {
34
+ expect(msg).toBeInstanceOf(Error);
35
+ if (obj.error) {
36
+ expect(msg.toString()).toEqual(obj.error);
37
+ }
38
+ }
39
+ done();
40
+ });
41
+ });
79
42
  });
80
- });
81
43
  });
82
- });
83
44
  });