@backstage/plugin-techdocs-addons-test-utils 1.1.3-next.0 → 2.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/CHANGELOG.md CHANGED
@@ -1,5 +1,66 @@
1
1
  # @backstage/plugin-techdocs-addons-test-utils
2
2
 
3
+ ## 2.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 8d6709e: **BREAKING**: `TechDocsAddonTester.renderWithEffects()` no longer returns a screen; this means that you can no longer grab assertions such as `getByText` from its return value.
8
+
9
+ Newer versions of `@testing-library` recommends using the `screen` export for assertions - and removing this from the addon tester contract allows us to more freely iterate on which underlying version of the testing library is being used.
10
+
11
+ One notable effect of this, however, is that the `@testing-library` `screen` does NOT support assertions on the shadow DOM, which techdocs relies on. You will therefore want to add a dependency on [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/) in your tests, and using its `screen` and its dedicated `*Shadow*` methods. As an example, if you keep doing `getByText` you will not get matches inside the shadow DOM - switch to `getByShadowText` instead.
12
+
13
+ ```ts
14
+ import { screen } from 'shadow-dom-testing-library';
15
+
16
+ // ... render the addon ...
17
+ await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])
18
+ .withDom(<body>TEST_CONTENT</body>)
19
+ .renderWithEffects();
20
+
21
+ expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
22
+ ```
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies
27
+ - @backstage/core-app-api@1.19.3
28
+ - @backstage/plugin-techdocs@1.16.1
29
+ - @backstage/plugin-catalog@1.32.1
30
+ - @backstage/plugin-catalog-react@1.21.4
31
+ - @backstage/plugin-search-react@1.10.1
32
+ - @backstage/test-utils@1.7.14
33
+ - @backstage/core-plugin-api@1.12.1
34
+ - @backstage/integration-react@1.2.13
35
+ - @backstage/plugin-techdocs-react@1.3.6
36
+
37
+ ## 2.0.0-next.1
38
+
39
+ ### Major Changes
40
+
41
+ - 8d6709e: **BREAKING**: `TechDocsAddonTester.renderWithEffects()` no longer returns a screen; this means that you can no longer grab assertions such as `getByText` from its return value.
42
+
43
+ Newer versions of `@testing-library` recommends using the `screen` export for assertions - and removing this from the addon tester contract allows us to more freely iterate on which underlying version of the testing library is being used.
44
+
45
+ One notable effect of this, however, is that the `@testing-library` `screen` does NOT support assertions on the shadow DOM, which techdocs relies on. You will therefore want to add a dependency on [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/) in your tests, and using its `screen` and its dedicated `*Shadow*` methods. As an example, if you keep doing `getByText` you will not get matches inside the shadow DOM - switch to `getByShadowText` instead.
46
+
47
+ ```ts
48
+ import { screen } from 'shadow-dom-testing-library';
49
+
50
+ // ... render the addon ...
51
+ await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])
52
+ .withDom(<body>TEST_CONTENT</body>)
53
+ .renderWithEffects();
54
+
55
+ expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
56
+ ```
57
+
58
+ ### Patch Changes
59
+
60
+ - Updated dependencies
61
+ - @backstage/plugin-catalog-react@1.21.4-next.1
62
+ - @backstage/plugin-techdocs@1.16.1-next.1
63
+
3
64
  ## 1.1.3-next.0
4
65
 
5
66
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import * as react from 'react';
2
2
  import { ReactElement } from 'react';
3
- import { screen } from 'testing-library__dom';
4
3
  import { ApiRef } from '@backstage/core-plugin-api';
5
4
  import { TechDocsMetadata, TechDocsEntityMetadata } from '@backstage/plugin-techdocs-react';
6
5
 
@@ -64,6 +63,25 @@ declare class TechDocsAddonTester {
64
63
  * Render the Addon within a fully configured and mocked TechDocs reader.
65
64
  *
66
65
  * @remarks
66
+ *
67
+ * Note that to make assertions on the shadow dom, add a dependency on
68
+ * [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/)
69
+ * and use its screen as follows:
70
+ *
71
+ * ```ts
72
+ * import { screen } from 'shadow-dom-testing-library';
73
+ *
74
+ * // ... render the addon ...
75
+ * await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])
76
+ * .withDom(<body>TEST_CONTENT</body>)
77
+ * .renderWithEffects();
78
+ *
79
+ * expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
80
+ * ```
81
+ *
82
+ * For items outside of the shadow dom, you can still use the regular screen
83
+ * from `@testing-library/react`.
84
+ *
67
85
  * Components using useEffect to perform an asynchronous action (such as
68
86
  * fetch) must be rendered within an async act call to properly get the final
69
87
  * state, even with mocked responses. This utility method makes the signature
@@ -73,7 +91,7 @@ declare class TechDocsAddonTester {
73
91
  * @see https://github.com/testing-library/react-testing-library/issues/281
74
92
  * @see https://github.com/facebook/react/pull/14853
75
93
  */
76
- renderWithEffects(): Promise<typeof screen & {
94
+ renderWithEffects(): Promise<{
77
95
  shadowRoot: ShadowRoot | null;
78
96
  }>;
79
97
  }
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { cloneElement } from 'react';
3
- import { screen } from 'testing-library__dom';
3
+ import { screen } from 'shadow-dom-testing-library';
4
4
  import { Route } from 'react-router-dom';
5
5
  import { act, render } from '@testing-library/react';
6
6
  import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils';
@@ -204,6 +204,25 @@ class TechDocsAddonTester {
204
204
  * Render the Addon within a fully configured and mocked TechDocs reader.
205
205
  *
206
206
  * @remarks
207
+ *
208
+ * Note that to make assertions on the shadow dom, add a dependency on
209
+ * [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/)
210
+ * and use its screen as follows:
211
+ *
212
+ * ```ts
213
+ * import { screen } from 'shadow-dom-testing-library';
214
+ *
215
+ * // ... render the addon ...
216
+ * await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])
217
+ * .withDom(<body>TEST_CONTENT</body>)
218
+ * .renderWithEffects();
219
+ *
220
+ * expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
221
+ * ```
222
+ *
223
+ * For items outside of the shadow dom, you can still use the regular screen
224
+ * from `@testing-library/react`.
225
+ *
207
226
  * Components using useEffect to perform an asynchronous action (such as
208
227
  * fetch) must be rendered within an async act call to properly get the final
209
228
  * state, even with mocked responses. This utility method makes the signature
@@ -217,9 +236,10 @@ class TechDocsAddonTester {
217
236
  await act(async () => {
218
237
  render(this.build());
219
238
  });
220
- const shadowHost = await screen.findByTestId("techdocs-native-shadowroot");
239
+ const shadowHost = await screen.findByShadowTestId(
240
+ "techdocs-native-shadowroot"
241
+ );
221
242
  return {
222
- ...screen,
223
243
  shadowRoot: shadowHost?.shadowRoot || null
224
244
  };
225
245
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test-utils.esm.js","sources":["../src/test-utils.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { cloneElement, ReactElement } from 'react';\n\n// Shadow DOM support for the simple and complete DOM testing utilities\n// https://github.com/testing-library/dom-testing-library/issues/742#issuecomment-674987855\nimport { screen } from 'testing-library__dom';\nimport { Route } from 'react-router-dom';\nimport { act, render } from '@testing-library/react';\n\nimport { wrapInTestApp, TestApiProvider } from '@backstage/test-utils';\nimport { FlatRoutes } from '@backstage/core-app-api';\nimport {\n ApiRef,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\n\nimport {\n TechDocsAddons,\n techdocsApiRef,\n TechDocsEntityMetadata,\n TechDocsMetadata,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\nimport { TechDocsReaderPage, techdocsPlugin } from '@backstage/plugin-techdocs';\nimport {\n catalogApiRef,\n EntityPresentationApi,\n entityPresentationApiRef,\n entityRouteRef,\n} from '@backstage/plugin-catalog-react';\nimport { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils';\nimport { searchApiRef } from '@backstage/plugin-search-react';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\n\n// Since React 18 react-dom/server eagerly uses TextEncoder, so lazy load and make it available globally first\nif (!global.TextEncoder) {\n global.TextEncoder = require('util').TextEncoder;\n}\nconst { renderToStaticMarkup } =\n require('react-dom/server') as typeof import('react-dom/server');\n\n/** @ignore */\ntype TechDocsAddonTesterTestApiPair<TApi> = TApi extends infer TImpl\n ? readonly [ApiRef<TApi>, Partial<TImpl>]\n : never;\n\n/** @ignore */\ntype TechdocsAddonTesterApis<TApiPairs> = {\n [TIndex in keyof TApiPairs]: TechDocsAddonTesterTestApiPair<\n TApiPairs[TIndex]\n >;\n};\n\ntype TechDocsAddonTesterOptions = {\n dom: ReactElement;\n entity: Partial<TechDocsEntityMetadata>;\n metadata: Partial<TechDocsMetadata>;\n componentId: string;\n apis: TechdocsAddonTesterApis<any[]>;\n path: string;\n};\n\nconst defaultOptions: TechDocsAddonTesterOptions = {\n dom: <></>,\n entity: { metadata: { name: '' } },\n metadata: {},\n componentId: 'docs',\n apis: [],\n path: '',\n};\n\nconst defaultMetadata = {\n site_name: 'Tech Docs',\n site_description: 'Tech Docs',\n};\n\nconst defaultEntity = {\n kind: 'Component',\n metadata: { namespace: 'default', name: 'docs' },\n};\n\nconst defaultDom = (\n <html lang=\"en\">\n <head />\n <body>\n <div data-md-component=\"container\">\n <div data-md-component=\"navigation\" />\n <div data-md-component=\"toc\" />\n <div data-md-component=\"main\" />\n </div>\n </body>\n </html>\n);\n\n/**\n * Utility class for rendering TechDocs Addons end-to-end within the TechDocs\n * reader page, with a set of givens (e.g. page DOM, metadata, etc).\n *\n * @example\n * ```tsx\n * const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])\n * .withDom(<body>TEST_CONTENT</body>)\n * .renderWithEffects();\n *\n * expect(getByText('TEST_CONTENT')).toBeInTheDocument();\n * ```\n *\n * @public\n */\nexport class TechDocsAddonTester {\n private options: TechDocsAddonTesterOptions = defaultOptions;\n private addons: ReactElement[];\n\n /**\n * Get a TechDocsAddonTester instance for a given set of Addons.\n */\n static buildAddonsInTechDocs(addons: ReactElement[]) {\n return new TechDocsAddonTester(addons);\n }\n\n // Protected in order to allow extension but not direct instantiation.\n protected constructor(addons: ReactElement[]) {\n this.addons = addons;\n }\n\n /**\n * Provide mock API implementations if your Addon expects any.\n */\n withApis<T extends any[]>(apis: TechdocsAddonTesterApis<T>) {\n const refs = apis.map(([ref]) => ref);\n this.options.apis = this.options.apis\n .filter(([ref]) => !refs.includes(ref))\n .concat(apis);\n return this;\n }\n\n /**\n * Provide mock HTML if your Addon expects it in the shadow DOM.\n */\n withDom(dom: ReactElement) {\n this.options.dom = dom;\n return this;\n }\n\n /**\n * Provide mock techdocs_metadata.json values if your Addon needs it.\n */\n withMetadata(metadata: Partial<TechDocsMetadata>) {\n this.options.metadata = metadata;\n return this;\n }\n\n /**\n * Provide a mock entity if your Addon needs it. This also controls the base\n * path at which the Addon is rendered.\n */\n withEntity(entity: Partial<TechDocsEntityMetadata>) {\n this.options.entity = entity;\n return this;\n }\n\n /**\n * Provide the TechDocs page path at which the Addon is rendered (e.g. the\n * part of the path after the entity namespace/kind/name).\n */\n atPath(path: string) {\n this.options.path = path;\n return this;\n }\n\n /**\n * Return a fully configured and mocked TechDocs reader page within a test\n * App instance, using the given Addon(s).\n */\n build() {\n const techdocsApi = {\n getTechDocsMetadata: jest.fn(),\n getEntityMetadata: jest.fn(),\n getCookie: jest.fn().mockReturnValue({\n // Expires in 10 minutes\n expiresAt: new Date(Date.now() + 10 * 60 * 1000).toISOString(),\n }),\n };\n\n const techdocsStorageApi = {\n getApiOrigin: jest.fn(),\n getBaseUrl: jest.fn(),\n getEntityDocs: jest.fn(),\n syncEntityDocs: jest.fn(),\n };\n\n const searchApi = {\n query: jest.fn().mockResolvedValue({ results: [] }),\n };\n\n const scmIntegrationsApi = {\n fromConfig: jest.fn().mockReturnValue({}),\n };\n\n const discoveryApi = {\n getBaseUrl: jest\n .fn()\n .mockResolvedValue('https://backstage.example.com/api/techdocs'),\n };\n\n const fetchApi = {\n fetch: jest.fn().mockResolvedValue({\n ok: true,\n json: jest.fn().mockResolvedValue({\n // Expires in 10 minutes\n expiresAt: new Date(Date.now() + 10 * 60 * 1000).toISOString(),\n }),\n }),\n };\n\n const entityPresentationApi: EntityPresentationApi = {\n forEntity: jest.fn().mockReturnValue({\n snapshot: {\n primaryTitle: 'Test Entity',\n },\n }),\n };\n\n const catalogApi = catalogApiMock({\n entities: [\n {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Component',\n metadata: { namespace: 'default', name: 'docs' },\n },\n ],\n });\n\n const apis: TechdocsAddonTesterApis<any[]> = [\n [fetchApiRef, fetchApi],\n [catalogApiRef, catalogApi],\n [entityPresentationApiRef, entityPresentationApi],\n [discoveryApiRef, discoveryApi],\n [techdocsApiRef, techdocsApi],\n [techdocsStorageApiRef, techdocsStorageApi],\n [searchApiRef, searchApi],\n [scmIntegrationsApiRef, scmIntegrationsApi],\n ...this.options.apis,\n ];\n\n const entityName = {\n namespace:\n this.options.entity?.metadata?.namespace ||\n defaultEntity.metadata.namespace,\n kind: this.options.entity?.kind || defaultEntity.kind,\n name: this.options.entity?.metadata?.name || defaultEntity.metadata.name,\n };\n\n techdocsApi.getTechDocsMetadata.mockReturnValue(\n this.options.metadata || { ...defaultMetadata },\n );\n techdocsApi.getEntityMetadata.mockResolvedValue(\n this.options.entity || { ...defaultEntity },\n );\n\n techdocsStorageApi.syncEntityDocs.mockResolvedValue('cached');\n techdocsStorageApi.getApiOrigin.mockResolvedValue(\n 'https://backstage.example.com/api/techdocs',\n );\n techdocsStorageApi.getBaseUrl.mockResolvedValue(\n `https://backstage.example.com/api/techdocs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,\n );\n techdocsStorageApi.getEntityDocs.mockResolvedValue(\n renderToStaticMarkup(this.options.dom || defaultDom),\n );\n\n const TechDocsAddonsPage = () => {\n return (\n <TestApiProvider apis={apis}>\n <FlatRoutes>\n <Route\n path=\"/docs/:namespace/:kind/:name/*\"\n element={<TechDocsReaderPage />}\n >\n <TechDocsAddons>\n {this.addons.map((addon, index) =>\n cloneElement(addon, { key: index }),\n )}\n </TechDocsAddons>\n </Route>\n </FlatRoutes>\n </TestApiProvider>\n );\n };\n\n return wrapInTestApp(<TechDocsAddonsPage />, {\n routeEntries: [\n `/docs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,\n ],\n mountedRoutes: {\n '/docs': techdocsPlugin.routes.root,\n '/docs/:namespace/:kind/:name/*': techdocsPlugin.routes.docRoot,\n '/catalog/:namespace/:kind/:name': entityRouteRef,\n },\n });\n }\n\n /**\n * Render the Addon within a fully configured and mocked TechDocs reader.\n *\n * @remarks\n * Components using useEffect to perform an asynchronous action (such as\n * fetch) must be rendered within an async act call to properly get the final\n * state, even with mocked responses. This utility method makes the signature\n * a bit cleaner, since act doesn't return the result of the evaluated\n * function.\n *\n * @see https://github.com/testing-library/react-testing-library/issues/281\n * @see https://github.com/facebook/react/pull/14853\n */\n async renderWithEffects(): Promise<\n typeof screen & { shadowRoot: ShadowRoot | null }\n > {\n await act(async () => {\n render(this.build());\n });\n\n const shadowHost = await screen.findByTestId('techdocs-native-shadowroot');\n\n return {\n ...screen,\n shadowRoot: shadowHost?.shadowRoot || null,\n };\n }\n}\n\nexport default TechDocsAddonTester.buildAddonsInTechDocs;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAmDA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,EAAA,MAAA,CAAO,WAAA,GAAc,OAAA,CAAQ,MAAM,CAAA,CAAE,WAAA;AACvC;AACA,MAAM,EAAE,oBAAA,EAAqB,GAC3B,OAAA,CAAQ,kBAAkB,CAAA;AAuB5B,MAAM,cAAA,GAA6C;AAAA,EACjD,qBAAK,GAAA,CAAA,QAAA,EAAA,EAAE,CAAA;AAAA,EACP,QAAQ,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,IAAG,EAAE;AAAA,EACjC,UAAU,EAAC;AAAA,EACX,WAAA,EAAa,MAAA;AAAA,EACb,MAAM,EAAC;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAEA,MAAM,eAAA,GAAkB;AAAA,EACtB,SAAA,EAAW,WAAA;AAAA,EACX,gBAAA,EAAkB;AACpB,CAAA;AAEA,MAAM,aAAA,GAAgB;AAAA,EACpB,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU,EAAE,SAAA,EAAW,SAAA,EAAW,MAAM,MAAA;AAC1C,CAAA;AAEA,MAAM,UAAA,mBACJ,IAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EACT,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA;AAAA,kBACN,GAAA,CAAC,MAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,qBAAkB,WAAA,EACrB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,qBAAkB,YAAA,EAAa,CAAA;AAAA,oBACpC,GAAA,CAAC,KAAA,EAAA,EAAI,mBAAA,EAAkB,KAAA,EAAM,CAAA;AAAA,oBAC7B,GAAA,CAAC,KAAA,EAAA,EAAI,mBAAA,EAAkB,MAAA,EAAO;AAAA,GAAA,EAChC,CAAA,EACF;AAAA,CAAA,EACF,CAAA;AAkBK,MAAM,mBAAA,CAAoB;AAAA,EACvB,OAAA,GAAsC,cAAA;AAAA,EACtC,MAAA;AAAA;AAAA;AAAA;AAAA,EAKR,OAAO,sBAAsB,MAAA,EAAwB;AACnD,IAAA,OAAO,IAAI,oBAAoB,MAAM,CAAA;AAAA,EACvC;AAAA;AAAA,EAGU,YAAY,MAAA,EAAwB;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,SAA0B,IAAA,EAAkC;AAC1D,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAA;AACpC,IAAA,IAAA,CAAK,QAAQ,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAC9B,OAAO,CAAC,CAAC,GAAG,CAAA,KAAM,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA,CACrC,OAAO,IAAI,CAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAA,EAAmB;AACzB,IAAA,IAAA,CAAK,QAAQ,GAAA,GAAM,GAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,EAAqC;AAChD,IAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,QAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,MAAA,EAAyC;AAClD,IAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,MAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,IAAA,EAAc;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,GAAO,IAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAQ;AACN,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,mBAAA,EAAqB,KAAK,EAAA,EAAG;AAAA,MAC7B,iBAAA,EAAmB,KAAK,EAAA,EAAG;AAAA,MAC3B,SAAA,EAAW,IAAA,CAAK,EAAA,EAAG,CAAE,eAAA,CAAgB;AAAA;AAAA,QAEnC,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY,OAC9D;AAAA,KACH;AAEA,IAAA,MAAM,kBAAA,GAAqB;AAAA,MACzB,YAAA,EAAc,KAAK,EAAA,EAAG;AAAA,MACtB,UAAA,EAAY,KAAK,EAAA,EAAG;AAAA,MACpB,aAAA,EAAe,KAAK,EAAA,EAAG;AAAA,MACvB,cAAA,EAAgB,KAAK,EAAA;AAAG,KAC1B;AAEA,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,KAAA,EAAO,KAAK,EAAA,EAAG,CAAE,kBAAkB,EAAE,OAAA,EAAS,EAAC,EAAG;AAAA,KACpD;AAEA,IAAA,MAAM,kBAAA,GAAqB;AAAA,MACzB,YAAY,IAAA,CAAK,EAAA,EAAG,CAAE,eAAA,CAAgB,EAAE;AAAA,KAC1C;AAEA,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,UAAA,EAAY,IAAA,CACT,EAAA,EAAG,CACH,kBAAkB,4CAA4C;AAAA,KACnE;AAEA,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,KAAA,EAAO,IAAA,CAAK,EAAA,EAAG,CAAE,iBAAA,CAAkB;AAAA,QACjC,EAAA,EAAI,IAAA;AAAA,QACJ,IAAA,EAAM,IAAA,CAAK,EAAA,EAAG,CAAE,iBAAA,CAAkB;AAAA;AAAA,UAEhC,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY,SAC9D;AAAA,OACF;AAAA,KACH;AAEA,IAAA,MAAM,qBAAA,GAA+C;AAAA,MACnD,SAAA,EAAW,IAAA,CAAK,EAAA,EAAG,CAAE,eAAA,CAAgB;AAAA,QACnC,QAAA,EAAU;AAAA,UACR,YAAA,EAAc;AAAA;AAChB,OACD;AAAA,KACH;AAEA,IAAA,MAAM,aAAa,cAAA,CAAe;AAAA,MAChC,QAAA,EAAU;AAAA,QACR;AAAA,UACE,UAAA,EAAY,uBAAA;AAAA,UACZ,IAAA,EAAM,WAAA;AAAA,UACN,QAAA,EAAU,EAAE,SAAA,EAAW,SAAA,EAAW,MAAM,MAAA;AAAO;AACjD;AACF,KACD,CAAA;AAED,IAAA,MAAM,IAAA,GAAuC;AAAA,MAC3C,CAAC,aAAa,QAAQ,CAAA;AAAA,MACtB,CAAC,eAAe,UAAU,CAAA;AAAA,MAC1B,CAAC,0BAA0B,qBAAqB,CAAA;AAAA,MAChD,CAAC,iBAAiB,YAAY,CAAA;AAAA,MAC9B,CAAC,gBAAgB,WAAW,CAAA;AAAA,MAC5B,CAAC,uBAAuB,kBAAkB,CAAA;AAAA,MAC1C,CAAC,cAAc,SAAS,CAAA;AAAA,MACxB,CAAC,uBAAuB,kBAAkB,CAAA;AAAA,MAC1C,GAAG,KAAK,OAAA,CAAQ;AAAA,KAClB;AAEA,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,WACE,IAAA,CAAK,OAAA,CAAQ,QAAQ,QAAA,EAAU,SAAA,IAC/B,cAAc,QAAA,CAAS,SAAA;AAAA,MACzB,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,QAAQ,aAAA,CAAc,IAAA;AAAA,MACjD,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,QAAA,EAAU,IAAA,IAAQ,cAAc,QAAA,CAAS;AAAA,KACtE;AAEA,IAAA,WAAA,CAAY,mBAAA,CAAoB,eAAA;AAAA,MAC9B,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,EAAE,GAAG,eAAA;AAAgB,KAChD;AACA,IAAA,WAAA,CAAY,iBAAA,CAAkB,iBAAA;AAAA,MAC5B,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,EAAE,GAAG,aAAA;AAAc,KAC5C;AAEA,IAAA,kBAAA,CAAmB,cAAA,CAAe,kBAAkB,QAAQ,CAAA;AAC5D,IAAA,kBAAA,CAAmB,YAAA,CAAa,iBAAA;AAAA,MAC9B;AAAA,KACF;AACA,IAAA,kBAAA,CAAmB,UAAA,CAAW,iBAAA;AAAA,MAC5B,CAAA,2CAAA,EAA8C,UAAA,CAAW,SAAS,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAAA,KAC/H;AACA,IAAA,kBAAA,CAAmB,aAAA,CAAc,iBAAA;AAAA,MAC/B,oBAAA,CAAqB,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,UAAU;AAAA,KACrD;AAEA,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,uBACE,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EACf,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,gCAAA;AAAA,UACL,OAAA,sBAAU,kBAAA,EAAA,EAAmB,CAAA;AAAA,UAE7B,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,YAAI,CAAC,OAAO,KAAA,KACvB,YAAA,CAAa,OAAO,EAAE,GAAA,EAAK,OAAO;AAAA,WACpC,EACF;AAAA;AAAA,SAEJ,CAAA,EACF,CAAA;AAAA,IAEJ,CAAA;AAEA,IAAA,OAAO,aAAA,iBAAc,GAAA,CAAC,kBAAA,EAAA,EAAmB,CAAA,EAAI;AAAA,MAC3C,YAAA,EAAc;AAAA,QACZ,CAAA,MAAA,EAAS,UAAA,CAAW,SAAS,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAAA,OAC1F;AAAA,MACA,aAAA,EAAe;AAAA,QACb,OAAA,EAAS,eAAe,MAAA,CAAO,IAAA;AAAA,QAC/B,gCAAA,EAAkC,eAAe,MAAA,CAAO,OAAA;AAAA,QACxD,iCAAA,EAAmC;AAAA;AACrC,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,iBAAA,GAEJ;AACA,IAAA,MAAM,IAAI,YAAY;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,IACrB,CAAC,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,YAAA,CAAa,4BAA4B,CAAA;AAEzE,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,UAAA,EAAY,YAAY,UAAA,IAAc;AAAA,KACxC;AAAA,EACF;AACF;AAEe,mBAAA,CAAoB,qBAAA;;;;"}
1
+ {"version":3,"file":"test-utils.esm.js","sources":["../src/test-utils.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { cloneElement, ReactElement } from 'react';\n\n// Shadow DOM support for the simple and complete DOM testing utilities\n// https://github.com/testing-library/dom-testing-library/issues/742#issuecomment-674987855\nimport { screen } from 'shadow-dom-testing-library';\nimport { Route } from 'react-router-dom';\nimport { act, render } from '@testing-library/react';\n\nimport { wrapInTestApp, TestApiProvider } from '@backstage/test-utils';\nimport { FlatRoutes } from '@backstage/core-app-api';\nimport {\n ApiRef,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\n\nimport {\n TechDocsAddons,\n techdocsApiRef,\n TechDocsEntityMetadata,\n TechDocsMetadata,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\nimport { TechDocsReaderPage, techdocsPlugin } from '@backstage/plugin-techdocs';\nimport {\n catalogApiRef,\n EntityPresentationApi,\n entityPresentationApiRef,\n entityRouteRef,\n} from '@backstage/plugin-catalog-react';\nimport { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils';\nimport { searchApiRef } from '@backstage/plugin-search-react';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\n\n// Since React 18 react-dom/server eagerly uses TextEncoder, so lazy load and make it available globally first\nif (!global.TextEncoder) {\n global.TextEncoder = require('util').TextEncoder;\n}\nconst { renderToStaticMarkup } =\n require('react-dom/server') as typeof import('react-dom/server');\n\n/** @ignore */\ntype TechDocsAddonTesterTestApiPair<TApi> = TApi extends infer TImpl\n ? readonly [ApiRef<TApi>, Partial<TImpl>]\n : never;\n\n/** @ignore */\ntype TechdocsAddonTesterApis<TApiPairs> = {\n [TIndex in keyof TApiPairs]: TechDocsAddonTesterTestApiPair<\n TApiPairs[TIndex]\n >;\n};\n\ntype TechDocsAddonTesterOptions = {\n dom: ReactElement;\n entity: Partial<TechDocsEntityMetadata>;\n metadata: Partial<TechDocsMetadata>;\n componentId: string;\n apis: TechdocsAddonTesterApis<any[]>;\n path: string;\n};\n\nconst defaultOptions: TechDocsAddonTesterOptions = {\n dom: <></>,\n entity: { metadata: { name: '' } },\n metadata: {},\n componentId: 'docs',\n apis: [],\n path: '',\n};\n\nconst defaultMetadata = {\n site_name: 'Tech Docs',\n site_description: 'Tech Docs',\n};\n\nconst defaultEntity = {\n kind: 'Component',\n metadata: { namespace: 'default', name: 'docs' },\n};\n\nconst defaultDom = (\n <html lang=\"en\">\n <head />\n <body>\n <div data-md-component=\"container\">\n <div data-md-component=\"navigation\" />\n <div data-md-component=\"toc\" />\n <div data-md-component=\"main\" />\n </div>\n </body>\n </html>\n);\n\n/**\n * Utility class for rendering TechDocs Addons end-to-end within the TechDocs\n * reader page, with a set of givens (e.g. page DOM, metadata, etc).\n *\n * @example\n * ```tsx\n * const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])\n * .withDom(<body>TEST_CONTENT</body>)\n * .renderWithEffects();\n *\n * expect(getByText('TEST_CONTENT')).toBeInTheDocument();\n * ```\n *\n * @public\n */\nexport class TechDocsAddonTester {\n private options: TechDocsAddonTesterOptions = defaultOptions;\n private addons: ReactElement[];\n\n /**\n * Get a TechDocsAddonTester instance for a given set of Addons.\n */\n static buildAddonsInTechDocs(addons: ReactElement[]) {\n return new TechDocsAddonTester(addons);\n }\n\n // Protected in order to allow extension but not direct instantiation.\n protected constructor(addons: ReactElement[]) {\n this.addons = addons;\n }\n\n /**\n * Provide mock API implementations if your Addon expects any.\n */\n withApis<T extends any[]>(apis: TechdocsAddonTesterApis<T>) {\n const refs = apis.map(([ref]) => ref);\n this.options.apis = this.options.apis\n .filter(([ref]) => !refs.includes(ref))\n .concat(apis);\n return this;\n }\n\n /**\n * Provide mock HTML if your Addon expects it in the shadow DOM.\n */\n withDom(dom: ReactElement) {\n this.options.dom = dom;\n return this;\n }\n\n /**\n * Provide mock techdocs_metadata.json values if your Addon needs it.\n */\n withMetadata(metadata: Partial<TechDocsMetadata>) {\n this.options.metadata = metadata;\n return this;\n }\n\n /**\n * Provide a mock entity if your Addon needs it. This also controls the base\n * path at which the Addon is rendered.\n */\n withEntity(entity: Partial<TechDocsEntityMetadata>) {\n this.options.entity = entity;\n return this;\n }\n\n /**\n * Provide the TechDocs page path at which the Addon is rendered (e.g. the\n * part of the path after the entity namespace/kind/name).\n */\n atPath(path: string) {\n this.options.path = path;\n return this;\n }\n\n /**\n * Return a fully configured and mocked TechDocs reader page within a test\n * App instance, using the given Addon(s).\n */\n build() {\n const techdocsApi = {\n getTechDocsMetadata: jest.fn(),\n getEntityMetadata: jest.fn(),\n getCookie: jest.fn().mockReturnValue({\n // Expires in 10 minutes\n expiresAt: new Date(Date.now() + 10 * 60 * 1000).toISOString(),\n }),\n };\n\n const techdocsStorageApi = {\n getApiOrigin: jest.fn(),\n getBaseUrl: jest.fn(),\n getEntityDocs: jest.fn(),\n syncEntityDocs: jest.fn(),\n };\n\n const searchApi = {\n query: jest.fn().mockResolvedValue({ results: [] }),\n };\n\n const scmIntegrationsApi = {\n fromConfig: jest.fn().mockReturnValue({}),\n };\n\n const discoveryApi = {\n getBaseUrl: jest\n .fn()\n .mockResolvedValue('https://backstage.example.com/api/techdocs'),\n };\n\n const fetchApi = {\n fetch: jest.fn().mockResolvedValue({\n ok: true,\n json: jest.fn().mockResolvedValue({\n // Expires in 10 minutes\n expiresAt: new Date(Date.now() + 10 * 60 * 1000).toISOString(),\n }),\n }),\n };\n\n const entityPresentationApi: EntityPresentationApi = {\n forEntity: jest.fn().mockReturnValue({\n snapshot: {\n primaryTitle: 'Test Entity',\n },\n }),\n };\n\n const catalogApi = catalogApiMock({\n entities: [\n {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'Component',\n metadata: { namespace: 'default', name: 'docs' },\n },\n ],\n });\n\n const apis: TechdocsAddonTesterApis<any[]> = [\n [fetchApiRef, fetchApi],\n [catalogApiRef, catalogApi],\n [entityPresentationApiRef, entityPresentationApi],\n [discoveryApiRef, discoveryApi],\n [techdocsApiRef, techdocsApi],\n [techdocsStorageApiRef, techdocsStorageApi],\n [searchApiRef, searchApi],\n [scmIntegrationsApiRef, scmIntegrationsApi],\n ...this.options.apis,\n ];\n\n const entityName = {\n namespace:\n this.options.entity?.metadata?.namespace ||\n defaultEntity.metadata.namespace,\n kind: this.options.entity?.kind || defaultEntity.kind,\n name: this.options.entity?.metadata?.name || defaultEntity.metadata.name,\n };\n\n techdocsApi.getTechDocsMetadata.mockReturnValue(\n this.options.metadata || { ...defaultMetadata },\n );\n techdocsApi.getEntityMetadata.mockResolvedValue(\n this.options.entity || { ...defaultEntity },\n );\n\n techdocsStorageApi.syncEntityDocs.mockResolvedValue('cached');\n techdocsStorageApi.getApiOrigin.mockResolvedValue(\n 'https://backstage.example.com/api/techdocs',\n );\n techdocsStorageApi.getBaseUrl.mockResolvedValue(\n `https://backstage.example.com/api/techdocs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,\n );\n techdocsStorageApi.getEntityDocs.mockResolvedValue(\n renderToStaticMarkup(this.options.dom || defaultDom),\n );\n\n const TechDocsAddonsPage = () => {\n return (\n <TestApiProvider apis={apis}>\n <FlatRoutes>\n <Route\n path=\"/docs/:namespace/:kind/:name/*\"\n element={<TechDocsReaderPage />}\n >\n <TechDocsAddons>\n {this.addons.map((addon, index) =>\n cloneElement(addon, { key: index }),\n )}\n </TechDocsAddons>\n </Route>\n </FlatRoutes>\n </TestApiProvider>\n );\n };\n\n return wrapInTestApp(<TechDocsAddonsPage />, {\n routeEntries: [\n `/docs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,\n ],\n mountedRoutes: {\n '/docs': techdocsPlugin.routes.root,\n '/docs/:namespace/:kind/:name/*': techdocsPlugin.routes.docRoot,\n '/catalog/:namespace/:kind/:name': entityRouteRef,\n },\n });\n }\n\n /**\n * Render the Addon within a fully configured and mocked TechDocs reader.\n *\n * @remarks\n *\n * Note that to make assertions on the shadow dom, add a dependency on\n * [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/)\n * and use its screen as follows:\n *\n * ```ts\n * import { screen } from 'shadow-dom-testing-library';\n *\n * // ... render the addon ...\n * await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])\n * .withDom(<body>TEST_CONTENT</body>)\n * .renderWithEffects();\n *\n * expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();\n * ```\n *\n * For items outside of the shadow dom, you can still use the regular screen\n * from `@testing-library/react`.\n *\n * Components using useEffect to perform an asynchronous action (such as\n * fetch) must be rendered within an async act call to properly get the final\n * state, even with mocked responses. This utility method makes the signature\n * a bit cleaner, since act doesn't return the result of the evaluated\n * function.\n *\n * @see https://github.com/testing-library/react-testing-library/issues/281\n * @see https://github.com/facebook/react/pull/14853\n */\n async renderWithEffects(): Promise<{ shadowRoot: ShadowRoot | null }> {\n await act(async () => {\n render(this.build());\n });\n\n const shadowHost = await screen.findByShadowTestId(\n 'techdocs-native-shadowroot',\n );\n\n return {\n shadowRoot: shadowHost?.shadowRoot || null,\n };\n }\n}\n\nexport default TechDocsAddonTester.buildAddonsInTechDocs;\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-techdocs-addons-test-utils",
3
- "version": "1.1.3-next.0",
3
+ "version": "2.0.0",
4
4
  "backstage": {
5
5
  "role": "web-library",
6
6
  "pluginId": "techdocs-addons",
@@ -40,19 +40,19 @@
40
40
  "test": "backstage-cli package test"
41
41
  },
42
42
  "dependencies": {
43
- "@backstage/core-app-api": "1.19.3-next.0",
44
- "@backstage/core-plugin-api": "1.12.1-next.0",
45
- "@backstage/integration-react": "1.2.13-next.0",
46
- "@backstage/plugin-catalog": "1.32.1-next.0",
47
- "@backstage/plugin-catalog-react": "1.21.4-next.0",
48
- "@backstage/plugin-search-react": "1.10.1-next.0",
49
- "@backstage/plugin-techdocs": "1.16.1-next.0",
50
- "@backstage/plugin-techdocs-react": "1.3.6-next.0",
51
- "@backstage/test-utils": "1.7.14-next.0",
52
- "testing-library__dom": "^7.29.4-beta.1"
43
+ "@backstage/core-app-api": "^1.19.3",
44
+ "@backstage/core-plugin-api": "^1.12.1",
45
+ "@backstage/integration-react": "^1.2.13",
46
+ "@backstage/plugin-catalog": "^1.32.1",
47
+ "@backstage/plugin-catalog-react": "^1.21.4",
48
+ "@backstage/plugin-search-react": "^1.10.1",
49
+ "@backstage/plugin-techdocs": "^1.16.1",
50
+ "@backstage/plugin-techdocs-react": "^1.3.6",
51
+ "@backstage/test-utils": "^1.7.14",
52
+ "shadow-dom-testing-library": "^1.13.1"
53
53
  },
54
54
  "devDependencies": {
55
- "@backstage/cli": "0.34.6-next.0",
55
+ "@backstage/cli": "^0.35.0",
56
56
  "@testing-library/dom": "^10.0.0",
57
57
  "@testing-library/jest-dom": "^6.0.0",
58
58
  "@types/react": "^18.0.0",