-
Notifications
You must be signed in to change notification settings - Fork 0
/
test-utils.js
92 lines (84 loc) · 2.2 KB
/
test-utils.js
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
/**
* Access by named export on `@nti/web-client`:
* ```js
* import * as TestUtils from '@nti/web-client/test-utils';
* ```
*
* @module TestUtils
*/
import { renderHook } from '@testing-library/react-hooks/dom';
import { ServiceDocument as Service } from '@nti/lib-interfaces';
/**
* Apply values to the service.
*
* @param {Object} keyValues An object of key/value pairs to apply to the service document instance.
* @returns {Service} Returns the current instance of the service document.
*/
export const hookService = keyValues =>
Object.assign(global.$AppConfig.nodeService, keyValues);
/**
* Initialize a test environment.
*
* @param {Object} [service={}] A service document object/instance.
* @param {string} [username='Test']
* @param {string} [siteName='Tests']
* @param {Object} [flags]
* @returns {void}
*/
export function setupTestClient(
service = {},
username = 'Test',
siteName = 'Tests',
flags = {}
) {
global.dispatchEvent?.(new CustomEvent('flush-service-document'));
const g = global.$AppConfig || {};
if (service?.mockInstanceData) {
service = new Service(service, {
async getPong() {},
async get(url) {
throw new Error('Mock this request: ' + url);
},
});
}
global.$AppConfig = {
...g,
username: username || g.username,
siteName: siteName || g.siteName,
flags: flags || g.flags,
nodeService: service || {},
nodeInterface: {
getServiceDocument: () =>
Promise.resolve(global.$AppConfig.nodeService),
},
};
}
/**
* This will call a hook that will suspend react on first call so that when a test uses the hook the reader will have already settled.
*
* @param {() => any} hook
* @returns {Promise<void>}
*/
export async function primeMockedReader(hook) {
try {
renderHook(() => hook?.());
} catch (errorOrPromise) {
if (errorOrPromise instanceof Promise) {
return await errorOrPromise;
}
throw errorOrPromise;
}
}
/**
* Destroy the test environment.
*
* @returns {void}
*/
export function tearDownTestClient() {
//un-mock getService()
global.dispatchEvent?.(new CustomEvent('flush-service-document'));
const { $AppConfig } = global;
delete $AppConfig.username;
delete $AppConfig.nodeInterface;
delete $AppConfig.nodeService;
}