ai-evaluate 0.1.0

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 (42) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/.turbo/turbo-test.log +51 -0
  3. package/README.md +420 -0
  4. package/coverage/base.css +224 -0
  5. package/coverage/block-navigation.js +87 -0
  6. package/coverage/coverage-final.json +4 -0
  7. package/coverage/evaluate.ts.html +574 -0
  8. package/coverage/favicon.png +0 -0
  9. package/coverage/index.html +146 -0
  10. package/coverage/index.ts.html +145 -0
  11. package/coverage/prettify.css +1 -0
  12. package/coverage/prettify.js +2 -0
  13. package/coverage/sort-arrow-sprite.png +0 -0
  14. package/coverage/sorter.js +210 -0
  15. package/coverage/worker-template.ts.html +1948 -0
  16. package/dist/evaluate.d.ts +62 -0
  17. package/dist/evaluate.d.ts.map +1 -0
  18. package/dist/evaluate.js +188 -0
  19. package/dist/evaluate.js.map +1 -0
  20. package/dist/index.d.ts +12 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +11 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/types.d.ts +165 -0
  25. package/dist/types.d.ts.map +1 -0
  26. package/dist/types.js +5 -0
  27. package/dist/types.js.map +1 -0
  28. package/dist/worker-template.d.ts +40 -0
  29. package/dist/worker-template.d.ts.map +1 -0
  30. package/dist/worker-template.js +3628 -0
  31. package/dist/worker-template.js.map +1 -0
  32. package/package.json +46 -0
  33. package/src/evaluate.ts +217 -0
  34. package/src/index.ts +21 -0
  35. package/src/types.ts +174 -0
  36. package/src/worker-template.ts +3677 -0
  37. package/test/evaluate-extended.test.ts +469 -0
  38. package/test/evaluate.test.ts +253 -0
  39. package/test/index.test.ts +95 -0
  40. package/test/worker-template.test.ts +430 -0
  41. package/tsconfig.json +22 -0
  42. package/vitest.config.ts +16 -0
@@ -0,0 +1,469 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { evaluate, createEvaluator } from '../src/index.js'
3
+
4
+ describe('evaluate - extended tests', () => {
5
+ describe('edge cases', () => {
6
+ it('handles empty options', async () => {
7
+ const result = await evaluate({})
8
+ expect(result.success).toBe(true)
9
+ expect(result.logs).toEqual([])
10
+ })
11
+
12
+ it('handles undefined return', async () => {
13
+ const result = await evaluate({
14
+ script: 'const x = 1;'
15
+ })
16
+ expect(result.success).toBe(true)
17
+ expect(result.value).toBeUndefined()
18
+ })
19
+
20
+ it('handles null return', async () => {
21
+ const result = await evaluate({
22
+ script: 'return null;'
23
+ })
24
+ expect(result.success).toBe(true)
25
+ expect(result.value).toBeNull()
26
+ })
27
+
28
+ it('handles complex object return', async () => {
29
+ const result = await evaluate({
30
+ script: 'return { nested: { value: [1, 2, { a: 3 }] } };'
31
+ })
32
+ expect(result.success).toBe(true)
33
+ expect(result.value).toEqual({ nested: { value: [1, 2, { a: 3 }] } })
34
+ })
35
+
36
+ it('handles array return', async () => {
37
+ const result = await evaluate({
38
+ script: 'return [1, "two", true, null];'
39
+ })
40
+ expect(result.success).toBe(true)
41
+ expect(result.value).toEqual([1, 'two', true, null])
42
+ })
43
+ })
44
+
45
+ describe('module errors', () => {
46
+ it('fails on module syntax errors', async () => {
47
+ const result = await evaluate({
48
+ module: 'exports.foo = {;'
49
+ })
50
+ // Syntax errors cause the entire worker to fail to parse
51
+ expect(result.success).toBe(false)
52
+ expect(result.error).toBeDefined()
53
+ })
54
+
55
+ it('captures module runtime errors', async () => {
56
+ const result = await evaluate({
57
+ module: 'throw new Error("module error");'
58
+ })
59
+ expect(result.logs.some(l => l.message.includes('Module error'))).toBe(true)
60
+ })
61
+ })
62
+
63
+ describe('console methods', () => {
64
+ it('captures console.info', async () => {
65
+ const result = await evaluate({
66
+ script: 'console.info("info message"); return true;'
67
+ })
68
+ expect(result.logs).toContainEqual(expect.objectContaining({
69
+ level: 'info',
70
+ message: 'info message'
71
+ }))
72
+ })
73
+
74
+ it('captures console.debug', async () => {
75
+ const result = await evaluate({
76
+ script: 'console.debug("debug message"); return true;'
77
+ })
78
+ expect(result.logs).toContainEqual(expect.objectContaining({
79
+ level: 'debug',
80
+ message: 'debug message'
81
+ }))
82
+ })
83
+
84
+ it('stringifies objects in console output', async () => {
85
+ const result = await evaluate({
86
+ script: 'console.log({ a: 1 }); return true;'
87
+ })
88
+ expect(result.logs[0].message).toBe('{"a":1}')
89
+ })
90
+
91
+ it('joins multiple console arguments', async () => {
92
+ const result = await evaluate({
93
+ script: 'console.log("a", "b", "c"); return true;'
94
+ })
95
+ expect(result.logs[0].message).toBe('a b c')
96
+ })
97
+ })
98
+
99
+ describe('async scripts', () => {
100
+ it('handles Promise return values', async () => {
101
+ const result = await evaluate({
102
+ script: `
103
+ return Promise.resolve(42).then(v => v * 2);
104
+ `
105
+ })
106
+ expect(result.success).toBe(true)
107
+ expect(result.value).toBe(84)
108
+ })
109
+
110
+ it('handles Promise rejection in script', async () => {
111
+ const result = await evaluate({
112
+ script: 'return Promise.reject(new Error("async error"));'
113
+ })
114
+ expect(result.success).toBe(false)
115
+ expect(result.error).toContain('async error')
116
+ })
117
+
118
+ it('handles async IIFE', async () => {
119
+ const result = await evaluate({
120
+ script: `
121
+ return (async () => {
122
+ const value = await Promise.resolve(42);
123
+ return value * 2;
124
+ })();
125
+ `
126
+ })
127
+ expect(result.success).toBe(true)
128
+ expect(result.value).toBe(84)
129
+ })
130
+ })
131
+
132
+ describe('test framework - additional matchers', () => {
133
+ it('toBeTruthy', async () => {
134
+ const result = await evaluate({
135
+ tests: `
136
+ it('truthy values', () => {
137
+ expect(1).toBeTruthy();
138
+ expect("a").toBeTruthy();
139
+ expect({}).toBeTruthy();
140
+ expect([]).toBeTruthy();
141
+ });
142
+ `
143
+ })
144
+ expect(result.success).toBe(true)
145
+ })
146
+
147
+ it('toBeFalsy', async () => {
148
+ const result = await evaluate({
149
+ tests: `
150
+ it('falsy values', () => {
151
+ expect(0).toBeFalsy();
152
+ expect("").toBeFalsy();
153
+ expect(null).toBeFalsy();
154
+ expect(undefined).toBeFalsy();
155
+ });
156
+ `
157
+ })
158
+ expect(result.success).toBe(true)
159
+ })
160
+
161
+ it('toBeNull', async () => {
162
+ const result = await evaluate({
163
+ tests: `
164
+ it('null check', () => {
165
+ expect(null).toBeNull();
166
+ });
167
+ `
168
+ })
169
+ expect(result.success).toBe(true)
170
+ })
171
+
172
+ it('toBeUndefined', async () => {
173
+ const result = await evaluate({
174
+ tests: `
175
+ it('undefined check', () => {
176
+ expect(undefined).toBeUndefined();
177
+ });
178
+ `
179
+ })
180
+ expect(result.success).toBe(true)
181
+ })
182
+
183
+ it('toBeDefined', async () => {
184
+ const result = await evaluate({
185
+ tests: `
186
+ it('defined check', () => {
187
+ expect(0).toBeDefined();
188
+ expect("").toBeDefined();
189
+ expect(null).toBeDefined();
190
+ });
191
+ `
192
+ })
193
+ expect(result.success).toBe(true)
194
+ })
195
+
196
+ it('toBeNaN', async () => {
197
+ const result = await evaluate({
198
+ tests: `
199
+ it('NaN check', () => {
200
+ expect(NaN).toBeNaN();
201
+ });
202
+ `
203
+ })
204
+ expect(result.success).toBe(true)
205
+ })
206
+
207
+ it('toContainEqual', async () => {
208
+ const result = await evaluate({
209
+ tests: `
210
+ it('containEqual check', () => {
211
+ expect([{ a: 1 }, { b: 2 }]).toContainEqual({ a: 1 });
212
+ });
213
+ `
214
+ })
215
+ expect(result.success).toBe(true)
216
+ })
217
+
218
+ it('toStrictEqual', async () => {
219
+ const result = await evaluate({
220
+ tests: `
221
+ it('strict equal check', () => {
222
+ expect({ a: 1, b: 2 }).toStrictEqual({ a: 1, b: 2 });
223
+ });
224
+ `
225
+ })
226
+ expect(result.success).toBe(true)
227
+ })
228
+
229
+ it('toBeGreaterThan', async () => {
230
+ const result = await evaluate({
231
+ tests: `
232
+ it('greater than check', () => {
233
+ expect(10).toBeGreaterThan(5);
234
+ });
235
+ `
236
+ })
237
+ expect(result.success).toBe(true)
238
+ })
239
+
240
+ it('toBeLessThan', async () => {
241
+ const result = await evaluate({
242
+ tests: `
243
+ it('less than check', () => {
244
+ expect(5).toBeLessThan(10);
245
+ });
246
+ `
247
+ })
248
+ expect(result.success).toBe(true)
249
+ })
250
+
251
+ it('toBeGreaterThanOrEqual', async () => {
252
+ const result = await evaluate({
253
+ tests: `
254
+ it('greater or equal check', () => {
255
+ expect(10).toBeGreaterThanOrEqual(10);
256
+ expect(10).toBeGreaterThanOrEqual(5);
257
+ });
258
+ `
259
+ })
260
+ expect(result.success).toBe(true)
261
+ })
262
+
263
+ it('toBeLessThanOrEqual', async () => {
264
+ const result = await evaluate({
265
+ tests: `
266
+ it('less or equal check', () => {
267
+ expect(10).toBeLessThanOrEqual(10);
268
+ expect(5).toBeLessThanOrEqual(10);
269
+ });
270
+ `
271
+ })
272
+ expect(result.success).toBe(true)
273
+ })
274
+
275
+ it('toMatch with string', async () => {
276
+ const result = await evaluate({
277
+ tests: `
278
+ it('match check', () => {
279
+ expect("hello world").toMatch("world");
280
+ expect("hello world").toMatch(/world/);
281
+ });
282
+ `
283
+ })
284
+ expect(result.success).toBe(true)
285
+ })
286
+
287
+ it('toBeInstanceOf', async () => {
288
+ const result = await evaluate({
289
+ tests: `
290
+ it('instanceof check', () => {
291
+ expect(new Error()).toBeInstanceOf(Error);
292
+ expect([]).toBeInstanceOf(Array);
293
+ });
294
+ `
295
+ })
296
+ expect(result.success).toBe(true)
297
+ })
298
+
299
+ it('toBeTypeOf', async () => {
300
+ const result = await evaluate({
301
+ tests: `
302
+ it('typeof check', () => {
303
+ expect("hello").toBeTypeOf("string");
304
+ expect(42).toBeTypeOf("number");
305
+ expect(true).toBeTypeOf("boolean");
306
+ expect({}).toBeTypeOf("object");
307
+ expect(() => {}).toBeTypeOf("function");
308
+ });
309
+ `
310
+ })
311
+ expect(result.success).toBe(true)
312
+ })
313
+ })
314
+
315
+ describe('test framework - hooks', () => {
316
+ it('afterEach', async () => {
317
+ const result = await evaluate({
318
+ tests: `
319
+ let cleanupCount = 0;
320
+ afterEach(() => {
321
+ cleanupCount++;
322
+ });
323
+ it('first', () => {
324
+ expect(cleanupCount).toBe(0);
325
+ });
326
+ it('second', () => {
327
+ expect(cleanupCount).toBe(1);
328
+ });
329
+ `
330
+ })
331
+ expect(result.success).toBe(true)
332
+ expect(result.testResults?.passed).toBe(2)
333
+ })
334
+
335
+ it('nested describes with hooks', async () => {
336
+ const result = await evaluate({
337
+ tests: `
338
+ let outer = 0;
339
+ let inner = 0;
340
+ describe('outer', () => {
341
+ beforeEach(() => { outer++; });
342
+ it('outer test', () => {
343
+ expect(outer).toBe(1);
344
+ expect(inner).toBe(0);
345
+ });
346
+ describe('inner', () => {
347
+ beforeEach(() => { inner++; });
348
+ it('inner test', () => {
349
+ expect(outer).toBe(2);
350
+ expect(inner).toBe(1);
351
+ });
352
+ });
353
+ });
354
+ `
355
+ })
356
+ expect(result.success).toBe(true)
357
+ expect(result.testResults?.passed).toBe(2)
358
+ })
359
+ })
360
+
361
+ describe('test framework - only', () => {
362
+ it('runs only marked tests', async () => {
363
+ const result = await evaluate({
364
+ tests: `
365
+ it('should not run', () => {
366
+ expect(1).toBe(2); // would fail
367
+ });
368
+ it.only('should run', () => {
369
+ expect(1).toBe(1);
370
+ });
371
+ `
372
+ })
373
+ expect(result.success).toBe(true)
374
+ expect(result.testResults?.total).toBe(1)
375
+ })
376
+
377
+ it('test.only works', async () => {
378
+ const result = await evaluate({
379
+ tests: `
380
+ test('should not run', () => {
381
+ expect(1).toBe(2);
382
+ });
383
+ test.only('should run', () => {
384
+ expect(1).toBe(1);
385
+ });
386
+ `
387
+ })
388
+ expect(result.success).toBe(true)
389
+ expect(result.testResults?.total).toBe(1)
390
+ })
391
+ })
392
+
393
+ describe('test framework - resolves/rejects', () => {
394
+ it('resolves matcher', async () => {
395
+ const result = await evaluate({
396
+ tests: `
397
+ it('resolves', async () => {
398
+ await expect(Promise.resolve(42)).resolves.toBe(42);
399
+ });
400
+ `
401
+ })
402
+ expect(result.success).toBe(true)
403
+ })
404
+
405
+ it('rejects matcher', async () => {
406
+ const result = await evaluate({
407
+ tests: `
408
+ it('rejects', async () => {
409
+ await expect(Promise.reject(new Error('fail'))).rejects.toBeInstanceOf(Error);
410
+ });
411
+ `
412
+ })
413
+ expect(result.success).toBe(true)
414
+ })
415
+ })
416
+
417
+ describe('test framework - error messages', () => {
418
+ it('provides descriptive error for toBe failure', async () => {
419
+ const result = await evaluate({
420
+ tests: `
421
+ it('fails', () => {
422
+ expect(1).toBe(2);
423
+ });
424
+ `
425
+ })
426
+ expect(result.success).toBe(false)
427
+ expect(result.testResults?.tests[0].error).toContain('Expected')
428
+ expect(result.testResults?.tests[0].error).toContain('2')
429
+ })
430
+
431
+ it('provides descriptive error for toEqual failure', async () => {
432
+ const result = await evaluate({
433
+ tests: `
434
+ it('fails', () => {
435
+ expect({ a: 1 }).toEqual({ a: 2 });
436
+ });
437
+ `
438
+ })
439
+ expect(result.success).toBe(false)
440
+ expect(result.testResults?.tests[0].error).toBeDefined()
441
+ })
442
+
443
+ it('provides descriptive error for toContain failure', async () => {
444
+ const result = await evaluate({
445
+ tests: `
446
+ it('fails', () => {
447
+ expect([1, 2, 3]).toContain(4);
448
+ });
449
+ `
450
+ })
451
+ expect(result.success).toBe(false)
452
+ expect(result.testResults?.tests[0].error).toContain('contain')
453
+ })
454
+ })
455
+ })
456
+
457
+ describe('createEvaluator', () => {
458
+ it('returns a function', () => {
459
+ const evaluator = createEvaluator({})
460
+ expect(typeof evaluator).toBe('function')
461
+ })
462
+
463
+ it('returned function works like evaluate', async () => {
464
+ const evaluator = createEvaluator({})
465
+ const result = await evaluator({ script: 'return 42;' })
466
+ expect(result.success).toBe(true)
467
+ expect(result.value).toBe(42)
468
+ })
469
+ })
@@ -0,0 +1,253 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest'
2
+ import { evaluate } from '../src/index.js'
3
+
4
+ describe('evaluate', () => {
5
+ describe('script execution', () => {
6
+ it('executes simple expressions', async () => {
7
+ const result = await evaluate({
8
+ script: 'return 1 + 1'
9
+ })
10
+ expect(result.success).toBe(true)
11
+ expect(result.value).toBe(2)
12
+ })
13
+
14
+ it('captures console output', async () => {
15
+ const result = await evaluate({
16
+ script: `
17
+ console.log('hello');
18
+ console.warn('warning');
19
+ console.error('error');
20
+ return 'done';
21
+ `
22
+ })
23
+ expect(result.success).toBe(true)
24
+ expect(result.value).toBe('done')
25
+ expect(result.logs).toHaveLength(3)
26
+ expect(result.logs[0].level).toBe('log')
27
+ expect(result.logs[0].message).toBe('hello')
28
+ expect(result.logs[1].level).toBe('warn')
29
+ expect(result.logs[2].level).toBe('error')
30
+ })
31
+
32
+ it('handles script errors', async () => {
33
+ const result = await evaluate({
34
+ script: 'throw new Error("test error")'
35
+ })
36
+ expect(result.success).toBe(false)
37
+ expect(result.error).toContain('test error')
38
+ })
39
+ })
40
+
41
+ describe('module exports', () => {
42
+ it('exposes exports to script', async () => {
43
+ const result = await evaluate({
44
+ module: `
45
+ exports.add = (a, b) => a + b;
46
+ exports.multiply = (a, b) => a * b;
47
+ `,
48
+ script: 'return add(2, 3) + multiply(4, 5)'
49
+ })
50
+ expect(result.success).toBe(true)
51
+ expect(result.value).toBe(25) // 5 + 20
52
+ })
53
+
54
+ it('exposes exports to tests', async () => {
55
+ const result = await evaluate({
56
+ module: `
57
+ exports.double = (n) => n * 2;
58
+ `,
59
+ tests: `
60
+ describe('double', () => {
61
+ it('doubles a number', () => {
62
+ expect(double(5)).toBe(10);
63
+ });
64
+ });
65
+ `
66
+ })
67
+ expect(result.success).toBe(true)
68
+ expect(result.testResults?.total).toBe(1)
69
+ expect(result.testResults?.passed).toBe(1)
70
+ })
71
+ })
72
+
73
+ describe('test framework', () => {
74
+ it('runs passing tests', async () => {
75
+ const result = await evaluate({
76
+ tests: `
77
+ describe('math', () => {
78
+ it('adds', () => {
79
+ expect(1 + 1).toBe(2);
80
+ });
81
+ it('subtracts', () => {
82
+ expect(5 - 3).toBe(2);
83
+ });
84
+ });
85
+ `
86
+ })
87
+ expect(result.success).toBe(true)
88
+ expect(result.testResults?.total).toBe(2)
89
+ expect(result.testResults?.passed).toBe(2)
90
+ expect(result.testResults?.failed).toBe(0)
91
+ })
92
+
93
+ it('reports failing tests', async () => {
94
+ const result = await evaluate({
95
+ tests: `
96
+ it('fails', () => {
97
+ expect(1).toBe(2);
98
+ });
99
+ `
100
+ })
101
+ expect(result.success).toBe(false)
102
+ expect(result.testResults?.total).toBe(1)
103
+ expect(result.testResults?.failed).toBe(1)
104
+ expect(result.testResults?.tests[0].error).toContain('Expected 2')
105
+ })
106
+
107
+ it('supports skipped tests', async () => {
108
+ const result = await evaluate({
109
+ tests: `
110
+ it.skip('skipped', () => {
111
+ expect(1).toBe(2);
112
+ });
113
+ it('runs', () => {
114
+ expect(1).toBe(1);
115
+ });
116
+ `
117
+ })
118
+ expect(result.success).toBe(true)
119
+ expect(result.testResults?.total).toBe(2)
120
+ expect(result.testResults?.passed).toBe(1)
121
+ expect(result.testResults?.skipped).toBe(1)
122
+ })
123
+
124
+ it('supports beforeEach hooks', async () => {
125
+ const result = await evaluate({
126
+ tests: `
127
+ let count = 0;
128
+ beforeEach(() => {
129
+ count++;
130
+ });
131
+ it('first', () => {
132
+ expect(count).toBe(1);
133
+ });
134
+ it('second', () => {
135
+ expect(count).toBe(2);
136
+ });
137
+ `
138
+ })
139
+ expect(result.success).toBe(true)
140
+ expect(result.testResults?.passed).toBe(2)
141
+ })
142
+
143
+ it('supports async tests', async () => {
144
+ const result = await evaluate({
145
+ tests: `
146
+ it('async test', async () => {
147
+ const value = await Promise.resolve(42);
148
+ expect(value).toBe(42);
149
+ });
150
+ `
151
+ })
152
+ expect(result.success).toBe(true)
153
+ expect(result.testResults?.passed).toBe(1)
154
+ })
155
+ })
156
+
157
+ describe('expect matchers', () => {
158
+ it('toBe', async () => {
159
+ const result = await evaluate({
160
+ tests: `
161
+ it('works', () => {
162
+ expect(1).toBe(1);
163
+ expect('a').toBe('a');
164
+ });
165
+ `
166
+ })
167
+ expect(result.success).toBe(true)
168
+ })
169
+
170
+ it('toEqual', async () => {
171
+ const result = await evaluate({
172
+ tests: `
173
+ it('works', () => {
174
+ expect({ a: 1 }).toEqual({ a: 1 });
175
+ expect([1, 2]).toEqual([1, 2]);
176
+ });
177
+ `
178
+ })
179
+ expect(result.success).toBe(true)
180
+ })
181
+
182
+ it('toContain', async () => {
183
+ const result = await evaluate({
184
+ tests: `
185
+ it('works', () => {
186
+ expect([1, 2, 3]).toContain(2);
187
+ expect('hello').toContain('ell');
188
+ });
189
+ `
190
+ })
191
+ expect(result.success).toBe(true)
192
+ })
193
+
194
+ it('toThrow', async () => {
195
+ const result = await evaluate({
196
+ tests: `
197
+ it('works', () => {
198
+ expect(() => { throw new Error('boom'); }).toThrow('boom');
199
+ expect(() => { throw new Error('boom'); }).toThrow(/boom/);
200
+ });
201
+ `
202
+ })
203
+ expect(result.success).toBe(true)
204
+ })
205
+
206
+ it('toHaveProperty', async () => {
207
+ const result = await evaluate({
208
+ tests: `
209
+ it('works', () => {
210
+ expect({ a: { b: 1 } }).toHaveProperty('a.b');
211
+ expect({ a: { b: 1 } }).toHaveProperty('a.b', 1);
212
+ });
213
+ `
214
+ })
215
+ expect(result.success).toBe(true)
216
+ })
217
+
218
+ it('toMatchObject', async () => {
219
+ const result = await evaluate({
220
+ tests: `
221
+ it('works', () => {
222
+ expect({ a: 1, b: 2 }).toMatchObject({ a: 1 });
223
+ });
224
+ `
225
+ })
226
+ expect(result.success).toBe(true)
227
+ })
228
+
229
+ it('not matchers', async () => {
230
+ const result = await evaluate({
231
+ tests: `
232
+ it('works', () => {
233
+ expect(1).not.toBe(2);
234
+ expect({ a: 1 }).not.toEqual({ a: 2 });
235
+ expect([1, 2]).not.toContain(3);
236
+ });
237
+ `
238
+ })
239
+ expect(result.success).toBe(true)
240
+ })
241
+
242
+ it('toBeCloseTo', async () => {
243
+ const result = await evaluate({
244
+ tests: `
245
+ it('works', () => {
246
+ expect(0.1 + 0.2).toBeCloseTo(0.3);
247
+ });
248
+ `
249
+ })
250
+ expect(result.success).toBe(true)
251
+ })
252
+ })
253
+ })