@leaflink/dom-testing-utils 1.3.0 → 2.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 (56) hide show
  1. package/README.md +29 -12
  2. package/dist/index.d.ts +13 -68
  3. package/dist/index.js +13 -129
  4. package/dist/index.js.map +1 -1
  5. package/dist/setup-env.d.ts +1 -1
  6. package/dist/setup-env.js +38 -8
  7. package/dist/setup-env.js.map +1 -1
  8. package/dist/utils/__tests__/createFixtureGenerator.spec.js +36 -0
  9. package/dist/utils/__tests__/createFixtureGenerator.spec.js.map +1 -0
  10. package/dist/utils/__tests__/getAllByDescriptionTerm.spec.d.ts +1 -0
  11. package/dist/utils/__tests__/getAllByDescriptionTerm.spec.js +17 -0
  12. package/dist/utils/__tests__/getAllByDescriptionTerm.spec.js.map +1 -0
  13. package/dist/utils/__tests__/getByDescriptionTerm.spec.d.ts +1 -0
  14. package/dist/utils/__tests__/getByDescriptionTerm.spec.js +12 -0
  15. package/dist/utils/__tests__/getByDescriptionTerm.spec.js.map +1 -0
  16. package/dist/utils/assertAndDismissNoty.d.ts +8 -0
  17. package/dist/utils/assertAndDismissNoty.js +15 -0
  18. package/dist/utils/assertAndDismissNoty.js.map +1 -0
  19. package/dist/utils/cleanupDropdowns.d.ts +6 -0
  20. package/dist/utils/cleanupDropdowns.js +9 -0
  21. package/dist/utils/cleanupDropdowns.js.map +1 -0
  22. package/dist/utils/cleanupModals.d.ts +6 -0
  23. package/dist/utils/cleanupModals.js +9 -0
  24. package/dist/utils/cleanupModals.js.map +1 -0
  25. package/dist/utils/cleanupNoty.d.ts +6 -0
  26. package/dist/utils/cleanupNoty.js +9 -0
  27. package/dist/utils/cleanupNoty.js.map +1 -0
  28. package/dist/utils/cleanupToasts.d.ts +6 -0
  29. package/dist/utils/cleanupToasts.js +9 -0
  30. package/dist/utils/cleanupToasts.js.map +1 -0
  31. package/dist/utils/createFixtureGenerator.d.ts +27 -0
  32. package/dist/utils/createFixtureGenerator.js +40 -0
  33. package/dist/utils/createFixtureGenerator.js.map +1 -0
  34. package/dist/utils/getAllByDescriptionTerm.d.ts +8 -0
  35. package/dist/utils/getAllByDescriptionTerm.js +18 -0
  36. package/dist/utils/getAllByDescriptionTerm.js.map +1 -0
  37. package/dist/utils/getByDescriptionTerm.d.ts +7 -0
  38. package/dist/utils/getByDescriptionTerm.js +17 -0
  39. package/dist/utils/getByDescriptionTerm.js.map +1 -0
  40. package/dist/utils/hasText.d.ts +11 -0
  41. package/dist/utils/hasText.js +16 -0
  42. package/dist/utils/hasText.js.map +1 -0
  43. package/dist/utils/isHTMLElement.d.ts +7 -0
  44. package/dist/utils/isHTMLElement.js +10 -0
  45. package/dist/utils/isHTMLElement.js.map +1 -0
  46. package/dist/{api → utils}/mockEndpoints.d.ts +1 -1
  47. package/dist/{api → utils}/mockEndpoints.js +3 -3
  48. package/dist/utils/mockEndpoints.js.map +1 -0
  49. package/dist/utils/waitForLoadingToFinish.d.ts +8 -0
  50. package/dist/utils/waitForLoadingToFinish.js +12 -0
  51. package/dist/utils/waitForLoadingToFinish.js.map +1 -0
  52. package/package.json +34 -27
  53. package/dist/api/mockEndpoints.js.map +0 -1
  54. package/dist/index.spec.js +0 -58
  55. package/dist/index.spec.js.map +0 -1
  56. /package/dist/{index.spec.d.ts → utils/__tests__/createFixtureGenerator.spec.d.ts} +0 -0
package/README.md CHANGED
@@ -13,12 +13,15 @@
13
13
 
14
14
  - [Installation](#installation)
15
15
  - [Usage](#usage)
16
- - [Global setup](#global-setup)
17
16
  - [Setup file](#setup-file)
17
+ - [Global setup](#global-setup)
18
+ - [Utilities](#utilities)
18
19
  - [`cleanupNoty`](#cleanupnoty)
19
20
  - [`waitForLoadingToFinish`](#waitforloadingtofinish)
20
21
  - [`cleanupDropdowns`](#cleanupdropdowns)
21
22
  - [`assertAndDismissNoty`](#assertanddismissnoty)
23
+ - [`getByDescriptionTerm`](#getbydescriptionterm)
24
+ - [`getAllByDescriptionTerm`](#getallbydescriptionterm)
22
25
  - [`createFixtureGenerator`](#createfixturegenerator)
23
26
  - [Mocking API Endpoints](#mocking-api-endpoints)
24
27
 
@@ -32,7 +35,7 @@ npm install --save-dev @leaflink/dom-testing-utils
32
35
 
33
36
  ## Usage
34
37
 
35
- In your `*.spec.(ts|js)` files you can import utility functions.
38
+ In your test files you can import utility functions.
36
39
 
37
40
  ```ts
38
41
  import {
@@ -48,27 +51,41 @@ it('...', () => {
48
51
  });
49
52
  ```
50
53
 
51
- There's also shared setup files you can extend from.
54
+ ### Setup file
52
55
 
53
- ### Global setup
56
+ Import `@leaflink/dom-testing-utils/setup-env` once (for instance in your tests setup file) and you're good to go:
54
57
 
55
- Add the following line to your `vite.config.js`:
58
+ > **Note:** `@testing-library/jest-dom` is auto-imported from `@leaflink/dom-testing-utils` so you don't have to.
56
59
 
57
- ```js
58
- globalSetup: 'node_modules/@leaflink/dom-testing-utils/dist/global-setup.js',
60
+ ```ts
61
+ // In your own setup-env.ts (or any other name)
62
+ import '@leaflink/dom-testing-utils/setup-env'
63
+ // DON'T import `@testing-library/jest-dom` is auto imported from dom-testing-utils
64
+
65
+ // In vite.config.ts add (if you haven't already)
66
+ setupFiles: ['tests/setup-env.js'],
67
+
68
+ // In jest.config.js add (if you haven't already)
69
+ setupFilesAfterEnv: ['<rootDir>/tests/setup-env.js']
59
70
  ```
60
71
 
61
- This will run once *before everything*. See <https://vitest.dev/config/#globalsetup>.
72
+ This will be run once before *each* test file. See <https://vitest.dev/config/#setupfiles>.
62
73
 
63
- ### Setup file
74
+ ### Global setup
64
75
 
65
- Add the following line to your `vite.config.js`:
76
+ Add the following import to your test config:
66
77
 
67
78
  ```js
68
- setupFiles: ['node_modules/@leaflink/dom-testing-utils/dist/setup-env.js'],
79
+ // In vite.config.ts add
80
+ globalSetup: ['node_modules/@leaflink/dom-testing-utils/dist/global-setup.js'],
81
+
82
+ // In jest.config.js add
83
+ globalSetup: ['<rootDir>/node_modules/@leaflink/dom-testing-utils/dist/global-setup.js']
69
84
  ```
70
85
 
71
- This will be run once before *each* test file. See <https://vitest.dev/config/#setupfiles>.
86
+ This will run once *before everything*. See <https://vitest.dev/config/#globalsetup>.
87
+
88
+ ## Utilities
72
89
 
73
90
  ### `cleanupNoty`
74
91
 
package/dist/index.d.ts CHANGED
@@ -1,68 +1,13 @@
1
- import { createMockApiUtils, RestMethod } from "./api/mockEndpoints.js";
2
- /**
3
- * Utility to wait for loading to complete. Need to add a `data-test` to any
4
- * loading elements. Defaults to `ll-loading` OR `loading-spinner` if test ID is not specified.
5
- *
6
- * @param {string} testId - The data test ID to target
7
- * @returns {Promise<boolean>} - Will resolve or throw if the loaders stay in the DOM.
8
- */
9
- export declare function waitForLoadingToFinish(textMatch?: RegExp): Promise<void>;
10
- /**
11
- * Helper method to remove all noty alerts from the DOM.
12
- *
13
- * @returns void
14
- */
15
- export declare function cleanupNoty(): void;
16
- export declare function cleanupDropdowns(): void;
17
- /**
18
- * Queries and returns an array of HTML elements with the role "definition" (DD)
19
- * that matches the specified text.
20
- *
21
- * @param textMatch - The text to match within the HTML elements. It can be a string or a regular expression.
22
- * @returns An array of HTML elements that match the given text.
23
- */
24
- export declare function getAllByDescriptionTerm(textMatch: string | RegExp): HTMLElement[];
25
- /**
26
- * Finds the first HTML element with the role "definition" (DD) that matches the specified text.
27
- *
28
- * @param textMatch - The text to match within the HTML elements. It can be a string or a regular expression.
29
- * @returns The matched element, or undefined if no match is found.
30
- */
31
- export declare function getByDescriptionTerm(textMatch: string | RegExp): HTMLElement | undefined;
32
- /**
33
- * Helper to assert and manually dismiss a notification. This is useful in scenarios where
34
- * cleanupNoty() does not work as expected, such as when validating error messages in test suites
35
- *
36
- * @param {string | RegExp} text - expected notification text
37
- *
38
- * @returns void
39
- */
40
- export declare function assertAndDismissNoty(text: string): Promise<void>;
41
- /**
42
- * Higher order function that takes a method whose responsibility is to create a
43
- * **single** data fixture object and returns a new generator function that
44
- * allows you to create 1 or many of those fixtures. Fixture generator function
45
- * that's returned supports passing optional `num` and `overrides` params.
46
- *
47
- * @example
48
- *
49
- * const generateInvoice = (overrides) => ({ id: uuid(), balance: 15799, classification: "Adult Use", ...overrides});
50
- * const generateInvoices = createFixtureGenerator(generateInvoice);
51
- *
52
- * generateInvoices() // => Single invoice object
53
- * generateInvoices(1) // => Single invoice object
54
- * generateInvoices(1, { foo: 'bar' }) // => Single invoice object, override `foo` to equal `'bar'`
55
- * generateInvoices({ foo: 'bar' }) // => Single invoice object, override `foo` to equal `'bar'`
56
- * generateInvoices(10) // => Array of 10 invoice objects
57
- * generateInvoices(10, { foo: 'bar' }) // => Array of 10 invoice objects, override `foo` to equal `'bar'` in each
58
- *
59
- * @param fixtureFn - Method that generates a JSON data fixture.
60
- * @returns A fixture generator that return an array of fixture objects or single object if n = 1.
61
- */
62
- export declare function createFixtureGenerator<T>(fixtureFn: (overrides?: Partial<T>) => T): {
63
- (): T;
64
- <TNum extends 1>(num: TNum, overrides?: Partial<T>): T;
65
- <TNum_1 extends Partial<T>>(num: Partial<T>): T;
66
- <TNum_2 extends number>(num: TNum_2, overrides?: Partial<T>): T[];
67
- };
68
- export { createMockApiUtils, RestMethod };
1
+ export { default as assertAndDismissNoty } from './utils/assertAndDismissNoty.js';
2
+ export { default as cleanupDropdowns } from './utils/cleanupDropdowns.js';
3
+ export { default as cleanupModals } from './utils/cleanupModals.js';
4
+ export { default as cleanupNoty } from './utils/cleanupNoty.js';
5
+ export { default as cleanupToasts } from './utils/cleanupToasts.js';
6
+ export { default as createFixtureGenerator } from './utils/createFixtureGenerator.js';
7
+ export { default as getAllByDescriptionTerm } from './utils/getAllByDescriptionTerm.js';
8
+ export { default as getByDescriptionTerm } from './utils/getByDescriptionTerm.js';
9
+ export { default as hasText } from './utils/hasText.js';
10
+ export { default as isHTMLElement } from './utils/isHTMLElement.js';
11
+ export { default as createMockApiUtils, RestMethod } from './utils/mockEndpoints.js';
12
+ export { default as mockEndpoints } from './utils/mockEndpoints.js';
13
+ export { default as waitForLoadingToFinish } from './utils/waitForLoadingToFinish.js';
package/dist/index.js CHANGED
@@ -1,130 +1,14 @@
1
- import { getNodeText, screen, waitForElementToBeRemoved } from '@testing-library/vue';
2
- import { default as userEvent } from '@testing-library/user-event';
3
- import { createMockApiUtils } from "./api/mockEndpoints.js";
4
- /**
5
- * Utility to wait for loading to complete. Need to add a `data-test` to any
6
- * loading elements. Defaults to `ll-loading` OR `loading-spinner` if test ID is not specified.
7
- *
8
- * @param {string} testId - The data test ID to target
9
- * @returns {Promise<boolean>} - Will resolve or throw if the loaders stay in the DOM.
10
- */
11
- export function waitForLoadingToFinish(textMatch = /ll\-loading|loading\-spinner/) {
12
- return waitForElementToBeRemoved(() => [...screen.queryAllByTestId(textMatch)], { timeout: 2000 });
13
- }
14
- /**
15
- * Helper method to remove all noty alerts from the DOM.
16
- *
17
- * @returns void
18
- */
19
- export function cleanupNoty() {
20
- document
21
- .querySelectorAll('.noty_bar')
22
- .forEach((elem) => elem.parentNode?.removeChild(elem));
23
- }
24
- export function cleanupDropdowns() {
25
- document
26
- .querySelectorAll('.mount-point-container')
27
- .forEach((elem) => elem.parentNode?.removeChild(elem));
28
- }
29
- /**
30
- * Type guard function to check if the provided value is an instance of HTMLElement.
31
- *
32
- * @param element - The value to check if it is an HTMLElement.
33
- * @returns Returns true if the value is an HTMLElement, otherwise false.
34
- */
35
- function isHTMLElement(element) {
36
- return element instanceof HTMLElement;
37
- }
38
- /**
39
- * Checks if the given HTML element contains the specified text or matches the regular expression.
40
- *
41
- * @param node - The HTML element to check for the presence of text.
42
- * @param textMatch - The text or regular expression to match within the HTML element.
43
- * @returns Returns one of the following:
44
- * - true, if the element contains the exact text match;
45
- * - RegExpMatchArray, if the element's text matches the regular expression;
46
- * - null, if there is no match.
47
- */
48
- function hasText(node, textMatch) {
49
- const nodeText = getNodeText(node);
50
- return nodeText === textMatch || nodeText.match(textMatch);
51
- }
52
- /**
53
- * Queries and returns an array of HTML elements with the role "definition" (DD)
54
- * that matches the specified text.
55
- *
56
- * @param textMatch - The text to match within the HTML elements. It can be a string or a regular expression.
57
- * @returns An array of HTML elements that match the given text.
58
- */
59
- export function getAllByDescriptionTerm(textMatch) {
60
- return screen
61
- .getAllByRole('definition')
62
- .filter((term) => term.tagName === 'DD' && isHTMLElement(term.previousElementSibling) && hasText(term?.previousElementSibling, textMatch));
63
- }
64
- ;
65
- /**
66
- * Finds the first HTML element with the role "definition" (DD) that matches the specified text.
67
- *
68
- * @param textMatch - The text to match within the HTML elements. It can be a string or a regular expression.
69
- * @returns The matched element, or undefined if no match is found.
70
- */
71
- export function getByDescriptionTerm(textMatch) {
72
- return screen
73
- .getAllByRole('definition')
74
- .find((term) => term.tagName === 'DD' && isHTMLElement(term.previousElementSibling) && hasText(term?.previousElementSibling, textMatch));
75
- }
76
- ;
77
- /**
78
- * Helper to assert and manually dismiss a notification. This is useful in scenarios where
79
- * cleanupNoty() does not work as expected, such as when validating error messages in test suites
80
- *
81
- * @param {string | RegExp} text - expected notification text
82
- *
83
- * @returns void
84
- */
85
- export async function assertAndDismissNoty(text) {
86
- const noty = await screen.findByText(text);
87
- expect(noty).toBeInTheDocument();
88
- await userEvent.click(noty);
89
- }
90
- /**
91
- * Higher order function that takes a method whose responsibility is to create a
92
- * **single** data fixture object and returns a new generator function that
93
- * allows you to create 1 or many of those fixtures. Fixture generator function
94
- * that's returned supports passing optional `num` and `overrides` params.
95
- *
96
- * @example
97
- *
98
- * const generateInvoice = (overrides) => ({ id: uuid(), balance: 15799, classification: "Adult Use", ...overrides});
99
- * const generateInvoices = createFixtureGenerator(generateInvoice);
100
- *
101
- * generateInvoices() // => Single invoice object
102
- * generateInvoices(1) // => Single invoice object
103
- * generateInvoices(1, { foo: 'bar' }) // => Single invoice object, override `foo` to equal `'bar'`
104
- * generateInvoices({ foo: 'bar' }) // => Single invoice object, override `foo` to equal `'bar'`
105
- * generateInvoices(10) // => Array of 10 invoice objects
106
- * generateInvoices(10, { foo: 'bar' }) // => Array of 10 invoice objects, override `foo` to equal `'bar'` in each
107
- *
108
- * @param fixtureFn - Method that generates a JSON data fixture.
109
- * @returns A fixture generator that return an array of fixture objects or single object if n = 1.
110
- */
111
- export function createFixtureGenerator(fixtureFn) {
112
- function _generator(num = 1, overrides = {}) {
113
- // if the first param is not a number, it must be the overrides
114
- if (typeof num !== 'number') {
115
- return fixtureFn(num);
116
- }
117
- else if (num === 1) {
118
- // If num is 1, then we don't want to return an array, so just generate one with any potential overrides
119
- return fixtureFn(overrides);
120
- }
121
- else {
122
- // Otherwise, let's generate however many requested data objects
123
- return Array.apply(null, Array(num)).map(() => fixtureFn(overrides));
124
- }
125
- }
126
- ;
127
- return _generator;
128
- }
129
- export { createMockApiUtils };
1
+ export { default as assertAndDismissNoty } from './utils/assertAndDismissNoty.js';
2
+ export { default as cleanupDropdowns } from './utils/cleanupDropdowns.js';
3
+ export { default as cleanupModals } from './utils/cleanupModals.js';
4
+ export { default as cleanupNoty } from './utils/cleanupNoty.js';
5
+ export { default as cleanupToasts } from './utils/cleanupToasts.js';
6
+ export { default as createFixtureGenerator } from './utils/createFixtureGenerator.js';
7
+ export { default as getAllByDescriptionTerm } from './utils/getAllByDescriptionTerm.js';
8
+ export { default as getByDescriptionTerm } from './utils/getByDescriptionTerm.js';
9
+ export { default as hasText } from './utils/hasText.js';
10
+ export { default as isHTMLElement } from './utils/isHTMLElement.js';
11
+ export { default as createMockApiUtils } from './utils/mockEndpoints.js';
12
+ export { default as mockEndpoints } from './utils/mockEndpoints.js';
13
+ export { default as waitForLoadingToFinish } from './utils/waitForLoadingToFinish.js';
130
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"src/","sources":["index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AACxF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAc,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -1 +1 @@
1
- import '@testing-library/jest-dom';
1
+ import '@testing-library/jest-dom/vitest';
package/dist/setup-env.js CHANGED
@@ -1,12 +1,26 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ import { configure as configureTestingLibrary } from '@testing-library/vue';
3
+ import { config, flushPromises } from '@vue/test-utils';
1
4
  import { vi } from 'vitest';
2
- import { config } from '@vue/test-utils';
3
- import '@testing-library/jest-dom';
5
+ import cleanupDropdowns from './utils/cleanupDropdowns';
6
+ import cleanupModals from './utils/cleanupModals';
7
+ import cleanupNoty from './utils/cleanupNoty';
8
+ import cleanupToasts from './utils/cleanupToasts';
9
+ // checking if an element is hidden is quite expensive
10
+ // this is only done in CI as a fail safe. It can still explicitly be checked
11
+ // in the test files which helps documenting what is part of the DOM but hidden
12
+ // from assistive technology
13
+ const defaultHidden = !process.env.CI;
14
+ configureTestingLibrary({ testIdAttribute: 'data-test', defaultHidden });
15
+ vi.mock('lodash-es/debounce', () => {
16
+ return { default: vi.fn((fn) => fn) };
17
+ });
4
18
  config.global.mocks['$t'] = (msg) => msg;
5
19
  const oldWindowLocation = global.window.location;
6
20
  beforeAll(() => {
7
- // @ts-expect-error
21
+ // @ts-expect-error - dunno
8
22
  delete global.window.location;
9
- // @ts-expect-error
23
+ // @ts-expect-error - dunno
10
24
  global.window.location = Object.defineProperties({}, {
11
25
  ...Object.getOwnPropertyDescriptors(oldWindowLocation),
12
26
  assign: {
@@ -21,12 +35,26 @@ beforeAll(() => {
21
35
  },
22
36
  },
23
37
  });
24
- window.open = vi.fn();
25
- vi.mock('lodash-es/debounce', () => {
26
- return { default: vi.fn((fn) => fn) };
27
- });
38
+ global.window.open = vi.fn();
39
+ });
40
+ afterEach(() => {
41
+ // cleanup modals in between tests
42
+ cleanupModals();
43
+ // cleanup toasts in between tests
44
+ cleanupToasts();
45
+ // cleanup noty messages in between tests
46
+ cleanupNoty();
47
+ // cleanup dropdown menus in between tests
48
+ cleanupDropdowns();
49
+ });
50
+ afterEach(async () => {
51
+ // flush out any pending promises so they will fail the test instead of asynchronously at
52
+ // the wrong time
53
+ await flushPromises();
28
54
  });
29
55
  afterAll(() => {
56
+ // restore `window.location` to the original `jsdom`
57
+ // `Location` object
30
58
  global.window.location = oldWindowLocation;
31
59
  });
32
60
  const IntersectionObserverMock = vi.fn(() => ({
@@ -39,6 +67,8 @@ const IntersectionObserverMock = vi.fn(() => ({
39
67
  unobserve: vi.fn(),
40
68
  }));
41
69
  vi.stubGlobal('IntersectionObserver', IntersectionObserverMock);
70
+ // Uploading a file does not use axios, so mock the fetch api
71
+ // See src/services/api/files.js->uploadFile for more info
42
72
  vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ json: vi.fn().mockResolvedValue({}) }));
43
73
  // https://github.com/jsdom/jsdom/issues/1695
44
74
  Element.prototype.scrollIntoView = vi.fn();
@@ -1 +1 @@
1
- {"version":3,"file":"setup-env.js","sourceRoot":"src/","sources":["setup-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,2BAA2B,CAAC;AAEnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC;AAEzC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;AAEjD,SAAS,CAAC,GAAG,EAAE;IACb,mBAAmB;IACnB,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE9B,mBAAmB;IACnB,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAC9C,EAAE,EACF;QACE,GAAG,MAAM,CAAC,yBAAyB,CAAC,iBAAiB,CAAC;QACtD,MAAM,EAAE;YACN,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACf;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE;gBACL,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;aACjB;SACF;KACF,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAEtB,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QACjC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,GAAG,EAAE;IACZ,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,iBAAiB,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,IAAI,IAAI;QACN,OAAO;IACT,CAAC;IACD,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,UAAU,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAC;AAEhE,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,CACnE,CAAC;AAEF,6CAA6C;AAC7C,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC"}
1
+ {"version":3,"file":"setup-env.js","sourceRoot":"src/","sources":["setup-env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import createFixtureGenerator from '../createFixtureGenerator';
2
+ it('returns a function that can generate an array of data objects', () => {
3
+ const generator = (overrides) => ({
4
+ foo: 'bar',
5
+ bar: 'baz',
6
+ ...overrides,
7
+ });
8
+ expect(createFixtureGenerator(generator)(5)).toEqual([
9
+ { foo: 'bar', bar: 'baz' },
10
+ { foo: 'bar', bar: 'baz' },
11
+ { foo: 'bar', bar: 'baz' },
12
+ { foo: 'bar', bar: 'baz' },
13
+ { foo: 'bar', bar: 'baz' },
14
+ ]);
15
+ expect(createFixtureGenerator(generator)(3, { bar: 'yak' })).toEqual([
16
+ { foo: 'bar', bar: 'yak' },
17
+ { foo: 'bar', bar: 'yak' },
18
+ { foo: 'bar', bar: 'yak' },
19
+ ]);
20
+ });
21
+ it('returns a function that can generate a single data object', () => {
22
+ const generator = (overrides) => ({
23
+ foo: 'bar',
24
+ bar: 'baz',
25
+ ...overrides,
26
+ });
27
+ expect(createFixtureGenerator(generator)()).toEqual({
28
+ foo: 'bar',
29
+ bar: 'baz',
30
+ });
31
+ expect(createFixtureGenerator(generator)({ bar: 'yak' })).toEqual({
32
+ foo: 'bar',
33
+ bar: 'yak',
34
+ });
35
+ });
36
+ //# sourceMappingURL=createFixtureGenerator.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFixtureGenerator.spec.js","sourceRoot":"src/","sources":["utils/__tests__/createFixtureGenerator.spec.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAE/D,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACvE,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAChC,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,SAAS;KACb,CAAC,CAAC;IAEH,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACnD,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;QAC1B,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;QAC1B,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;QAC1B,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;QAC1B,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;KAC3B,CAAC,CAAC;IAEH,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACnE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;QAC1B,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;QAC1B,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;KAC3B,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACnE,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAChC,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,SAAS;KACb,CAAC,CAAC;IAEH,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;QAClD,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;KACX,CAAC,CAAC;IAEH,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAChE,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;KACX,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { render } from '@testing-library/vue';
2
+ import getAllByDescriptionTerm from '../getAllByDescriptionTerm';
3
+ it.each `
4
+ term | type
5
+ ${'foo'} | ${'string'}
6
+ ${/foo/i} | ${'regex'}
7
+ ${new RegExp('foo', 'i')} | ${'RegExp'}
8
+ `('should return the description details for a given $type term', ({ term }) => {
9
+ render({
10
+ template: `<dl><dt>foo</dt><dd>bar1</dd></dl><dl><dt>foo</dt><dd>bar2</dd></dl>`,
11
+ });
12
+ const details = getAllByDescriptionTerm(term);
13
+ expect(details).toHaveLength(2);
14
+ expect(details[0]).toHaveTextContent('bar1');
15
+ expect(details[1]).toHaveTextContent('bar2');
16
+ });
17
+ //# sourceMappingURL=getAllByDescriptionTerm.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAllByDescriptionTerm.spec.js","sourceRoot":"src/","sources":["utils/__tests__/getAllByDescriptionTerm.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,uBAAuB,MAAM,4BAA4B,CAAC;AAEjE,EAAE,CAAC,IAAI,CAAA;;IAEH,KAAK,uBAAuB,QAAQ;IACpC,MAAM,sBAAsB,OAAO;IACnC,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,QAAQ;CACvC,CAAC,8DAA8D,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;IAC7E,MAAM,CAAC;QACL,QAAQ,EAAE,sEAAsE;KACjF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { render } from '@testing-library/vue';
2
+ import getByDescriptionTerm from '../getByDescriptionTerm';
3
+ it.each `
4
+ term | type
5
+ ${'foo'} | ${'string'}
6
+ ${/foo/i} | ${'regex'}
7
+ ${new RegExp('foo', 'i')} | ${'RegExp'}
8
+ `('should return the description detail for a given $type term', ({ term }) => {
9
+ render({ template: `<dl><dt>foo</dt><dd>bar</dd></dl>` });
10
+ expect(getByDescriptionTerm(term)).toHaveTextContent('bar');
11
+ });
12
+ //# sourceMappingURL=getByDescriptionTerm.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getByDescriptionTerm.spec.js","sourceRoot":"src/","sources":["utils/__tests__/getByDescriptionTerm.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAE3D,EAAE,CAAC,IAAI,CAAA;;IAEH,KAAK,uBAAuB,QAAQ;IACpC,MAAM,sBAAsB,OAAO;IACnC,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,QAAQ;CACvC,CAAC,6DAA6D,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;IAC5E,MAAM,CAAC,EAAE,QAAQ,EAAE,mCAAmC,EAAE,CAAC,CAAC;IAE1D,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Helper to assert and manually dismiss a notification. This is useful in scenarios where
3
+ * cleanupNoty() does not work as expected, such as when validating error messages in test suites
4
+ *
5
+ * @param {string | RegExp} text - Expected notification text. Can be a string or a regular expression.
6
+ * @returns void
7
+ */
8
+ export default function assertAndDismissNoty(text: string | RegExp): Promise<void>;
@@ -0,0 +1,15 @@
1
+ import userEvent from '@testing-library/user-event';
2
+ import { screen } from '@testing-library/vue';
3
+ /**
4
+ * Helper to assert and manually dismiss a notification. This is useful in scenarios where
5
+ * cleanupNoty() does not work as expected, such as when validating error messages in test suites
6
+ *
7
+ * @param {string | RegExp} text - Expected notification text. Can be a string or a regular expression.
8
+ * @returns void
9
+ */
10
+ export default async function assertAndDismissNoty(text) {
11
+ const noty = await screen.findByText(text);
12
+ expect(noty).toBeInTheDocument();
13
+ await userEvent.click(noty);
14
+ }
15
+ //# sourceMappingURL=assertAndDismissNoty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertAndDismissNoty.js","sourceRoot":"src/","sources":["utils/assertAndDismissNoty.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAqB;IACtE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAEjC,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Helper method to remove all Stash dropdowns from the DOM.
3
+ *
4
+ * @returns void
5
+ */
6
+ export default function cleanupDropdowns(): void;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Helper method to remove all Stash dropdowns from the DOM.
3
+ *
4
+ * @returns void
5
+ */
6
+ export default function cleanupDropdowns() {
7
+ document.querySelectorAll('.mount-point-container').forEach((elem) => elem.parentNode?.removeChild(elem));
8
+ }
9
+ //# sourceMappingURL=cleanupDropdowns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanupDropdowns.js","sourceRoot":"src/","sources":["utils/cleanupDropdowns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACtC,QAAQ,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5G,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Helper method to remove all Stash modals from the DOM.
3
+ *
4
+ * @returns void
5
+ */
6
+ export default function cleanupModals(): void;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Helper method to remove all Stash modals from the DOM.
3
+ *
4
+ * @returns void
5
+ */
6
+ export default function cleanupModals() {
7
+ document.querySelectorAll('.stash-modal-wrapper').forEach((elem) => elem.parentNode?.removeChild(elem));
8
+ }
9
+ //# sourceMappingURL=cleanupModals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanupModals.js","sourceRoot":"src/","sources":["utils/cleanupModals.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa;IACnC,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1G,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Helper method to remove all noty alerts from the DOM.
3
+ *
4
+ * @returns void
5
+ */
6
+ export default function cleanupNoty(): void;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Helper method to remove all noty alerts from the DOM.
3
+ *
4
+ * @returns void
5
+ */
6
+ export default function cleanupNoty() {
7
+ document.querySelectorAll('.noty_bar').forEach((elem) => elem.parentNode?.removeChild(elem));
8
+ }
9
+ //# sourceMappingURL=cleanupNoty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanupNoty.js","sourceRoot":"src/","sources":["utils/cleanupNoty.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Helper method to remove all Stash toasts from the DOM.
3
+ *
4
+ * @returns void
5
+ */
6
+ export default function cleanupToasts(): void;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Helper method to remove all Stash toasts from the DOM.
3
+ *
4
+ * @returns void
5
+ */
6
+ export default function cleanupToasts() {
7
+ document.querySelectorAll('.stash-toast').forEach((elem) => elem.parentNode?.removeChild(elem));
8
+ }
9
+ //# sourceMappingURL=cleanupToasts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanupToasts.js","sourceRoot":"src/","sources":["utils/cleanupToasts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa;IACnC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAClG,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Higher order function that takes a method whose responsibility is to create a
3
+ * **single** data fixture object and returns a new generator function that
4
+ * allows you to create 1 or many of those fixtures. Fixture generator function
5
+ * that's returned supports passing optional `num` and `overrides` params.
6
+ *
7
+ * @example
8
+ *
9
+ * const generateInvoice = (overrides) => ({ id: uuid(), balance: 15799, classification: "Adult Use", ...overrides});
10
+ * const generateInvoices = createFixtureGenerator(generateInvoice);
11
+ *
12
+ * generateInvoices() // => Single invoice object
13
+ * generateInvoices(1) // => Single invoice object
14
+ * generateInvoices(1, { foo: 'bar' }) // => Single invoice object, override `foo` to equal `'bar'`
15
+ * generateInvoices({ foo: 'bar' }) // => Single invoice object, override `foo` to equal `'bar'`
16
+ * generateInvoices(10) // => Array of 10 invoice objects
17
+ * generateInvoices(10, { foo: 'bar' }) // => Array of 10 invoice objects, override `foo` to equal `'bar'` in each
18
+ *
19
+ * @param fixtureFn - Method that generates a JSON data fixture.
20
+ * @returns A fixture generator that return an array of fixture objects or single object if n = 1.
21
+ */
22
+ export default function createFixtureGenerator<T>(fixtureFn: (overrides?: Partial<T>) => T): {
23
+ (): T;
24
+ <TNum extends 1>(num: TNum, overrides?: Partial<T>): T;
25
+ (num: Partial<T>): T;
26
+ <TNum_1 extends number>(num: TNum_1, overrides?: Partial<T>): T[];
27
+ };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Higher order function that takes a method whose responsibility is to create a
3
+ * **single** data fixture object and returns a new generator function that
4
+ * allows you to create 1 or many of those fixtures. Fixture generator function
5
+ * that's returned supports passing optional `num` and `overrides` params.
6
+ *
7
+ * @example
8
+ *
9
+ * const generateInvoice = (overrides) => ({ id: uuid(), balance: 15799, classification: "Adult Use", ...overrides});
10
+ * const generateInvoices = createFixtureGenerator(generateInvoice);
11
+ *
12
+ * generateInvoices() // => Single invoice object
13
+ * generateInvoices(1) // => Single invoice object
14
+ * generateInvoices(1, { foo: 'bar' }) // => Single invoice object, override `foo` to equal `'bar'`
15
+ * generateInvoices({ foo: 'bar' }) // => Single invoice object, override `foo` to equal `'bar'`
16
+ * generateInvoices(10) // => Array of 10 invoice objects
17
+ * generateInvoices(10, { foo: 'bar' }) // => Array of 10 invoice objects, override `foo` to equal `'bar'` in each
18
+ *
19
+ * @param fixtureFn - Method that generates a JSON data fixture.
20
+ * @returns A fixture generator that return an array of fixture objects or single object if n = 1.
21
+ */
22
+ export default function createFixtureGenerator(fixtureFn) {
23
+ function _generator(num = 1, overrides = {}) {
24
+ // if the first param is not a number, it must be the overrides
25
+ if (typeof num !== 'number') {
26
+ return fixtureFn(num);
27
+ }
28
+ else if (num === 1) {
29
+ // If num is 1, then we don't want to return an array, so just generate one with any potential overrides
30
+ return fixtureFn(overrides);
31
+ }
32
+ else {
33
+ // Otherwise, let's generate however many requested data objects
34
+ // eslint-disable-next-line prefer-spread
35
+ return Array.apply(null, Array(num)).map(() => fixtureFn(overrides));
36
+ }
37
+ }
38
+ return _generator;
39
+ }
40
+ //# sourceMappingURL=createFixtureGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFixtureGenerator.js","sourceRoot":"src/","sources":["utils/createFixtureGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAI,SAAwC;IAKxF,SAAS,UAAU,CAAC,MAA2B,CAAC,EAAE,SAAS,GAAG,EAAE;QAC9D,+DAA+D;QAC/D,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;SACvB;aAAM,IAAI,GAAG,KAAK,CAAC,EAAE;YACpB,wGAAwG;YACxG,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;SAC7B;aAAM;YACL,gEAAgE;YAChE,yCAAyC;YACzC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;SACtE;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Queries and returns an array of HTML elements with the role "definition" (DD)
3
+ * that matches the specified text.
4
+ *
5
+ * @param textMatch - The text to match within the HTML elements. It can be a string or a regular expression.
6
+ * @returns An array of HTML elements that match the given text.
7
+ */
8
+ export default function getAllByDescriptionTerm(textMatch: string | RegExp): HTMLElement[];
@@ -0,0 +1,18 @@
1
+ import { screen } from '@testing-library/vue';
2
+ import hasText from './hasText';
3
+ import isHTMLElement from './isHTMLElement';
4
+ /**
5
+ * Queries and returns an array of HTML elements with the role "definition" (DD)
6
+ * that matches the specified text.
7
+ *
8
+ * @param textMatch - The text to match within the HTML elements. It can be a string or a regular expression.
9
+ * @returns An array of HTML elements that match the given text.
10
+ */
11
+ export default function getAllByDescriptionTerm(textMatch) {
12
+ return screen
13
+ .getAllByRole('definition')
14
+ .filter((term) => term.tagName === 'DD' &&
15
+ isHTMLElement(term.previousElementSibling) &&
16
+ hasText(term?.previousElementSibling, textMatch));
17
+ }
18
+ //# sourceMappingURL=getAllByDescriptionTerm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAllByDescriptionTerm.js","sourceRoot":"src/","sources":["utils/getAllByDescriptionTerm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,SAA0B;IACxE,OAAO,MAAM;SACV,YAAY,CAAC,YAAY,CAAC;SAC1B,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,OAAO,KAAK,IAAI;QACrB,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC;QAC1C,OAAO,CAAC,IAAI,EAAE,sBAAsB,EAAE,SAAS,CAAC,CACnD,CAAC;AACN,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Finds the first HTML element with the role "definition" (DD) that matches the specified text.
3
+ *
4
+ * @param textMatch - The text to match within the HTML elements. It can be a string or a regular expression.
5
+ * @returns The matched element, or undefined if no match is found.
6
+ */
7
+ export default function getByDescriptionTerm(textMatch: string | RegExp): HTMLElement | undefined;
@@ -0,0 +1,17 @@
1
+ import { screen } from '@testing-library/vue';
2
+ import hasText from './hasText';
3
+ import isHTMLElement from './isHTMLElement';
4
+ /**
5
+ * Finds the first HTML element with the role "definition" (DD) that matches the specified text.
6
+ *
7
+ * @param textMatch - The text to match within the HTML elements. It can be a string or a regular expression.
8
+ * @returns The matched element, or undefined if no match is found.
9
+ */
10
+ export default function getByDescriptionTerm(textMatch) {
11
+ return screen
12
+ .getAllByRole('definition')
13
+ .find((term) => term.tagName === 'DD' &&
14
+ isHTMLElement(term.previousElementSibling) &&
15
+ hasText(term?.previousElementSibling, textMatch));
16
+ }
17
+ //# sourceMappingURL=getByDescriptionTerm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getByDescriptionTerm.js","sourceRoot":"src/","sources":["utils/getByDescriptionTerm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,SAA0B;IACrE,OAAO,MAAM;SACV,YAAY,CAAC,YAAY,CAAC;SAC1B,IAAI,CACH,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,OAAO,KAAK,IAAI;QACrB,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC;QAC1C,OAAO,CAAC,IAAI,EAAE,sBAAsB,EAAE,SAAS,CAAC,CACnD,CAAC;AACN,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Checks if the given HTML element contains the specified text or matches the regular expression.
3
+ *
4
+ * @param node - The HTML element to check for the presence of text.
5
+ * @param textMatch - The text or regular expression to match within the HTML element.
6
+ * @returns Returns one of the following:
7
+ * - true, if the element contains the exact text match;
8
+ * - RegExpMatchArray, if the element's text matches the regular expression;
9
+ * - null, if there is no match.
10
+ */
11
+ export default function hasText(node: HTMLElement, textMatch: string | RegExp): true | RegExpMatchArray | null;
@@ -0,0 +1,16 @@
1
+ import { getNodeText } from '@testing-library/vue';
2
+ /**
3
+ * Checks if the given HTML element contains the specified text or matches the regular expression.
4
+ *
5
+ * @param node - The HTML element to check for the presence of text.
6
+ * @param textMatch - The text or regular expression to match within the HTML element.
7
+ * @returns Returns one of the following:
8
+ * - true, if the element contains the exact text match;
9
+ * - RegExpMatchArray, if the element's text matches the regular expression;
10
+ * - null, if there is no match.
11
+ */
12
+ export default function hasText(node, textMatch) {
13
+ const nodeText = getNodeText(node);
14
+ return nodeText === textMatch || nodeText.match(textMatch);
15
+ }
16
+ //# sourceMappingURL=hasText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasText.js","sourceRoot":"src/","sources":["utils/hasText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,IAAiB,EAAE,SAA0B;IAC3E,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Type guard function to check if the provided value is an instance of HTMLElement.
3
+ *
4
+ * @param element - The value to check if it is an HTMLElement.
5
+ * @returns Returns true if the value is an HTMLElement, otherwise false.
6
+ */
7
+ export default function isHTMLElement(element: any): element is HTMLElement;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Type guard function to check if the provided value is an instance of HTMLElement.
3
+ *
4
+ * @param element - The value to check if it is an HTMLElement.
5
+ * @returns Returns true if the value is an HTMLElement, otherwise false.
6
+ */
7
+ export default function isHTMLElement(element) {
8
+ return element instanceof HTMLElement;
9
+ }
10
+ //# sourceMappingURL=isHTMLElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isHTMLElement.js","sourceRoot":"src/","sources":["utils/isHTMLElement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAY;IAChD,OAAO,OAAO,YAAY,WAAW,CAAC;AACxC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { DefaultRequestBody, RequestParams, ResponseResolver, rest, RestContext, RestRequest } from 'msw';
2
2
  import { SetupServerApi } from 'msw/node';
3
3
  export type RestMethod = keyof typeof rest;
4
- export declare const createMockApiUtils: (server: SetupServerApi) => {
4
+ export default function createMockApiUtils(server: SetupServerApi): {
5
5
  mockEndpointData: <ResponseBody extends DefaultRequestBody = any>(relativeUrl: string, responseData: ResponseBody, method: RestMethod) => void;
6
6
  mockEndpoint: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, ResponseBody_1 extends DefaultRequestBody = any, Params extends RequestParams = RequestParams>(relativeUrl: string, responseCallback: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody_1>, method: RestMethod) => void;
7
7
  mockGetData: <ResponseBody_2 extends DefaultRequestBody = any>(relativeUrl: string, responseData: ResponseBody_2) => void;
@@ -1,5 +1,5 @@
1
- import { rest, } from 'msw';
2
- export const createMockApiUtils = (server) => {
1
+ import { rest } from 'msw';
2
+ export default function createMockApiUtils(server) {
3
3
  /**
4
4
  * Mock endpoint with data
5
5
  */
@@ -54,5 +54,5 @@ export const createMockApiUtils = (server) => {
54
54
  mockDeleteEndpoint,
55
55
  mockPatchEndpoint,
56
56
  };
57
- };
57
+ }
58
58
  //# sourceMappingURL=mockEndpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockEndpoints.js","sourceRoot":"src/","sources":["utils/mockEndpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuD,IAAI,EAA4B,MAAM,KAAK,CAAC;AAK1G,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,MAAsB;IAC/D;;OAEG;IACH,MAAM,gBAAgB,GAAG,CACvB,WAAmB,EACnB,YAA0B,EAC1B,MAAkB,EAClB,EAAE;QACF,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3C,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,YAAY,GAAG,CAKnB,WAAmB,EACnB,gBAAmG,EACnG,MAAkB,EAClB,EAAE;QACF,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,gBAAgB,GACpB,CAAC,MAAkB,EAAE,EAAE,CACvB,CAAgD,WAAmB,EAAE,YAA0B,EAAE,EAAE;QACjG,OAAO,gBAAgB,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEJ;;;OAGG;IACH,MAAM,oBAAoB,GACxB,CAAC,MAAkB,EAAE,EAAE,CACvB,CAKE,WAAmB,EACnB,gBAAmG,EACnG,EAAE;QACF,OAAO,YAAY,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEJ,6BAA6B;IAC7B,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEhD,MAAM,eAAe,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACxD,aAAa;IAEb,OAAO;QACL,gBAAgB;QAChB,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,WAAW;QACX,cAAc;QACd,aAAa;QACb,eAAe;QACf,gBAAgB;QAChB,eAAe;QACf,kBAAkB;QAClB,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Utility to wait for loading to complete. Need to add a `data-test` to any
3
+ * loading elements. Defaults to `ll-loading` OR `loading-spinner` if test ID is not specified.
4
+ *
5
+ * @param {string} testId - The data test ID to target
6
+ * @returns {Promise<boolean>} - Will resolve or throw if the loaders stay in the DOM.
7
+ */
8
+ export default function waitForLoadingToFinish(textMatch?: RegExp): Promise<void>;
@@ -0,0 +1,12 @@
1
+ import { screen, waitForElementToBeRemoved } from '@testing-library/vue';
2
+ /**
3
+ * Utility to wait for loading to complete. Need to add a `data-test` to any
4
+ * loading elements. Defaults to `ll-loading` OR `loading-spinner` if test ID is not specified.
5
+ *
6
+ * @param {string} testId - The data test ID to target
7
+ * @returns {Promise<boolean>} - Will resolve or throw if the loaders stay in the DOM.
8
+ */
9
+ export default function waitForLoadingToFinish(textMatch = /ll-loading|loading-spinner/) {
10
+ return waitForElementToBeRemoved(() => [...screen.queryAllByTestId(textMatch)], { timeout: 2000 });
11
+ }
12
+ //# sourceMappingURL=waitForLoadingToFinish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForLoadingToFinish.js","sourceRoot":"src/","sources":["utils/waitForLoadingToFinish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,SAAS,GAAG,4BAA4B;IACrF,OAAO,yBAAyB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC"}
package/package.json CHANGED
@@ -1,13 +1,27 @@
1
1
  {
2
2
  "name": "@leaflink/dom-testing-utils",
3
- "version": "1.3.0",
3
+ "version": "2.1.0",
4
4
  "description": "Frontend DOM testing utilities",
5
5
  "engines": {
6
6
  "node": ">=16",
7
7
  "npm": ">=8"
8
8
  },
9
9
  "exports": {
10
- ".": "./dist/index.js"
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./setup-env": {
16
+ "types": "./dist/setup-env.d.ts",
17
+ "import": "./dist/setup-env.js",
18
+ "default": "./dist/setup-env.js"
19
+ },
20
+ "./global-env": {
21
+ "types": "./dist/global-env.d.ts",
22
+ "import": "./dist/global-env.js",
23
+ "default": "./dist/global-env.js"
24
+ }
11
25
  },
12
26
  "type": "module",
13
27
  "types": "./dist/index.d.ts",
@@ -19,39 +33,32 @@
19
33
  ],
20
34
  "scripts": {
21
35
  "build": "tsc",
36
+ "fix": "npm run lint -- --fix",
37
+ "lint": "eslint .",
22
38
  "lint:commits": "commitlint",
23
39
  "test": "vitest --reporter verbose"
24
40
  },
25
41
  "license": "MIT",
26
- "devDependencies": {
27
- "@commitlint/cli": "^17.4.4",
28
- "@commitlint/config-conventional": "^17.4.4",
29
- "@vitest/coverage-c8": "^0.29.2",
30
- "jsdom": "^21.1.1",
31
- "typescript": "^4.9.5",
32
- "vite": "^4.1.4",
33
- "vitest": "^0.29.3"
34
- },
35
- "commitlint": {
36
- "extends": [
37
- "@commitlint/config-conventional"
38
- ],
39
- "rules": {
40
- "scope-case": [
41
- 0
42
- ],
43
- "body-max-line-length": [
44
- 0
45
- ]
46
- }
47
- },
48
42
  "dependencies": {
49
- "@testing-library/cypress": "^9.0.0",
50
- "@testing-library/jest-dom": "^5.16.5",
51
- "@testing-library/user-event": "^14.4.3",
43
+ "@testing-library/jest-dom": "^6.1.3",
44
+ "@testing-library/user-event": "^14.5.1",
52
45
  "@testing-library/vue": "^7.0.0",
53
46
  "@types/segment-analytics": "^0.0.34",
54
47
  "eslint-plugin-testing-library": "^5.10.2",
55
48
  "msw": "^0.27.2"
49
+ },
50
+ "devDependencies": {
51
+ "@vitest/coverage-v8": "^0.34.5",
52
+ "eslint": "^8.49.0",
53
+ "eslint-config-leaflink": "^1.17.0",
54
+ "jsdom": "^22.1.0",
55
+ "typescript": "^5.2.2",
56
+ "vite": "^4.4.9",
57
+ "vitest": "^0.34.5"
58
+ },
59
+ "eslintConfig": {
60
+ "extends": [
61
+ "leaflink"
62
+ ]
56
63
  }
57
64
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"mockEndpoints.js","sourceRoot":"src/","sources":["api/mockEndpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,IAAI,GAGL,MAAM,KAAK,CAAC;AAKb,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAsB,EAAE,EAAE;IAC3D;;OAEG;IACH,MAAM,gBAAgB,GAAG,CACvB,WAAmB,EACnB,YAA0B,EAC1B,MAAkB,EAClB,EAAE;QACF,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3C,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,YAAY,GAAG,CAKnB,WAAmB,EACnB,gBAIC,EACD,MAAkB,EAClB,EAAE;QACF,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,gBAAgB,GACpB,CAAC,MAAkB,EAAE,EAAE,CACvB,CACE,WAAmB,EACnB,YAA0B,EAC1B,EAAE;QACF,OAAO,gBAAgB,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEJ;;;OAGG;IACH,MAAM,oBAAoB,GACxB,CAAC,MAAkB,EAAE,EAAE,CACvB,CAKE,WAAmB,EACnB,gBAIC,EACD,EAAE;QACF,OAAO,YAAY,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEJ,6BAA6B;IAC7B,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEhD,MAAM,eAAe,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACxD,aAAa;IAEb,OAAO;QACL,gBAAgB;QAChB,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,WAAW;QACX,cAAc;QACd,aAAa;QACb,eAAe;QACf,gBAAgB;QAChB,eAAe;QACf,kBAAkB;QAClB,iBAAiB;KAClB,CAAC;AACJ,CAAC,CAAC"}
@@ -1,58 +0,0 @@
1
- import { render } from '@testing-library/vue';
2
- import { createFixtureGenerator, getByDescriptionTerm, getAllByDescriptionTerm } from "./index";
3
- describe('createFixtureGenerator()', () => {
4
- it('returns a function that can generate an array of data objects', () => {
5
- const generator = (overrides) => ({
6
- foo: 'bar',
7
- bar: 'baz',
8
- ...overrides,
9
- });
10
- expect(createFixtureGenerator(generator)(5)).toEqual([
11
- { foo: 'bar', bar: 'baz' },
12
- { foo: 'bar', bar: 'baz' },
13
- { foo: 'bar', bar: 'baz' },
14
- { foo: 'bar', bar: 'baz' },
15
- { foo: 'bar', bar: 'baz' },
16
- ]);
17
- expect(createFixtureGenerator(generator)(3, { bar: 'yak' })).toEqual([
18
- { foo: 'bar', bar: 'yak' },
19
- { foo: 'bar', bar: 'yak' },
20
- { foo: 'bar', bar: 'yak' },
21
- ]);
22
- });
23
- it('returns a function that can generate a single data object', () => {
24
- const generator = (overrides) => ({
25
- foo: 'bar',
26
- bar: 'baz',
27
- ...overrides,
28
- });
29
- expect(createFixtureGenerator(generator)()).toEqual({ foo: 'bar', bar: 'baz' });
30
- expect(createFixtureGenerator(generator)({ bar: 'yak' })).toEqual({ foo: 'bar', bar: 'yak' });
31
- });
32
- });
33
- describe('getByDescriptionTerm', () => {
34
- it.each `
35
- term | type
36
- ${'foo'} | ${'string'}
37
- ${/foo/i} | ${'regex'}
38
- ${new RegExp('foo', 'i')} | ${'RegExp'}
39
- `('should return the description detail for a given $type term', ({ term }) => {
40
- render({ template: `<dl><dt>foo</dt><dd>bar</dd></dl>` });
41
- expect(getByDescriptionTerm(term)).toHaveTextContent('bar');
42
- });
43
- });
44
- describe('getAllByDescriptionTerm', () => {
45
- it.each `
46
- term | type
47
- ${'foo'} | ${'string'}
48
- ${/foo/i} | ${'regex'}
49
- ${new RegExp('foo', 'i')} | ${'RegExp'}
50
- `('should return the description details for a given $type term', ({ term }) => {
51
- render({ template: `<dl><dt>foo</dt><dd>bar1</dd></dl><dl><dt>foo</dt><dd>bar2</dd></dl>` });
52
- const details = getAllByDescriptionTerm(term);
53
- expect(details).toHaveLength(2);
54
- expect(details[0]).toHaveTextContent('bar1');
55
- expect(details[1]).toHaveTextContent('bar2');
56
- });
57
- });
58
- //# sourceMappingURL=index.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.spec.js","sourceRoot":"src/","sources":["index.spec.ts"],"names":[],"mappings":"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"}