mod-arch-core 1.0.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.
- package/README.md +44 -0
- package/dist/__tests__/__mocks__/mockGenericResponse.d.ts +8 -0
- package/dist/__tests__/__mocks__/mockGenericResponse.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/mockGenericResponse.js +6 -0
- package/dist/__tests__/__mocks__/mockGenericResponse.js.map +1 -0
- package/dist/__tests__/__mocks__/styleMock.d.ts +2 -0
- package/dist/__tests__/__mocks__/styleMock.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/styleMock.js +3 -0
- package/dist/__tests__/__mocks__/styleMock.js.map +1 -0
- package/dist/__tests__/unit/jest.setup.d.ts +2 -0
- package/dist/__tests__/unit/jest.setup.d.ts.map +1 -0
- package/dist/__tests__/unit/jest.setup.js +48 -0
- package/dist/__tests__/unit/jest.setup.js.map +1 -0
- package/dist/__tests__/unit/testUtils/hooks.d.ts +80 -0
- package/dist/__tests__/unit/testUtils/hooks.d.ts.map +1 -0
- package/dist/__tests__/unit/testUtils/hooks.js +126 -0
- package/dist/__tests__/unit/testUtils/hooks.js.map +1 -0
- package/dist/__tests__/unit/testUtils/hooks.spec.d.ts +2 -0
- package/dist/__tests__/unit/testUtils/hooks.spec.d.ts.map +1 -0
- package/dist/__tests__/unit/testUtils/hooks.spec.js +192 -0
- package/dist/__tests__/unit/testUtils/hooks.spec.js.map +1 -0
- package/dist/api/__tests__/errorUtils.spec.d.ts +2 -0
- package/dist/api/__tests__/errorUtils.spec.d.ts.map +1 -0
- package/dist/api/__tests__/errorUtils.spec.js +27 -0
- package/dist/api/__tests__/errorUtils.spec.js.map +1 -0
- package/dist/api/apiUtils.d.ts +16 -0
- package/dist/api/apiUtils.d.ts.map +1 -0
- package/dist/api/apiUtils.js +96 -0
- package/dist/api/apiUtils.js.map +1 -0
- package/dist/api/const.d.ts +3 -0
- package/dist/api/const.d.ts.map +1 -0
- package/dist/api/const.js +4 -0
- package/dist/api/const.js.map +1 -0
- package/dist/api/errorUtils.d.ts +2 -0
- package/dist/api/errorUtils.d.ts.map +1 -0
- package/dist/api/errorUtils.js +22 -0
- package/dist/api/errorUtils.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/k8s.d.ts +10 -0
- package/dist/api/k8s.d.ts.map +1 -0
- package/dist/api/k8s.js +16 -0
- package/dist/api/k8s.js.map +1 -0
- package/dist/api/types.d.ts +19 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/useAPIState.d.ts +3 -0
- package/dist/api/useAPIState.d.ts.map +1 -0
- package/dist/api/useAPIState.js +22 -0
- package/dist/api/useAPIState.js.map +1 -0
- package/dist/config/transform.file.d.ts +3 -0
- package/dist/config/transform.file.d.ts.map +1 -0
- package/dist/config/transform.file.js +4 -0
- package/dist/config/transform.file.js.map +1 -0
- package/dist/config/transform.style.d.ts +2 -0
- package/dist/config/transform.style.d.ts.map +1 -0
- package/dist/config/transform.style.js +4 -0
- package/dist/config/transform.style.js.map +1 -0
- package/dist/context/BrowserStorageContext.d.ts +25 -0
- package/dist/context/BrowserStorageContext.d.ts.map +1 -0
- package/dist/context/BrowserStorageContext.js +97 -0
- package/dist/context/BrowserStorageContext.js.map +1 -0
- package/dist/context/ModularArchContext.d.ts +20 -0
- package/dist/context/ModularArchContext.d.ts.map +1 -0
- package/dist/context/ModularArchContext.js +67 -0
- package/dist/context/ModularArchContext.js.map +1 -0
- package/dist/context/NotificationContext.d.ts +15 -0
- package/dist/context/NotificationContext.d.ts.map +1 -0
- package/dist/context/NotificationContext.js +43 -0
- package/dist/context/NotificationContext.js.map +1 -0
- package/dist/context/__tests__/ModularArchContext.test.d.ts +2 -0
- package/dist/context/__tests__/ModularArchContext.test.d.ts.map +1 -0
- package/dist/context/__tests__/ModularArchContext.test.js +331 -0
- package/dist/context/__tests__/ModularArchContext.test.js.map +1 -0
- package/dist/context/index.d.ts +4 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +4 -0
- package/dist/context/index.js.map +1 -0
- package/dist/hooks/__tests__/useModularArchContext.test.d.ts +2 -0
- package/dist/hooks/__tests__/useModularArchContext.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/useModularArchContext.test.js +39 -0
- package/dist/hooks/__tests__/useModularArchContext.test.js.map +1 -0
- package/dist/hooks/__tests__/useNamespaces.test.d.ts +2 -0
- package/dist/hooks/__tests__/useNamespaces.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/useNamespaces.test.js +62 -0
- package/dist/hooks/__tests__/useNamespaces.test.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useModularArchContext.d.ts +5 -0
- package/dist/hooks/useModularArchContext.d.ts.map +1 -0
- package/dist/hooks/useModularArchContext.js +11 -0
- package/dist/hooks/useModularArchContext.js.map +1 -0
- package/dist/hooks/useNamespaceSelector.d.ts +10 -0
- package/dist/hooks/useNamespaceSelector.d.ts.map +1 -0
- package/dist/hooks/useNamespaceSelector.js +13 -0
- package/dist/hooks/useNamespaceSelector.js.map +1 -0
- package/dist/hooks/useNamespaces.d.ts +6 -0
- package/dist/hooks/useNamespaces.d.ts.map +1 -0
- package/dist/hooks/useNamespaces.js +34 -0
- package/dist/hooks/useNamespaces.js.map +1 -0
- package/dist/hooks/useNotification.d.ts +18 -0
- package/dist/hooks/useNotification.d.ts.map +1 -0
- package/dist/hooks/useNotification.js +74 -0
- package/dist/hooks/useNotification.js.map +1 -0
- package/dist/hooks/useQueryParamNamespaces.d.ts +2 -0
- package/dist/hooks/useQueryParamNamespaces.d.ts.map +1 -0
- package/dist/hooks/useQueryParamNamespaces.js +9 -0
- package/dist/hooks/useQueryParamNamespaces.js.map +1 -0
- package/dist/hooks/useSettings.d.ts +9 -0
- package/dist/hooks/useSettings.d.ts.map +1 -0
- package/dist/hooks/useSettings.js +72 -0
- package/dist/hooks/useSettings.js.map +1 -0
- package/dist/hooks/useTimeBasedRefresh.d.ts +4 -0
- package/dist/hooks/useTimeBasedRefresh.d.ts.map +1 -0
- package/dist/hooks/useTimeBasedRefresh.js +32 -0
- package/dist/hooks/useTimeBasedRefresh.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/jest.config.d.ts +21 -0
- package/dist/jest.config.d.ts.map +1 -0
- package/dist/jest.config.js +41 -0
- package/dist/jest.config.js.map +1 -0
- package/dist/types/common.d.ts +68 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +14 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/typeHelpers.d.ts +147 -0
- package/dist/types/typeHelpers.d.ts.map +1 -0
- package/dist/types/typeHelpers.js +2 -0
- package/dist/types/typeHelpers.js.map +1 -0
- package/dist/utilities/appUtils.d.ts +2 -0
- package/dist/utilities/appUtils.d.ts.map +1 -0
- package/dist/utilities/appUtils.js +4 -0
- package/dist/utilities/appUtils.js.map +1 -0
- package/dist/utilities/const.d.ts +8 -0
- package/dist/utilities/const.d.ts.map +1 -0
- package/dist/utilities/const.js +9 -0
- package/dist/utilities/const.js.map +1 -0
- package/dist/utilities/index.d.ts +9 -0
- package/dist/utilities/index.d.ts.map +1 -0
- package/dist/utilities/index.js +10 -0
- package/dist/utilities/index.js.map +1 -0
- package/dist/utilities/useDeepCompareMemoize.d.ts +2 -0
- package/dist/utilities/useDeepCompareMemoize.d.ts.map +1 -0
- package/dist/utilities/useDeepCompareMemoize.js +10 -0
- package/dist/utilities/useDeepCompareMemoize.js.map +1 -0
- package/dist/utilities/useEventListener.d.ts +2 -0
- package/dist/utilities/useEventListener.d.ts.map +1 -0
- package/dist/utilities/useEventListener.js +10 -0
- package/dist/utilities/useEventListener.js.map +1 -0
- package/dist/utilities/useFetchState.d.ts +92 -0
- package/dist/utilities/useFetchState.d.ts.map +1 -0
- package/dist/utilities/useFetchState.js +153 -0
- package/dist/utilities/useFetchState.js.map +1 -0
- package/dist/utilities/useGenericObjectState.d.ts +9 -0
- package/dist/utilities/useGenericObjectState.d.ts.map +1 -0
- package/dist/utilities/useGenericObjectState.js +14 -0
- package/dist/utilities/useGenericObjectState.js.map +1 -0
- package/dist/utilities/useMakeFetchObject.d.ts +4 -0
- package/dist/utilities/useMakeFetchObject.d.ts.map +1 -0
- package/dist/utilities/useMakeFetchObject.js +6 -0
- package/dist/utilities/useMakeFetchObject.js.map +1 -0
- package/dist/utilities/utils.d.ts +26 -0
- package/dist/utilities/utils.d.ts.map +1 -0
- package/dist/utilities/utils.js +104 -0
- package/dist/utilities/utils.js.map +1 -0
- package/package.json +92 -0
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# mod-arch-core
|
|
2
|
+
|
|
3
|
+
Core functionality and API utilities for modular architecture micro-frontend projects.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install mod-arch-core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Peer Dependencies
|
|
12
|
+
|
|
13
|
+
- `react` (>=16.8.0)
|
|
14
|
+
- `react-dom` (>=16.8.0)
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import {
|
|
20
|
+
ModularArchContextProvider,
|
|
21
|
+
BrowserStorageContextProvider,
|
|
22
|
+
NotificationContextProvider,
|
|
23
|
+
useModularArchContext,
|
|
24
|
+
useNamespaces,
|
|
25
|
+
DeploymentMode,
|
|
26
|
+
type ModularArchConfig
|
|
27
|
+
} from 'mod-arch-core';
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## What's Included
|
|
31
|
+
|
|
32
|
+
- **API utilities**: HTTP clients, error handling, and API state management
|
|
33
|
+
- **Context providers**: Core context providers for configuration, notifications, and browser storage
|
|
34
|
+
- **Hooks**: React hooks for namespaces, settings, and API state management
|
|
35
|
+
- **Utilities**: Common utility functions, fetch state management, and Kubeflow integration helpers
|
|
36
|
+
- **Types**: Core TypeScript type definitions
|
|
37
|
+
|
|
38
|
+
## Documentation
|
|
39
|
+
|
|
40
|
+
For detailed documentation, visit the [main repository](https://github.com/opendatahub-io/mod-arch-library).
|
|
41
|
+
|
|
42
|
+
## License
|
|
43
|
+
|
|
44
|
+
Apache-2.0
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type MockGenericResponse = {
|
|
2
|
+
id?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const mockGenericResponse: ({ name, description, id, }: MockGenericResponse) => MockGenericResponse;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=mockGenericResponse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockGenericResponse.d.ts","sourceRoot":"","sources":["../../../__tests__/__mocks__/mockGenericResponse.ts"],"names":[],"mappings":"AAAA,KAAK,mBAAmB,GAAG;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,4BAIjC,mBAAmB,KAAG,mBAIvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockGenericResponse.js","sourceRoot":"","sources":["../../../__tests__/__mocks__/mockGenericResponse.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,IAAI,GAAG,MAAM,EACb,WAAW,GAAG,MAAM,EACpB,EAAE,GAAG,GAAG,GACY,EAAuB,EAAE,CAAC,CAAC;IAC/C,IAAI;IACJ,WAAW;IACX,EAAE;CACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleMock.d.ts","sourceRoot":"","sources":["../../../__tests__/__mocks__/styleMock.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleMock.js","sourceRoot":"","sources":["../../../__tests__/__mocks__/styleMock.js"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jest.setup.d.ts","sourceRoot":"","sources":["../../../__tests__/unit/jest.setup.ts"],"names":[],"mappings":"AACA,OAAO,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import 'core-js/actual/array/to-sorted';
|
|
2
|
+
import { createComparativeValue, } from '../../__tests__/unit/testUtils/hooks';
|
|
3
|
+
// TextEncoder is already available globally in Jest with jsdom environment
|
|
4
|
+
// No need to manually assign it
|
|
5
|
+
const tryExpect = (expectFn) => {
|
|
6
|
+
try {
|
|
7
|
+
expectFn();
|
|
8
|
+
}
|
|
9
|
+
catch (e) {
|
|
10
|
+
const { matcherResult } = e;
|
|
11
|
+
if (matcherResult) {
|
|
12
|
+
return { ...matcherResult, message: () => matcherResult.message };
|
|
13
|
+
}
|
|
14
|
+
throw e;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
pass: true,
|
|
18
|
+
message: () => '',
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
expect.extend({
|
|
22
|
+
// custom asymmetric matchers
|
|
23
|
+
/**
|
|
24
|
+
* Checks that a value is what you expect.
|
|
25
|
+
* It uses Object.is to check strict equality.
|
|
26
|
+
*
|
|
27
|
+
* Usage:
|
|
28
|
+
* expect.isIdentifyEqual(...)
|
|
29
|
+
*/
|
|
30
|
+
isIdentityEqual: (actual, expected) => ({
|
|
31
|
+
pass: Object.is(actual, expected),
|
|
32
|
+
message: () => `expected ${actual} to be identity equal to ${expected}`,
|
|
33
|
+
}),
|
|
34
|
+
// hook related custom matchers
|
|
35
|
+
hookToBe: (actual, expected) => tryExpect(() => expect(actual.result.current).toBe(expected)),
|
|
36
|
+
hookToStrictEqual: (actual, expected) => tryExpect(() => expect(actual.result.current).toStrictEqual(expected)),
|
|
37
|
+
hookToHaveUpdateCount: (actual, expected) => tryExpect(() => expect(actual.getUpdateCount()).toBe(expected)),
|
|
38
|
+
hookToBeStable: (actual, expected) => {
|
|
39
|
+
if (actual.getUpdateCount() <= 1) {
|
|
40
|
+
throw new Error('Cannot assert stability as the hook has not run at least 2 times.');
|
|
41
|
+
}
|
|
42
|
+
if (typeof expected === 'undefined') {
|
|
43
|
+
return tryExpect(() => expect(actual.result.current).toBe(actual.getPreviousResult()));
|
|
44
|
+
}
|
|
45
|
+
return tryExpect(() => expect(actual.result.current).toStrictEqual(createComparativeValue(actual.getPreviousResult(), expected)));
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=jest.setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jest.setup.js","sourceRoot":"","sources":["../../../__tests__/unit/jest.setup.ts"],"names":[],"mappings":"AACA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAGL,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAE1C,2EAA2E;AAC3E,gCAAgC;AAEhC,MAAM,SAAS,GAAG,CAAC,QAAoB,EAAE,EAAE;IACzC,IAAI,CAAC;QACH,QAAQ,EAAE,CAAC;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,EAAE,aAAa,EAAE,GAAG,CAAuB,CAAC;QAClD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,EAAE,GAAG,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IACD,OAAO;QACL,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;KAClB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,CAAC;IACZ,6BAA6B;IAE7B;;;;;;OAMG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QACjC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,MAAM,4BAA4B,QAAQ,EAAE;KACxE,CAAC;IAEF,+BAA+B;IAC/B,QAAQ,EAAE,CAAC,MAA6C,EAAE,QAAQ,EAAE,EAAE,CACpE,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE/D,iBAAiB,EAAE,CAAC,MAA6C,EAAE,QAAQ,EAAE,EAAE,CAC7E,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExE,qBAAqB,EAAE,CAAC,MAA6C,EAAE,QAAgB,EAAE,EAAE,CACzF,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEjE,cAAc,EAAE,CAAI,MAAuC,EAAE,QAA2B,EAAE,EAAE;QAC1F,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,SAAS,CAAC,GAAG,EAAE,CACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CACzC,sBAAsB,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,CAAC,CAC7D,CACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { RenderHookOptions, RenderHookResult, waitForOptions } from '@testing-library/react';
|
|
2
|
+
import { queries, Queries } from '@testing-library/dom';
|
|
3
|
+
export type BooleanValues<T> = T extends boolean | number | null | undefined | Function ? boolean | undefined : boolean | undefined | {
|
|
4
|
+
[K in keyof T]?: BooleanValues<T[K]>;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Extension of RTL RenderHookResult providing functions used query the current state of the result.
|
|
8
|
+
*/
|
|
9
|
+
export type RenderHookResultExt<Result, Props> = RenderHookResult<Result, Props> & {
|
|
10
|
+
/**
|
|
11
|
+
* Returns the previous result.
|
|
12
|
+
*/
|
|
13
|
+
getPreviousResult: () => Result;
|
|
14
|
+
/**
|
|
15
|
+
* Get the update count for how many times the hook has been rendered.
|
|
16
|
+
* An update occurs initially on render, subsequently when re-rendered, and also whenever the hook itself triggers a re-render.
|
|
17
|
+
* eg. An `useEffect` triggering a state update.
|
|
18
|
+
*/
|
|
19
|
+
getUpdateCount: () => number;
|
|
20
|
+
/**
|
|
21
|
+
* Returns a Promise that resolves the next time the hook renders, commonly when state is updated as the result of an asynchronous update.
|
|
22
|
+
*
|
|
23
|
+
* Since `waitForNextUpdate` works using interval checks (backed by `waitFor`), it's possible that multiple updates may occur while waiting.
|
|
24
|
+
*/
|
|
25
|
+
waitForNextUpdate: (options?: Pick<waitForOptions, 'interval' | 'timeout'>) => Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Wrapper on top of RTL `renderHook` returning a result that implements the `RenderHookResultExt` interface.
|
|
29
|
+
*
|
|
30
|
+
* `renderHook` provides full control over the rendering of your hook including the ability to wrap the test component.
|
|
31
|
+
* This is usually used to add context providers from `React.createContext` for the hook to access with `useContext`.
|
|
32
|
+
* `initialProps` and props subsequently set by `rerender` will be provided to the wrapper.
|
|
33
|
+
*
|
|
34
|
+
* ```
|
|
35
|
+
* const renderResult = renderHook(({ who }: { who: string }) => useSayHello(who), { initialProps: { who: 'world' }});
|
|
36
|
+
* expect(renderResult).hookToBe('Hello world!');
|
|
37
|
+
* renderResult.rerender({ who: 'there' });
|
|
38
|
+
* expect(renderResult).hookToBe('Hello there!');
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare const renderHook: <Result, Props, Q extends Queries = typeof queries, Container extends Element | DocumentFragment = HTMLElement, BaseElement extends Element | DocumentFragment = Container>(render: (initialProps: Props) => Result, options?: RenderHookOptions<Props, Q, Container, BaseElement>) => RenderHookResultExt<Result, Props>;
|
|
42
|
+
/**
|
|
43
|
+
* Lightweight API for testing a single hook.
|
|
44
|
+
*
|
|
45
|
+
* Prefer this method of testing over `renderHook` for simplicity.
|
|
46
|
+
*
|
|
47
|
+
* ```
|
|
48
|
+
* const renderResult = testHook(useSayHello)('world');
|
|
49
|
+
* expectHook(renderResult).toBe('Hello world!');
|
|
50
|
+
* renderResult.rerender('there');
|
|
51
|
+
* expectHook(renderResult).toBe('Hello there!');
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare const testHook: <Result, P extends unknown[]>(hook: (...params: P) => Result) => (...initialParams: P) => Omit<RenderHookResultExt<Result, {
|
|
55
|
+
$params: typeof initialParams;
|
|
56
|
+
}>, "rerender"> & {
|
|
57
|
+
rerender: (...params: typeof initialParams) => void;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* A helper function for asserting the return value of hooks based on `useFetchState`.
|
|
61
|
+
*
|
|
62
|
+
* eg.
|
|
63
|
+
* ```
|
|
64
|
+
* expectHook(renderResult).isStrictEqual(standardUseFetchState('test value', true))
|
|
65
|
+
* ```
|
|
66
|
+
* is equivalent to:
|
|
67
|
+
* ```
|
|
68
|
+
* expectHook(renderResult).isStrictEqual(['test value', true, undefined, expect.any(Function)])
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare const standardUseFetchState: <D>(data: D, loaded?: boolean, error?: Error) => [data: D, loaded: boolean, loadError: Error | undefined, refresh: () => Promise<D | undefined>];
|
|
72
|
+
/**
|
|
73
|
+
* Extracts a subset of values from the source that can be used to compare equality.
|
|
74
|
+
*
|
|
75
|
+
* Recursively traverses the `booleanTarget`. For every property or array index equal to `true`,
|
|
76
|
+
* adds the value of the source to the result wrapped in custom matcher `expect.isIdentityEqual`.
|
|
77
|
+
* If the entry is `false` or `undefined`, add an everything matcher to the result.
|
|
78
|
+
*/
|
|
79
|
+
export declare const createComparativeValue: <T>(source: T, booleanTarget: BooleanValues<T>) => unknown;
|
|
80
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../../__tests__/unit/testUtils/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,gBAAgB,EAEhB,cAAc,EACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GACnF,OAAO,GAAG,SAAS,GACnB,OAAO,GAAG,SAAS,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAEnE;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,IAAI,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG;IACjF;;OAEG;IACH,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAEhC;;;;OAIG;IACH,cAAc,EAAE,MAAM,MAAM,CAAC;IAE7B;;;;OAIG;IACH,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9F,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,EACN,KAAK,EACL,CAAC,SAAS,OAAO,GAAG,OAAO,OAAO,EAClC,SAAS,SAAS,OAAO,GAAG,gBAAgB,GAAG,WAAW,EAC1D,WAAW,SAAS,OAAO,GAAG,gBAAgB,GAAG,SAAS,EAE1D,QAAQ,CAAC,YAAY,EAAE,KAAK,KAAK,MAAM,EACvC,UAAU,iBAAiB,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,KAC5D,mBAAmB,CAAC,MAAM,EAAE,KAAK,CA8BnC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,QAAQ,GAClB,MAAM,EAAE,CAAC,SAAS,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,MAAM,MAG1D,GAAG,eAAe,CAAC,KAClB,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,aAAa,CAAA;CAAE,CAAC,EAAE,UAAU,CAAC,GAAG;IACpF,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,aAAa,KAAK,IAAI,CAAC;CAerD,CAAC;AAEJ;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,GAAI,CAAC,EACrC,MAAM,CAAC,EACP,gBAAc,EACd,QAAQ,KAAK,KACZ,CACD,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,KAAK,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CACS,CAAC;AASjD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,eAAe,aAAa,CAAC,CAAC,CAAC,KAAG,OAC/B,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { renderHook as renderHookRTL, waitFor, } from '@testing-library/react';
|
|
2
|
+
/**
|
|
3
|
+
* Wrapper on top of RTL `renderHook` returning a result that implements the `RenderHookResultExt` interface.
|
|
4
|
+
*
|
|
5
|
+
* `renderHook` provides full control over the rendering of your hook including the ability to wrap the test component.
|
|
6
|
+
* This is usually used to add context providers from `React.createContext` for the hook to access with `useContext`.
|
|
7
|
+
* `initialProps` and props subsequently set by `rerender` will be provided to the wrapper.
|
|
8
|
+
*
|
|
9
|
+
* ```
|
|
10
|
+
* const renderResult = renderHook(({ who }: { who: string }) => useSayHello(who), { initialProps: { who: 'world' }});
|
|
11
|
+
* expect(renderResult).hookToBe('Hello world!');
|
|
12
|
+
* renderResult.rerender({ who: 'there' });
|
|
13
|
+
* expect(renderResult).hookToBe('Hello there!');
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export const renderHook = (render, options) => {
|
|
17
|
+
let updateCount = 0;
|
|
18
|
+
let prevResult;
|
|
19
|
+
let currentResult;
|
|
20
|
+
const renderResult = renderHookRTL((props) => {
|
|
21
|
+
updateCount++;
|
|
22
|
+
prevResult = currentResult;
|
|
23
|
+
currentResult = render(props);
|
|
24
|
+
return currentResult;
|
|
25
|
+
}, options);
|
|
26
|
+
const renderResultExt = {
|
|
27
|
+
...renderResult,
|
|
28
|
+
getPreviousResult: () => (updateCount > 1 ? prevResult : renderResult.result.current),
|
|
29
|
+
getUpdateCount: () => updateCount,
|
|
30
|
+
waitForNextUpdate: async (currentOptions) => {
|
|
31
|
+
const expected = updateCount;
|
|
32
|
+
try {
|
|
33
|
+
await waitFor(() => expect(updateCount).toBeGreaterThan(expected), currentOptions);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new Error('waitForNextUpdate timed out');
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
return renderResultExt;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Lightweight API for testing a single hook.
|
|
44
|
+
*
|
|
45
|
+
* Prefer this method of testing over `renderHook` for simplicity.
|
|
46
|
+
*
|
|
47
|
+
* ```
|
|
48
|
+
* const renderResult = testHook(useSayHello)('world');
|
|
49
|
+
* expectHook(renderResult).toBe('Hello world!');
|
|
50
|
+
* renderResult.rerender('there');
|
|
51
|
+
* expectHook(renderResult).toBe('Hello there!');
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export const testHook = (hook) =>
|
|
55
|
+
// not ideal to nest functions in terms of API but cannot find a better way to infer P from hook and not initialParams
|
|
56
|
+
(...initialParams) => {
|
|
57
|
+
const renderResult = renderHook(({ $params }) => hook(...$params), {
|
|
58
|
+
initialProps: {
|
|
59
|
+
$params: initialParams,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
...renderResult,
|
|
64
|
+
rerender: (...params) => renderResult.rerender({ $params: params }),
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* A helper function for asserting the return value of hooks based on `useFetchState`.
|
|
69
|
+
*
|
|
70
|
+
* eg.
|
|
71
|
+
* ```
|
|
72
|
+
* expectHook(renderResult).isStrictEqual(standardUseFetchState('test value', true))
|
|
73
|
+
* ```
|
|
74
|
+
* is equivalent to:
|
|
75
|
+
* ```
|
|
76
|
+
* expectHook(renderResult).isStrictEqual(['test value', true, undefined, expect.any(Function)])
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export const standardUseFetchState = (data, loaded = false, error) => [data, loaded, error, expect.any(Function)];
|
|
80
|
+
// create a new asymmetric matcher that matches everything
|
|
81
|
+
const everything = () => {
|
|
82
|
+
const r = expect.anything();
|
|
83
|
+
r.asymmetricMatch = () => true;
|
|
84
|
+
return r;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Extracts a subset of values from the source that can be used to compare equality.
|
|
88
|
+
*
|
|
89
|
+
* Recursively traverses the `booleanTarget`. For every property or array index equal to `true`,
|
|
90
|
+
* adds the value of the source to the result wrapped in custom matcher `expect.isIdentityEqual`.
|
|
91
|
+
* If the entry is `false` or `undefined`, add an everything matcher to the result.
|
|
92
|
+
*/
|
|
93
|
+
export const createComparativeValue = (source, booleanTarget) => createComparativeValueRecursive(source, booleanTarget);
|
|
94
|
+
const createComparativeValueRecursive = (source,
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
96
|
+
booleanTarget) => {
|
|
97
|
+
if (typeof booleanTarget === 'boolean') {
|
|
98
|
+
return booleanTarget ? expect.isIdentityEqual(source) : everything();
|
|
99
|
+
}
|
|
100
|
+
if (Array.isArray(booleanTarget)) {
|
|
101
|
+
if (Array.isArray(source)) {
|
|
102
|
+
const r = new Array(source.length).fill(everything());
|
|
103
|
+
booleanTarget.forEach((b, i) => {
|
|
104
|
+
if (b != null) {
|
|
105
|
+
r[i] = createComparativeValueRecursive(source[i], b);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
return r;
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
if (source == null ||
|
|
113
|
+
typeof source === 'string' ||
|
|
114
|
+
typeof source === 'number' ||
|
|
115
|
+
typeof source === 'function') {
|
|
116
|
+
return source;
|
|
117
|
+
}
|
|
118
|
+
const obj = {};
|
|
119
|
+
const btObj = booleanTarget;
|
|
120
|
+
Object.keys(btObj).forEach((key) => {
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
122
|
+
obj[key] = createComparativeValueRecursive(source[key], btObj[key]);
|
|
123
|
+
});
|
|
124
|
+
return expect.objectContaining(obj);
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../../__tests__/unit/testUtils/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.spec.d.ts","sourceRoot":"","sources":["../../../../__tests__/unit/testUtils/hooks.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { createComparativeValue, renderHook, standardUseFetchState, testHook } from './hooks';
|
|
3
|
+
const useSayHello = (who, showCount = false) => {
|
|
4
|
+
const countRef = React.useRef(0);
|
|
5
|
+
countRef.current++;
|
|
6
|
+
return `Hello ${who}!${showCount && countRef.current > 1 ? ` x${countRef.current}` : ''}`;
|
|
7
|
+
};
|
|
8
|
+
const useSayHelloDelayed = (who, delay = 0) => {
|
|
9
|
+
const [speech, setSpeech] = React.useState('');
|
|
10
|
+
React.useEffect(() => {
|
|
11
|
+
const handle = setTimeout(() => setSpeech(`Hello ${who}!`), delay);
|
|
12
|
+
return () => clearTimeout(handle);
|
|
13
|
+
}, [who, delay]);
|
|
14
|
+
return speech;
|
|
15
|
+
};
|
|
16
|
+
describe('hook test utils', () => {
|
|
17
|
+
it('simple testHook', () => {
|
|
18
|
+
const renderResult = testHook((who) => `Hello ${who}!`)('world');
|
|
19
|
+
expect(renderResult).hookToBe('Hello world!');
|
|
20
|
+
expect(renderResult).hookToHaveUpdateCount(1);
|
|
21
|
+
renderResult.rerender('world');
|
|
22
|
+
expect(renderResult).hookToBe('Hello world!');
|
|
23
|
+
expect(renderResult).hookToBeStable();
|
|
24
|
+
expect(renderResult).hookToHaveUpdateCount(2);
|
|
25
|
+
});
|
|
26
|
+
it('use testHook for rendering', () => {
|
|
27
|
+
const renderResult = testHook(useSayHello)('world');
|
|
28
|
+
expect(renderResult).hookToHaveUpdateCount(1);
|
|
29
|
+
expect(renderResult).hookToBe('Hello world!');
|
|
30
|
+
expect(renderResult).hookToStrictEqual('Hello world!');
|
|
31
|
+
renderResult.rerender('world', false);
|
|
32
|
+
expect(renderResult).hookToHaveUpdateCount(2);
|
|
33
|
+
expect(renderResult).hookToBe('Hello world!');
|
|
34
|
+
expect(renderResult).hookToStrictEqual('Hello world!');
|
|
35
|
+
expect(renderResult).hookToBeStable();
|
|
36
|
+
renderResult.rerender('world', true);
|
|
37
|
+
expect(renderResult).hookToHaveUpdateCount(3);
|
|
38
|
+
expect(renderResult).hookToBe('Hello world! x3');
|
|
39
|
+
expect(renderResult).hookToStrictEqual('Hello world! x3');
|
|
40
|
+
});
|
|
41
|
+
it('use renderHook for rendering', () => {
|
|
42
|
+
const renderResult = renderHook(({ who, showCount }) => useSayHello(who, showCount), {
|
|
43
|
+
initialProps: {
|
|
44
|
+
who: 'world',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
expect(renderResult).hookToHaveUpdateCount(1);
|
|
48
|
+
expect(renderResult).hookToBe('Hello world!');
|
|
49
|
+
expect(renderResult).hookToStrictEqual('Hello world!');
|
|
50
|
+
renderResult.rerender({
|
|
51
|
+
who: 'world',
|
|
52
|
+
});
|
|
53
|
+
expect(renderResult).hookToHaveUpdateCount(2);
|
|
54
|
+
expect(renderResult).hookToBe('Hello world!');
|
|
55
|
+
expect(renderResult).hookToStrictEqual('Hello world!');
|
|
56
|
+
renderResult.rerender({ who: 'world' });
|
|
57
|
+
expect(renderResult).hookToHaveUpdateCount(3);
|
|
58
|
+
expect(renderResult).hookToBe('Hello world!');
|
|
59
|
+
expect(renderResult).hookToStrictEqual('Hello world!');
|
|
60
|
+
});
|
|
61
|
+
it('should use waitForNextUpdate for async update testing', async () => {
|
|
62
|
+
const renderResult = testHook(useSayHelloDelayed)('world');
|
|
63
|
+
expect(renderResult).hookToHaveUpdateCount(1);
|
|
64
|
+
expect(renderResult).hookToBe('');
|
|
65
|
+
await renderResult.waitForNextUpdate();
|
|
66
|
+
expect(renderResult).hookToHaveUpdateCount(2);
|
|
67
|
+
expect(renderResult).hookToBe('Hello world!');
|
|
68
|
+
});
|
|
69
|
+
it('should throw error if waitForNextUpdate times out', async () => {
|
|
70
|
+
const renderResult = renderHook(() => useSayHelloDelayed('', 20));
|
|
71
|
+
await expect(renderResult.waitForNextUpdate({ timeout: 10, interval: 5 })).rejects.toThrow();
|
|
72
|
+
expect(renderResult).hookToHaveUpdateCount(1);
|
|
73
|
+
// unmount to test waiting for an update that will never happen
|
|
74
|
+
renderResult.unmount();
|
|
75
|
+
await expect(renderResult.waitForNextUpdate({ timeout: 500, interval: 10 })).rejects.toThrow();
|
|
76
|
+
expect(renderResult).hookToHaveUpdateCount(1);
|
|
77
|
+
});
|
|
78
|
+
it('should not throw if waitForNextUpdate timeout is sufficient', async () => {
|
|
79
|
+
const renderResult = renderHook(() => useSayHelloDelayed('', 20));
|
|
80
|
+
await expect(renderResult.waitForNextUpdate({ timeout: 500, interval: 10 })).resolves.not.toThrow();
|
|
81
|
+
expect(renderResult).hookToHaveUpdateCount(2);
|
|
82
|
+
});
|
|
83
|
+
it('should assert stability of results using isStable', () => {
|
|
84
|
+
let testValue = 'test';
|
|
85
|
+
const renderResult = renderHook(() => testValue);
|
|
86
|
+
expect(renderResult).hookToHaveUpdateCount(1);
|
|
87
|
+
renderResult.rerender();
|
|
88
|
+
expect(renderResult).hookToHaveUpdateCount(2);
|
|
89
|
+
expect(renderResult).hookToBeStable();
|
|
90
|
+
testValue = 'new';
|
|
91
|
+
renderResult.rerender();
|
|
92
|
+
expect(renderResult).hookToHaveUpdateCount(3);
|
|
93
|
+
renderResult.rerender();
|
|
94
|
+
expect(renderResult).hookToHaveUpdateCount(4);
|
|
95
|
+
expect(renderResult).hookToBeStable();
|
|
96
|
+
});
|
|
97
|
+
it(`should assert stability of result using isStable 'array'`, () => {
|
|
98
|
+
let testValue = ['test'];
|
|
99
|
+
// explicitly returns a new array each render to show the difference between `isStable` and `isStableArray`
|
|
100
|
+
const renderResult = renderHook(() => testValue);
|
|
101
|
+
expect(renderResult).hookToHaveUpdateCount(1);
|
|
102
|
+
renderResult.rerender();
|
|
103
|
+
expect(renderResult).hookToHaveUpdateCount(2);
|
|
104
|
+
expect(renderResult).hookToBeStable();
|
|
105
|
+
expect(renderResult).hookToBeStable([true]);
|
|
106
|
+
testValue = ['new'];
|
|
107
|
+
renderResult.rerender();
|
|
108
|
+
expect(renderResult).hookToHaveUpdateCount(3);
|
|
109
|
+
expect(renderResult).hookToBeStable([false]);
|
|
110
|
+
renderResult.rerender();
|
|
111
|
+
expect(renderResult).hookToHaveUpdateCount(4);
|
|
112
|
+
expect(renderResult).hookToBeStable();
|
|
113
|
+
expect(renderResult).hookToBeStable([true]);
|
|
114
|
+
});
|
|
115
|
+
it('standardUseFetchState should return an array matching the state of useFetchState', () => {
|
|
116
|
+
expect(['test', false, undefined, () => null]).toStrictEqual(standardUseFetchState('test'));
|
|
117
|
+
expect(['test', true, undefined, () => null]).toStrictEqual(standardUseFetchState('test', true));
|
|
118
|
+
expect(['test', false, new Error('error'), () => null]).toStrictEqual(standardUseFetchState('test', false, new Error('error')));
|
|
119
|
+
});
|
|
120
|
+
describe('createComparativeValue', () => {
|
|
121
|
+
it('should extract array values according to the boolean object', () => {
|
|
122
|
+
expect([1, 2, 3]).toStrictEqual(createComparativeValue([1, 2, 3], [true, true, true]));
|
|
123
|
+
expect([1, 2, 3]).toStrictEqual(createComparativeValue([1, 2, 3], [true, true, false]));
|
|
124
|
+
expect([1, 2, 3]).toStrictEqual(createComparativeValue([1, 2, 4], [true, true, false]));
|
|
125
|
+
expect([1, 2, 3]).toStrictEqual(createComparativeValue([1, 2, 4], [true, true]));
|
|
126
|
+
expect([1, 2, 3]).not.toStrictEqual(createComparativeValue([1, 4, 3], [true, true, true]));
|
|
127
|
+
expect([3, 2, 1]).not.toStrictEqual(createComparativeValue([1, 2, 3], [true, true, true]));
|
|
128
|
+
expect([true, false]).not.toStrictEqual(createComparativeValue([false, true], [true, true]));
|
|
129
|
+
// array comparison must have the same length, however the stability array may have a lesser length
|
|
130
|
+
expect([1, 2, 3, 4]).toStrictEqual(createComparativeValue([1, 2, 3, 5], [true, true, true]));
|
|
131
|
+
});
|
|
132
|
+
it('should extract object values according to the boolean object', () => {
|
|
133
|
+
expect({ a: 1, b: 2, c: 3 }).toStrictEqual(createComparativeValue({ a: 1, b: 2, c: 3 }, { a: true, b: true, c: true }));
|
|
134
|
+
expect({ a: 1, b: 2, c: 3 }).toStrictEqual(createComparativeValue({ a: 1, b: 2, c: 3 }, { a: true, b: true, c: true }));
|
|
135
|
+
expect({ a: 1, b: 2, c: 3 }).toStrictEqual(createComparativeValue({ a: 1, b: 2, c: 4 }, { a: true, b: true, c: false }));
|
|
136
|
+
expect({ a: 1, b: 2, c: 3 }).toStrictEqual(createComparativeValue({ a: 1, b: 2, c: 4 }, { a: true, b: true }));
|
|
137
|
+
expect({ a: 1, b: 2, c: 3 }).not.toStrictEqual(createComparativeValue({ a: 1, b: 4, c: 3 }, { a: true, b: true, c: true }));
|
|
138
|
+
});
|
|
139
|
+
it('should extract nested values', () => {
|
|
140
|
+
const testValue = {
|
|
141
|
+
a: 1,
|
|
142
|
+
b: {
|
|
143
|
+
c: 2,
|
|
144
|
+
d: [{ e: 3 }, 'f', {}],
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
expect(testValue).toStrictEqual(createComparativeValue({ a: 10, b: { c: 2, d: [null, 'f', null] } }, {
|
|
148
|
+
b: {
|
|
149
|
+
c: true,
|
|
150
|
+
d: [false, true],
|
|
151
|
+
},
|
|
152
|
+
}));
|
|
153
|
+
});
|
|
154
|
+
it('should extract objects for identity comparisons', () => {
|
|
155
|
+
const obj = {};
|
|
156
|
+
const array = [];
|
|
157
|
+
const testValue = {
|
|
158
|
+
a: obj,
|
|
159
|
+
b: array,
|
|
160
|
+
c: {
|
|
161
|
+
d: obj,
|
|
162
|
+
e: array,
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
expect(testValue).not.toStrictEqual(createComparativeValue({
|
|
166
|
+
a: {},
|
|
167
|
+
b: [],
|
|
168
|
+
c: {
|
|
169
|
+
d: {},
|
|
170
|
+
e: [],
|
|
171
|
+
},
|
|
172
|
+
}, {
|
|
173
|
+
a: true,
|
|
174
|
+
b: true,
|
|
175
|
+
c: { d: true, e: true },
|
|
176
|
+
}));
|
|
177
|
+
expect(testValue).toStrictEqual(createComparativeValue({
|
|
178
|
+
a: obj,
|
|
179
|
+
b: array,
|
|
180
|
+
c: {
|
|
181
|
+
d: obj,
|
|
182
|
+
e: array,
|
|
183
|
+
},
|
|
184
|
+
}, {
|
|
185
|
+
a: true,
|
|
186
|
+
b: true,
|
|
187
|
+
c: { d: true, e: true },
|
|
188
|
+
}));
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=hooks.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.spec.js","sourceRoot":"","sources":["../../../../__tests__/unit/testUtils/hooks.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorUtils.spec.d.ts","sourceRoot":"","sources":["../../../api/__tests__/errorUtils.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NotReadyError } from '../../utilities/useFetchState';
|
|
2
|
+
import { handleRestFailures } from '../../api/errorUtils';
|
|
3
|
+
import { mockGenericResponse } from '../../__tests__/__mocks__/mockGenericResponse';
|
|
4
|
+
import { mockModArchResponse } from '../../api';
|
|
5
|
+
describe('handleRestFailures', () => {
|
|
6
|
+
it('should successfully return registered models', async () => {
|
|
7
|
+
const modelRegistryMock = mockGenericResponse({});
|
|
8
|
+
const result = await handleRestFailures(Promise.resolve(mockModArchResponse(modelRegistryMock)));
|
|
9
|
+
expect(result.data).toStrictEqual(modelRegistryMock);
|
|
10
|
+
});
|
|
11
|
+
it('should handle and throw model registry errors', async () => {
|
|
12
|
+
const statusMock = {
|
|
13
|
+
error: {
|
|
14
|
+
code: '',
|
|
15
|
+
message: 'error',
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
await expect(handleRestFailures(Promise.resolve(statusMock))).rejects.toThrow('error');
|
|
19
|
+
});
|
|
20
|
+
it('should handle common state errors ', async () => {
|
|
21
|
+
await expect(handleRestFailures(Promise.reject(new NotReadyError('error')))).rejects.toThrow('error');
|
|
22
|
+
});
|
|
23
|
+
it('should handle other errors', async () => {
|
|
24
|
+
await expect(handleRestFailures(Promise.reject(new Error('error')))).rejects.toThrow('Error communicating with server');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=errorUtils.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorUtils.spec.js","sourceRoot":"","sources":["../../../api/__tests__/errorUtils.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE7C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,CACxD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,UAAU,GAAa;YAC3B,KAAK,EAAE;gBACL,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,OAAO;aACjB;SACF,CAAC;QAEF,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC1F,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAClF,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|