@companion-module/host 0.1.0-0 → 0.1.0-1-nightly-feat-2-0-20260118-143144-3c21960

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 (46) hide show
  1. package/dist/context.d.ts +3 -3
  2. package/dist/context.d.ts.map +1 -1
  3. package/dist/instance.d.ts +2 -1
  4. package/dist/instance.d.ts.map +1 -1
  5. package/dist/instance.js +5 -1
  6. package/dist/instance.js.map +1 -1
  7. package/dist/internal/feedback.d.ts.map +1 -1
  8. package/dist/internal/feedback.js +8 -0
  9. package/dist/internal/feedback.js.map +1 -1
  10. package/package.json +5 -4
  11. package/dist/__tests__/ipc-wrapper.spec.d.ts +0 -2
  12. package/dist/__tests__/ipc-wrapper.spec.d.ts.map +0 -1
  13. package/dist/__tests__/ipc-wrapper.spec.js +0 -272
  14. package/dist/__tests__/ipc-wrapper.spec.js.map +0 -1
  15. package/dist/api.d.ts +0 -360
  16. package/dist/api.d.ts.map +0 -1
  17. package/dist/api.js +0 -8
  18. package/dist/api.js.map +0 -1
  19. package/dist/internal/__tests__/feedback.spec.d.ts +0 -2
  20. package/dist/internal/__tests__/feedback.spec.d.ts.map +0 -1
  21. package/dist/internal/__tests__/feedback.spec.js +0 -686
  22. package/dist/internal/__tests__/feedback.spec.js.map +0 -1
  23. package/dist/internal/__tests__/serializeIsVisibleFn.spec.d.ts +0 -2
  24. package/dist/internal/__tests__/serializeIsVisibleFn.spec.d.ts.map +0 -1
  25. package/dist/internal/__tests__/serializeIsVisibleFn.spec.js +0 -119
  26. package/dist/internal/__tests__/serializeIsVisibleFn.spec.js.map +0 -1
  27. package/dist/internal/__tests__/upgrade.spec.d.ts +0 -2
  28. package/dist/internal/__tests__/upgrade.spec.d.ts.map +0 -1
  29. package/dist/internal/__tests__/upgrade.spec.js +0 -280
  30. package/dist/internal/__tests__/upgrade.spec.js.map +0 -1
  31. package/dist/internal/base.d.ts +0 -4
  32. package/dist/internal/base.d.ts.map +0 -1
  33. package/dist/internal/base.js +0 -31
  34. package/dist/internal/base.js.map +0 -1
  35. package/dist/ipc-wrapper.d.ts +0 -37
  36. package/dist/ipc-wrapper.d.ts.map +0 -1
  37. package/dist/ipc-wrapper.js +0 -123
  38. package/dist/ipc-wrapper.js.map +0 -1
  39. package/dist/plugin.d.ts +0 -25
  40. package/dist/plugin.d.ts.map +0 -1
  41. package/dist/plugin.js +0 -301
  42. package/dist/plugin.js.map +0 -1
  43. package/dist/versions.d.ts +0 -10
  44. package/dist/versions.d.ts.map +0 -1
  45. package/dist/versions.js +0 -2
  46. package/dist/versions.js.map +0 -1
@@ -1,686 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi, beforeAll } from 'vitest';
2
- import { runAllTimers } from '@companion-module/base/src/__mocks__/util.js';
3
- import { FeedbackManager } from '../feedback.js';
4
- const mockDefinitionId = 'definition0';
5
- const mockDefinitionId2 = 'definition1';
6
- const feedbackId = 'abcdef';
7
- const feedback = {
8
- id: feedbackId,
9
- upgradeIndex: null,
10
- disabled: false,
11
- feedbackId: mockDefinitionId,
12
- options: { a: 1, b: 4 },
13
- isInverted: false,
14
- controlId: 'control0',
15
- image: undefined,
16
- };
17
- const feedbackId2 = 'abc123';
18
- const feedback2 = {
19
- id: feedbackId2,
20
- upgradeIndex: null,
21
- disabled: false,
22
- feedbackId: mockDefinitionId2,
23
- options: { a: 1, b: 4 },
24
- isInverted: false,
25
- controlId: 'control1',
26
- image: undefined,
27
- };
28
- const unimplementedAsyncFunction = async () => {
29
- throw new Error('Not implemented');
30
- };
31
- const unimplementedFunction = () => {
32
- throw new Error('Not implemented');
33
- };
34
- describe('FeedbackManager', () => {
35
- beforeEach(() => {
36
- vi.useFakeTimers();
37
- vi.clearAllMocks();
38
- });
39
- it('set definitions', () => {
40
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
41
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, unimplementedFunction);
42
- expect(manager.getDefinitionIds()).toHaveLength(0);
43
- expect(manager.getInstanceIds()).toHaveLength(0);
44
- const mockDefinition = {
45
- type: 'boolean',
46
- name: 'Definition0',
47
- defaultStyle: {},
48
- options: [],
49
- callback: vi.fn(() => false),
50
- };
51
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
52
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
53
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
54
- expect(mockSetFeedbackDefinitions).lastCalledWith([
55
- {
56
- id: mockDefinitionId,
57
- type: 'boolean',
58
- name: 'Definition0',
59
- description: undefined,
60
- hasLearn: false,
61
- defaultStyle: {},
62
- options: [],
63
- },
64
- ]);
65
- // replace existing
66
- const mockDefinitionId2 = 'definition0';
67
- manager.setFeedbackDefinitions({ [mockDefinitionId2]: mockDefinition });
68
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId2]);
69
- expect(manager.getInstanceIds()).toHaveLength(0);
70
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(2);
71
- });
72
- it('execute callback on registration', async () => {
73
- const mockUpdateFeedbackValues = vi.fn((_values) => null);
74
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
75
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, mockUpdateFeedbackValues);
76
- expect(manager.getDefinitionIds()).toHaveLength(0);
77
- expect(manager.getInstanceIds()).toHaveLength(0);
78
- const mockDefinitionId = 'definition0';
79
- const mockDefinition = {
80
- type: 'boolean',
81
- name: 'Definition0',
82
- defaultStyle: {},
83
- options: [],
84
- callback: vi.fn(() => false),
85
- };
86
- // setup definition
87
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
88
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
89
- expect(manager.getInstanceIds()).toHaveLength(0);
90
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
91
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
92
- // report a feedback
93
- manager.handleUpdateFeedbacks({
94
- [feedbackId]: feedback,
95
- });
96
- // not called immediately
97
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
98
- // wait for debounce
99
- await runAllTimers();
100
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
101
- // make sure it looks like expected
102
- expect(mockDefinition.callback).toHaveBeenLastCalledWith({
103
- id: feedbackId,
104
- type: mockDefinition.type,
105
- feedbackId: feedback.feedbackId,
106
- controlId: feedback.controlId,
107
- options: feedback.options,
108
- }, expect.anything());
109
- expect(manager.getInstanceIds()).toEqual([feedbackId]);
110
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(1);
111
- expect(mockUpdateFeedbackValues).toHaveBeenLastCalledWith([
112
- {
113
- id: 'abcdef',
114
- controlId: 'control0',
115
- value: false,
116
- },
117
- ]);
118
- });
119
- it('instance: disabled', async () => {
120
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
121
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, unimplementedFunction);
122
- expect(manager.getDefinitionIds()).toHaveLength(0);
123
- expect(manager.getInstanceIds()).toHaveLength(0);
124
- const mockDefinitionId = 'definition0';
125
- const mockDefinition = {
126
- type: 'boolean',
127
- name: 'Definition0',
128
- defaultStyle: {},
129
- options: [],
130
- callback: vi.fn(() => false),
131
- };
132
- // setup definition
133
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
134
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
135
- expect(manager.getInstanceIds()).toHaveLength(0);
136
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
137
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
138
- // report a feedback
139
- manager.handleUpdateFeedbacks({
140
- [feedbackId]: {
141
- ...feedback,
142
- disabled: true,
143
- },
144
- });
145
- // wait for debounce
146
- await runAllTimers();
147
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
148
- expect(manager.getInstanceIds()).toHaveLength(0);
149
- });
150
- it('instance: delete', async () => {
151
- const mockUpdateFeedbackValues = vi.fn((_values) => null);
152
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
153
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, mockUpdateFeedbackValues);
154
- expect(manager.getDefinitionIds()).toHaveLength(0);
155
- expect(manager.getInstanceIds()).toHaveLength(0);
156
- const mockDefinition = {
157
- type: 'boolean',
158
- name: 'Definition0',
159
- defaultStyle: {},
160
- options: [],
161
- callback: vi.fn(() => false),
162
- };
163
- // setup definition
164
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
165
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
166
- expect(manager.getInstanceIds()).toHaveLength(0);
167
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
168
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
169
- // report a feedback
170
- manager.handleUpdateFeedbacks({
171
- [feedbackId]: feedback,
172
- [feedbackId2]: {
173
- ...feedback2,
174
- feedbackId: mockDefinitionId,
175
- },
176
- });
177
- // wait for debounce
178
- await runAllTimers();
179
- expect(mockDefinition.callback).toHaveBeenCalledTimes(2);
180
- expect(manager.getInstanceIds()).toEqual([feedbackId, feedbackId2]);
181
- // remove a feedback
182
- manager.handleUpdateFeedbacks({
183
- [feedbackId]: undefined,
184
- });
185
- // wait for debounce
186
- await runAllTimers();
187
- expect(mockDefinition.callback).toHaveBeenCalledTimes(2);
188
- expect(manager.getInstanceIds()).toEqual([feedbackId2]);
189
- });
190
- describe('checkFeedbacks', () => {
191
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
192
- const mockUpdateFeedbackValues = vi.fn((_values) => null);
193
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, mockUpdateFeedbackValues);
194
- const mockDefinition = {
195
- type: 'boolean',
196
- name: 'Definition0',
197
- defaultStyle: {},
198
- options: [],
199
- callback: vi.fn(() => false),
200
- };
201
- const mockDefinition2 = {
202
- type: 'advanced',
203
- name: 'Definition2',
204
- options: [],
205
- callback: vi.fn(() => ({})),
206
- };
207
- beforeAll(async () => {
208
- expect(manager.getDefinitionIds()).toHaveLength(0);
209
- expect(manager.getInstanceIds()).toHaveLength(0);
210
- // setup definition
211
- manager.setFeedbackDefinitions({
212
- [mockDefinitionId]: mockDefinition,
213
- [mockDefinitionId2]: mockDefinition2,
214
- });
215
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId, mockDefinitionId2]);
216
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
217
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
218
- // report a feedback
219
- manager.handleUpdateFeedbacks({
220
- [feedbackId]: feedback,
221
- [feedbackId2]: feedback2,
222
- });
223
- await runAllTimers();
224
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
225
- expect(mockDefinition2.callback).toHaveBeenCalledTimes(1);
226
- expect(manager.getInstanceIds()).toEqual([feedbackId, feedbackId2]);
227
- });
228
- beforeEach(() => {
229
- vi.clearAllMocks();
230
- });
231
- it('no types specified', async () => {
232
- // make sure it didnt want to rerun by itself
233
- await runAllTimers();
234
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
235
- expect(mockDefinition2.callback).toHaveBeenCalledTimes(0);
236
- // check all
237
- manager.checkFeedbacks([]);
238
- await runAllTimers();
239
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
240
- expect(mockDefinition2.callback).toHaveBeenCalledTimes(1);
241
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(1);
242
- expect(mockUpdateFeedbackValues).toHaveBeenLastCalledWith([
243
- {
244
- id: 'abcdef',
245
- controlId: 'control0',
246
- value: false,
247
- },
248
- {
249
- id: 'abc123',
250
- controlId: 'control1',
251
- value: {},
252
- },
253
- ]);
254
- });
255
- it('for type', async () => {
256
- // make sure it didnt want to rerun by itself
257
- await runAllTimers();
258
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
259
- expect(mockDefinition2.callback).toHaveBeenCalledTimes(0);
260
- // check all
261
- manager.checkFeedbacks([mockDefinitionId2, 'fake-id']);
262
- await runAllTimers();
263
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
264
- expect(mockDefinition2.callback).toHaveBeenCalledTimes(1);
265
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(1);
266
- expect(mockUpdateFeedbackValues).toHaveBeenLastCalledWith([
267
- {
268
- id: 'abc123',
269
- controlId: 'control1',
270
- value: {},
271
- },
272
- ]);
273
- });
274
- it('for ids', async () => {
275
- // make sure it didnt want to rerun by itself
276
- await runAllTimers();
277
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
278
- expect(mockDefinition2.callback).toHaveBeenCalledTimes(0);
279
- // check all
280
- manager.checkFeedbacksById([feedbackId, 'fake-id']);
281
- await runAllTimers();
282
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
283
- expect(mockDefinition2.callback).toHaveBeenCalledTimes(0);
284
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(1);
285
- expect(mockUpdateFeedbackValues).toHaveBeenLastCalledWith([
286
- {
287
- id: 'abcdef',
288
- controlId: 'control0',
289
- value: false,
290
- },
291
- ]);
292
- });
293
- });
294
- describe('check while being checked', () => {
295
- const mockParseVariables = vi.fn(async (text, _info) => `res - ${text}`);
296
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
297
- const mockUpdateFeedbackValues = vi.fn((_values) => null);
298
- const manager = new FeedbackManager(mockParseVariables, mockSetFeedbackDefinitions, mockUpdateFeedbackValues);
299
- let waitForManualResolve = false;
300
- let nextResolve;
301
- const mockDefinition = {
302
- type: 'boolean',
303
- name: 'Definition0',
304
- defaultStyle: {},
305
- options: [],
306
- callback: vi.fn(async (fb, ctx) => {
307
- await ctx.parseVariablesInString(fb.id);
308
- if (waitForManualResolve) {
309
- expect(nextResolve).toBeUndefined();
310
- await new Promise((resolve) => {
311
- nextResolve = resolve;
312
- });
313
- nextResolve = undefined;
314
- // await new Promise((resolve) => setImmediate(resolve))
315
- }
316
- return false;
317
- }),
318
- };
319
- beforeAll(async () => {
320
- expect(manager.getDefinitionIds()).toHaveLength(0);
321
- expect(manager.getInstanceIds()).toHaveLength(0);
322
- // setup definition
323
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
324
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
325
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
326
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
327
- // report a feedback
328
- manager.handleUpdateFeedbacks({ [feedbackId]: feedback });
329
- await runAllTimers();
330
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
331
- expect(manager.getInstanceIds()).toEqual([feedbackId]);
332
- expect(mockParseVariables).toHaveBeenCalledTimes(1);
333
- });
334
- beforeEach(() => {
335
- vi.clearAllMocks();
336
- waitForManualResolve = false;
337
- });
338
- it('basic run', async () => {
339
- // make sure it didnt want to rerun by itself
340
- await runAllTimers();
341
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
342
- // check all
343
- manager.checkFeedbacks([]);
344
- await runAllTimers();
345
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
346
- // check the value sent to the client
347
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(1);
348
- expect(mockUpdateFeedbackValues).toHaveBeenLastCalledWith([
349
- {
350
- id: 'abcdef',
351
- controlId: 'control0',
352
- value: false,
353
- },
354
- ]);
355
- });
356
- it('freeze feedback callback', async () => {
357
- // make sure it didnt want to rerun by itself
358
- await runAllTimers();
359
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
360
- waitForManualResolve = true;
361
- // check all
362
- manager.checkFeedbacks([]);
363
- // make sure it hasnt completed yet
364
- await runAllTimers();
365
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
366
- expect(nextResolve).toBeTruthy();
367
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(0);
368
- // let it complete now
369
- nextResolve();
370
- await runAllTimers();
371
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
372
- expect(nextResolve).toBeFalsy();
373
- // check the value sent to the client
374
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(1);
375
- expect(mockUpdateFeedbackValues).toHaveBeenLastCalledWith([
376
- {
377
- id: 'abcdef',
378
- controlId: 'control0',
379
- value: false,
380
- },
381
- ]);
382
- });
383
- it('update while frozen', async () => {
384
- // make sure it didnt want to rerun by itself
385
- await runAllTimers();
386
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
387
- waitForManualResolve = true;
388
- // check all
389
- manager.checkFeedbacks([]);
390
- // make sure it hasnt completed yet
391
- await runAllTimers();
392
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
393
- expect(nextResolve).toBeTruthy();
394
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(0);
395
- // trigger it to be checked again
396
- waitForManualResolve = false;
397
- manager.checkFeedbacks([]);
398
- // make sure the second doesnt start by itself
399
- await runAllTimers();
400
- expect(mockDefinition.callback).toHaveBeenCalledTimes(1);
401
- // let it complete now
402
- setImmediate(() => nextResolve());
403
- await runAllTimers();
404
- await runAllTimers();
405
- // make sure it ran twice
406
- expect(mockDefinition.callback).toHaveBeenCalledTimes(2);
407
- expect(nextResolve).toBeFalsy();
408
- // check the value sent to the client
409
- expect(mockUpdateFeedbackValues).toHaveBeenCalledTimes(2);
410
- });
411
- });
412
- it('learn values: no implementation', async () => {
413
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
414
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, unimplementedFunction);
415
- expect(manager.getDefinitionIds()).toHaveLength(0);
416
- const mockDefinitionId = 'definition0';
417
- const mockDefinition = {
418
- type: 'boolean',
419
- name: 'Definition0',
420
- defaultStyle: {},
421
- options: [],
422
- callback: vi.fn(() => false),
423
- };
424
- // setup definition
425
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
426
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
427
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
428
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
429
- // make the call
430
- await expect(manager.handleLearnFeedback(feedback)).resolves.toEqual({ options: undefined });
431
- });
432
- it('learn values: with implementation', async () => {
433
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
434
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, unimplementedFunction);
435
- expect(manager.getDefinitionIds()).toHaveLength(0);
436
- const mockDefinitionId = 'definition0';
437
- const mockDefinition = {
438
- type: 'boolean',
439
- name: 'Definition0',
440
- defaultStyle: {},
441
- options: [],
442
- callback: vi.fn(() => false),
443
- learn: vi.fn(() => ({ abc: 123 })),
444
- };
445
- // setup definition
446
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
447
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
448
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
449
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
450
- // make the call
451
- await expect(manager.handleLearnFeedback(feedback)).resolves.toEqual({ options: { abc: 123 } });
452
- expect(mockDefinition.learn).toBeCalledTimes(1);
453
- expect(mockDefinition.learn).lastCalledWith({
454
- id: feedbackId,
455
- type: mockDefinition.type,
456
- feedbackId: feedback.feedbackId,
457
- controlId: feedback.controlId,
458
- options: feedback.options,
459
- }, expect.anything());
460
- });
461
- it('learn values: with implementation using variables', async () => {
462
- const mockParseVariables = vi.fn(async (_text, _info) => 'res str');
463
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
464
- const manager = new FeedbackManager(mockParseVariables, mockSetFeedbackDefinitions, unimplementedFunction);
465
- expect(manager.getDefinitionIds()).toHaveLength(0);
466
- const mockDefinitionId = 'definition0';
467
- const mockDefinition = {
468
- type: 'boolean',
469
- name: 'Definition0',
470
- defaultStyle: {},
471
- options: [],
472
- callback: vi.fn(() => false),
473
- learn: vi.fn(async (fb, context) => {
474
- const val = await context.parseVariablesInString('test string');
475
- return { abc: val };
476
- }),
477
- };
478
- // setup definition
479
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
480
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
481
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
482
- expect(mockParseVariables).toHaveBeenCalledTimes(0);
483
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
484
- // make the call
485
- await expect(manager.handleLearnFeedback(feedback)).resolves.toEqual({
486
- options: { abc: 'res str' },
487
- });
488
- expect(mockParseVariables).toHaveBeenCalledTimes(1);
489
- expect(mockParseVariables).lastCalledWith('test string', {
490
- controlId: 'control0',
491
- actionInstanceId: undefined,
492
- feedbackInstanceId: 'abcdef',
493
- });
494
- expect(mockDefinition.learn).toBeCalledTimes(1);
495
- expect(mockDefinition.learn).lastCalledWith({
496
- id: feedbackId,
497
- type: mockDefinition.type,
498
- feedbackId: feedback.feedbackId,
499
- controlId: feedback.controlId,
500
- options: feedback.options,
501
- }, expect.anything());
502
- });
503
- describe('subscribe', () => {
504
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
505
- const mockUpdateFeedbackValues = vi.fn((_values) => null);
506
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, mockUpdateFeedbackValues);
507
- const mockDefinition = {
508
- type: 'boolean',
509
- name: 'Definition0',
510
- defaultStyle: {},
511
- options: [],
512
- callback: vi.fn(async (_fb, _ctx) => false),
513
- subscribe: vi.fn(async (_fb, _ctx) => undefined),
514
- };
515
- beforeAll(async () => {
516
- expect(manager.getDefinitionIds()).toHaveLength(0);
517
- expect(manager.getInstanceIds()).toHaveLength(0);
518
- // setup definition
519
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
520
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
521
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
522
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
523
- });
524
- beforeEach(async () => {
525
- manager.handleUpdateFeedbacks({
526
- [feedbackId]: undefined,
527
- [feedbackId2]: undefined,
528
- });
529
- vi.clearAllMocks();
530
- });
531
- it('called when adding', async () => {
532
- // report a feedback
533
- manager.handleUpdateFeedbacks({ [feedbackId]: feedback });
534
- await runAllTimers();
535
- expect(mockDefinition.subscribe).toHaveBeenCalledTimes(1);
536
- expect(mockDefinition.subscribe).toHaveBeenLastCalledWith({
537
- id: feedbackId,
538
- type: mockDefinition.type,
539
- feedbackId: mockDefinitionId,
540
- controlId: feedback.controlId,
541
- options: feedback.options,
542
- }, expect.anything());
543
- expect(manager.getInstanceIds()).toEqual([feedbackId]);
544
- });
545
- it('called when updated', async () => {
546
- // report a feedback
547
- manager.handleUpdateFeedbacks({ [feedbackId]: feedback });
548
- await runAllTimers();
549
- expect(mockDefinition.subscribe).toHaveBeenCalledTimes(1);
550
- // update it
551
- manager.handleUpdateFeedbacks({
552
- [feedbackId]: {
553
- ...feedback,
554
- controlId: 'new-control',
555
- options: { val: 'changed' },
556
- },
557
- });
558
- await runAllTimers();
559
- expect(mockDefinition.subscribe).toHaveBeenCalledTimes(1);
560
- expect(manager.getInstanceIds()).toEqual([feedbackId]);
561
- });
562
- it('not called when removed', async () => {
563
- // report a feedback
564
- manager.handleUpdateFeedbacks({ [feedbackId]: feedback });
565
- await runAllTimers();
566
- expect(mockDefinition.subscribe).toHaveBeenCalledTimes(1);
567
- // update it
568
- manager.handleUpdateFeedbacks({
569
- [feedbackId]: undefined,
570
- });
571
- await runAllTimers();
572
- expect(mockDefinition.subscribe).toHaveBeenCalledTimes(1);
573
- expect(manager.getInstanceIds()).toEqual([]);
574
- });
575
- it('trigger all', async () => {
576
- // report a feedback
577
- manager.handleUpdateFeedbacks({
578
- [feedbackId]: feedback,
579
- [feedbackId2]: {
580
- ...feedback2,
581
- feedbackId: mockDefinitionId,
582
- },
583
- });
584
- await runAllTimers();
585
- expect(mockDefinition.subscribe).toHaveBeenCalledTimes(2);
586
- expect(manager.getInstanceIds()).toEqual([feedbackId, feedbackId2]);
587
- // trigger unsubscribe
588
- manager.subscribeFeedbacks([]);
589
- await runAllTimers();
590
- expect(mockDefinition.subscribe).toHaveBeenCalledTimes(4);
591
- expect(manager.getInstanceIds()).toEqual([feedbackId, feedbackId2]);
592
- });
593
- });
594
- describe('unsubscribe', () => {
595
- const mockSetFeedbackDefinitions = vi.fn((_feedbacks) => null);
596
- const mockUpdateFeedbackValues = vi.fn((_values) => null);
597
- const manager = new FeedbackManager(unimplementedAsyncFunction, mockSetFeedbackDefinitions, mockUpdateFeedbackValues);
598
- const mockDefinition = {
599
- type: 'boolean',
600
- name: 'Definition0',
601
- defaultStyle: {},
602
- options: [],
603
- callback: vi.fn(async (_fb, _ctx) => false),
604
- unsubscribe: vi.fn(async (_fb, _ctx) => undefined),
605
- };
606
- beforeAll(async () => {
607
- expect(manager.getDefinitionIds()).toHaveLength(0);
608
- expect(manager.getInstanceIds()).toHaveLength(0);
609
- // setup definition
610
- manager.setFeedbackDefinitions({ [mockDefinitionId]: mockDefinition });
611
- expect(manager.getDefinitionIds()).toEqual([mockDefinitionId]);
612
- expect(mockSetFeedbackDefinitions).toHaveBeenCalledTimes(1);
613
- expect(mockDefinition.callback).toHaveBeenCalledTimes(0);
614
- });
615
- beforeEach(async () => {
616
- manager.handleUpdateFeedbacks({
617
- [feedbackId]: undefined,
618
- [feedbackId2]: undefined,
619
- });
620
- vi.clearAllMocks();
621
- });
622
- it('not called when adding', async () => {
623
- // report a feedback
624
- manager.handleUpdateFeedbacks({ [feedbackId]: feedback });
625
- await runAllTimers();
626
- expect(mockDefinition.unsubscribe).toHaveBeenCalledTimes(0);
627
- expect(manager.getInstanceIds()).toEqual([feedbackId]);
628
- });
629
- it('not called when updated', async () => {
630
- // report a feedback
631
- manager.handleUpdateFeedbacks({ [feedbackId]: feedback });
632
- await runAllTimers();
633
- expect(mockDefinition.unsubscribe).toHaveBeenCalledTimes(0);
634
- // update it
635
- manager.handleUpdateFeedbacks({
636
- [feedbackId]: {
637
- ...feedback,
638
- controlId: 'new-control',
639
- options: { val: 'changed' },
640
- },
641
- });
642
- await runAllTimers();
643
- expect(mockDefinition.unsubscribe).toHaveBeenCalledTimes(0);
644
- expect(manager.getInstanceIds()).toEqual([feedbackId]);
645
- });
646
- it('called when removed', async () => {
647
- // report a feedback
648
- manager.handleUpdateFeedbacks({ [feedbackId]: feedback });
649
- await runAllTimers();
650
- expect(mockDefinition.unsubscribe).toHaveBeenCalledTimes(0);
651
- // update it
652
- manager.handleUpdateFeedbacks({
653
- [feedbackId]: undefined,
654
- });
655
- await runAllTimers();
656
- expect(mockDefinition.unsubscribe).toHaveBeenCalledTimes(1);
657
- expect(mockDefinition.unsubscribe).toHaveBeenLastCalledWith({
658
- id: feedbackId,
659
- type: mockDefinition.type,
660
- feedbackId: mockDefinitionId,
661
- controlId: feedback.controlId,
662
- options: feedback.options,
663
- }, expect.anything());
664
- expect(manager.getInstanceIds()).toEqual([]);
665
- });
666
- it('trigger all', async () => {
667
- // report a feedback
668
- manager.handleUpdateFeedbacks({
669
- [feedbackId]: feedback,
670
- [feedbackId2]: {
671
- ...feedback2,
672
- feedbackId: mockDefinitionId,
673
- },
674
- });
675
- await runAllTimers();
676
- expect(mockDefinition.unsubscribe).toHaveBeenCalledTimes(0);
677
- expect(manager.getInstanceIds()).toEqual([feedbackId, feedbackId2]);
678
- // trigger unsubscribe
679
- manager.unsubscribeFeedbacks([]);
680
- await runAllTimers();
681
- expect(mockDefinition.unsubscribe).toHaveBeenCalledTimes(2);
682
- expect(manager.getInstanceIds()).toEqual([feedbackId, feedbackId2]);
683
- });
684
- });
685
- });
686
- //# sourceMappingURL=feedback.spec.js.map