techdocs-addons-test-utils: major bump to remove explicit screen

Signed-off-by: Fredrik Adelöw <freben@gmail.com>
This commit is contained in:
Fredrik Adelöw
2025-12-02 13:36:05 +01:00
parent 8fa8d87e3b
commit 8d6709e38e
11 changed files with 273 additions and 231 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-techdocs-module-addons-contrib': patch
---
Updated tests to match test-utils change
+20
View File
@@ -0,0 +1,20 @@
---
'@backstage/plugin-techdocs-addons-test-utils': major
---
**BREAKING**: `TechDocsAddonTester.renderWithEffects()` no longer returns a screen; this means that you can no longer grab assertions such as `getByText` from its return value.
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.
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.
```ts
import { screen } from 'shadow-dom-testing-library';
// ... render the addon ...
await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])
.withDom(<body>TEST_CONTENT</body>)
.renderWithEffects();
expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
```
@@ -49,7 +49,7 @@
"@backstage/plugin-techdocs": "workspace:^",
"@backstage/plugin-techdocs-react": "workspace:^",
"@backstage/test-utils": "workspace:^",
"testing-library__dom": "^7.29.4-beta.1"
"shadow-dom-testing-library": "^1.13.1"
},
"devDependencies": {
"@backstage/cli": "workspace:^",
@@ -6,7 +6,6 @@
import { ApiRef } from '@backstage/core-plugin-api';
import { JSXElementConstructor } from 'react';
import { ReactElement } from 'react';
import { screen as screen_2 } from 'testing-library__dom';
import { TechDocsEntityMetadata } from '@backstage/plugin-techdocs-react';
import { TechDocsMetadata } from '@backstage/plugin-techdocs-react';
@@ -16,11 +15,9 @@ export class TechDocsAddonTester {
atPath(path: string): this;
build(): ReactElement<any, string | JSXElementConstructor<any>>;
static buildAddonsInTechDocs(addons: ReactElement[]): TechDocsAddonTester;
renderWithEffects(): Promise<
typeof screen_2 & {
shadowRoot: ShadowRoot | null;
}
>;
renderWithEffects(): Promise<{
shadowRoot: ShadowRoot | null;
}>;
withApis<T extends any[]>(apis: TechdocsAddonTesterApis<T>): this;
withDom(dom: ReactElement): this;
withEntity(entity: Partial<TechDocsEntityMetadata>): this;
@@ -18,7 +18,7 @@ import { cloneElement, ReactElement } from 'react';
// Shadow DOM support for the simple and complete DOM testing utilities
// https://github.com/testing-library/dom-testing-library/issues/742#issuecomment-674987855
import { screen } from 'testing-library__dom';
import { screen } from 'shadow-dom-testing-library';
import { Route } from 'react-router-dom';
import { act, render } from '@testing-library/react';
@@ -320,6 +320,25 @@ export class TechDocsAddonTester {
* Render the Addon within a fully configured and mocked TechDocs reader.
*
* @remarks
*
* Note that to make assertions on the shadow dom, add a dependency on
* [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/)
* and use its screen as follows:
*
* ```ts
* import { screen } from 'shadow-dom-testing-library';
*
* // ... render the addon ...
* await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])
* .withDom(<body>TEST_CONTENT</body>)
* .renderWithEffects();
*
* expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
* ```
*
* For items outside of the shadow dom, you can still use the regular screen
* from `@testing-library/react`.
*
* Components using useEffect to perform an asynchronous action (such as
* fetch) must be rendered within an async act call to properly get the final
* state, even with mocked responses. This utility method makes the signature
@@ -329,17 +348,16 @@ export class TechDocsAddonTester {
* @see https://github.com/testing-library/react-testing-library/issues/281
* @see https://github.com/facebook/react/pull/14853
*/
async renderWithEffects(): Promise<
typeof screen & { shadowRoot: ShadowRoot | null }
> {
async renderWithEffects(): Promise<{ shadowRoot: ShadowRoot | null }> {
await act(async () => {
render(this.build());
});
const shadowHost = await screen.findByTestId('techdocs-native-shadowroot');
const shadowHost = await screen.findByShadowTestId(
'techdocs-native-shadowroot',
);
return {
...screen,
shadowRoot: shadowHost?.shadowRoot || null,
};
}
@@ -75,7 +75,8 @@
"@types/react": "^18.0.0",
"react": "^18.0.2",
"react-dom": "^18.0.2",
"react-router-dom": "^6.3.0"
"react-router-dom": "^6.3.0",
"shadow-dom-testing-library": "^1.13.1"
},
"peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0",
@@ -17,6 +17,7 @@
import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils';
import { fireEvent, waitFor } from '@testing-library/react';
import { screen } from 'shadow-dom-testing-library';
import { ExpandableNavigation } from '../plugin';
import { entityPresentationApiRef } from '@backstage/plugin-catalog-react';
@@ -94,25 +95,24 @@ describe('ExpandableNavigation', () => {
});
it('renders without exploding', async () => {
const { getByRole } = await TechDocsAddonTester.buildAddonsInTechDocs([
await TechDocsAddonTester.buildAddonsInTechDocs([<ExpandableNavigation />])
.withDom(mockNavWithSublevels)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
expect(
screen.getByShadowRole('button', { name: 'expand-nav' }),
).toBeInTheDocument();
});
it('expands and collapses navigation', async () => {
const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([
<ExpandableNavigation />,
])
.withDom(mockNavWithSublevels)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
expect(getByRole('button', { name: 'expand-nav' })).toBeInTheDocument();
});
it('expands and collapses navigation', async () => {
const { getByRole, shadowRoot } =
await TechDocsAddonTester.buildAddonsInTechDocs([
<ExpandableNavigation />,
])
.withDom(mockNavWithSublevels)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
const toggles =
shadowRoot!.querySelectorAll<HTMLInputElement>('.md-toggle');
@@ -121,18 +121,24 @@ describe('ExpandableNavigation', () => {
expect(item).not.toBeChecked();
});
const expandButton = getByRole('button', { name: 'expand-nav' });
const expandButton = screen.getByShadowRole('button', {
name: 'expand-nav',
});
fireEvent.click(expandButton);
await waitFor(() => {
expect(getByRole('button', { name: 'collapse-nav' })).toBeInTheDocument();
expect(
screen.getByShadowRole('button', { name: 'collapse-nav' }),
).toBeInTheDocument();
toggles.forEach(item => {
expect(item).toBeChecked();
});
});
const collapseButton = getByRole('button', { name: 'collapse-nav' });
const collapseButton = screen.getByShadowRole('button', {
name: 'collapse-nav',
});
fireEvent.click(collapseButton);
@@ -144,15 +150,13 @@ describe('ExpandableNavigation', () => {
});
it('does not render when navigation has no sublevels', async () => {
const { queryByRole } = await TechDocsAddonTester.buildAddonsInTechDocs([
<ExpandableNavigation />,
])
await TechDocsAddonTester.buildAddonsInTechDocs([<ExpandableNavigation />])
.withDom(mockNavWithoutSublevels)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
expect(
queryByRole('button', { name: 'expand-nav' }),
screen.queryByShadowRole('button', { name: 'expand-nav' }),
).not.toBeInTheDocument();
});
});
@@ -15,6 +15,7 @@
*/
import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils';
import { screen } from 'shadow-dom-testing-library';
import { LightBox } from '../plugin';
import { entityPresentationApiRef } from '@backstage/plugin-catalog-react';
@@ -30,20 +31,16 @@ describe('LightBox', () => {
});
it('renders without exploding', async () => {
const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([
<LightBox />,
])
await TechDocsAddonTester.buildAddonsInTechDocs([<LightBox />])
.withDom(<body>TEST_CONTENT</body>)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
expect(getByText('TEST_CONTENT')).toBeInTheDocument();
expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
});
it('Add onclick event to images', async () => {
const { getByTestId } = await TechDocsAddonTester.buildAddonsInTechDocs([
<LightBox />,
])
await TechDocsAddonTester.buildAddonsInTechDocs([<LightBox />])
.withDom(
<img
data-testid="fixture"
@@ -54,7 +51,9 @@ describe('LightBox', () => {
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
expect(getByTestId('fixture').onclick).not.toBeUndefined();
expect(getByTestId('fixture').onclick).toEqual(expect.any(Function));
expect(screen.getByShadowTestId('fixture').onclick).not.toBeUndefined();
expect(screen.getByShadowTestId('fixture').onclick).toEqual(
expect.any(Function),
);
});
});
@@ -17,6 +17,7 @@
import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils';
import { fireEvent, waitFor } from '@testing-library/react';
import { screen } from 'shadow-dom-testing-library';
import { scmIntegrationsApiRef } from '@backstage/integration-react';
import { ReportIssue } from '../plugin';
@@ -67,58 +68,57 @@ describe('ReportIssue', () => {
it('renders github link without exploding', async () => {
byUrl.mockReturnValue({ type: 'github' });
const { shadowRoot, getByText } =
await TechDocsAddonTester.buildAddonsInTechDocs([
<ReportIssue debounceTime={0} />,
])
.withDom(
<html lang="en">
<head />
<body>
<div data-md-component="content">
<div data-md-component="navigation" />
<div data-md-component="toc" />
<div data-md-component="sidebar" />
const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([
<ReportIssue debounceTime={0} />,
])
.withDom(
<html lang="en">
<head />
<body>
<div data-md-component="content">
<div data-md-component="navigation" />
<div data-md-component="toc" />
<div data-md-component="sidebar" />
<div data-md-component="main">
<div className="md-content">
<article>
<a
title="Leave feedback for this page"
href="https://github.com/backstage/backstage/issues/new"
>
Leave feedback
</a>
<a
title="Edit this page"
href="https://github.com/backstage/backstage/edit/master/docs/README.md"
>
Edit page
</a>
</article>
</div>
<div data-md-component="main">
<div className="md-content">
<article>
<a
title="Leave feedback for this page"
href="https://github.com/backstage/backstage/issues/new"
>
Leave feedback
</a>
<a
title="Edit this page"
href="https://github.com/backstage/backstage/edit/master/docs/README.md"
>
Edit page
</a>
</article>
</div>
</div>
</body>
</html>,
)
.withApis([
[scmIntegrationsApiRef, { byUrl }],
[entityPresentationApiRef, entityPresentationApiMock],
])
.renderWithEffects();
</div>
</body>
</html>,
)
.withApis([
[scmIntegrationsApiRef, { byUrl }],
[entityPresentationApiRef, entityPresentationApiMock],
])
.renderWithEffects();
(shadowRoot as ShadowRoot & Pick<Document, 'getSelection'>).getSelection =
() => selection;
await waitFor(() => {
expect(getByText('Edit page')).toBeInTheDocument();
expect(screen.getByShadowText('Edit page')).toBeInTheDocument();
});
fireSelectionChangeEvent(window);
await waitFor(() => {
const link = getByText('Open new Github issue');
const link = screen.getByShadowText('Open new Github issue');
expect(link).toHaveAttribute(
'href',
'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20his%20&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20his%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fdocs%2FREADME.md%3E',
@@ -128,60 +128,61 @@ describe('ReportIssue', () => {
it('renders gitlab link without exploding', async () => {
byUrl.mockReturnValue({ type: 'gitlab' });
const { shadowRoot, getByText, queryByTestId } =
await TechDocsAddonTester.buildAddonsInTechDocs([
<ReportIssue debounceTime={0} />,
])
.withDom(
<html lang="en">
<head />
<body>
<div data-md-component="content">
<div data-md-component="navigation" />
<div data-md-component="toc" />
<div data-md-component="sidebar" />
const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([
<ReportIssue debounceTime={0} />,
])
.withDom(
<html lang="en">
<head />
<body>
<div data-md-component="content">
<div data-md-component="navigation" />
<div data-md-component="toc" />
<div data-md-component="sidebar" />
<div data-md-component="main">
<div className="md-content">
<article>
<a
title="Leave feedback for this page"
href="https://gitlab.com/backstage/backstage/issues/new"
>
Leave feedback
</a>
<a
title="Edit this page"
href="https://gitlab.com/backstage/backstage/-/edit/master/docs/README.md"
>
Edit page
</a>
</article>
</div>
<div data-md-component="main">
<div className="md-content">
<article>
<a
title="Leave feedback for this page"
href="https://gitlab.com/backstage/backstage/issues/new"
>
Leave feedback
</a>
<a
title="Edit this page"
href="https://gitlab.com/backstage/backstage/-/edit/master/docs/README.md"
>
Edit page
</a>
</article>
</div>
</div>
</body>
</html>,
)
.withApis([
[scmIntegrationsApiRef, { byUrl }],
[entityPresentationApiRef, entityPresentationApiMock],
])
.renderWithEffects();
</div>
</body>
</html>,
)
.withApis([
[scmIntegrationsApiRef, { byUrl }],
[entityPresentationApiRef, entityPresentationApiMock],
])
.renderWithEffects();
(shadowRoot as ShadowRoot & Pick<Document, 'getSelection'>).getSelection =
() => selection;
await waitFor(() => {
expect(getByText('Edit page')).toBeInTheDocument();
expect(screen.getByShadowText('Edit page')).toBeInTheDocument();
});
fireSelectionChangeEvent(window);
await waitFor(() => {
expect(queryByTestId('report-issue-addon')).toBeInTheDocument();
expect(
screen.getByShadowTestId('report-issue-addon'),
).toBeInTheDocument();
const link = getByText('Open new Gitlab issue');
const link = screen.getByShadowText('Open new Gitlab issue');
expect(link).toHaveAttribute(
'href',
'https://gitlab.com/backstage/backstage/issues/new?issue[title]=Documentation%20feedback%3A%20his%20&issue[description]=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20his%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgitlab.com%2Fbackstage%2Fbackstage%2F-%2Fblob%2Fmaster%2Fdocs%2FREADME.md%3E',
@@ -197,60 +198,61 @@ describe('ReportIssue', () => {
body: options.selection.toString().trim(),
});
const { shadowRoot, getByText, queryByTestId } =
await TechDocsAddonTester.buildAddonsInTechDocs([
<ReportIssue debounceTime={0} templateBuilder={templateBuilder} />,
])
.withDom(
<html lang="en">
<head />
<body>
<div data-md-component="content">
<div data-md-component="navigation" />
<div data-md-component="toc" />
<div data-md-component="sidebar" />
const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([
<ReportIssue debounceTime={0} templateBuilder={templateBuilder} />,
])
.withDom(
<html lang="en">
<head />
<body>
<div data-md-component="content">
<div data-md-component="navigation" />
<div data-md-component="toc" />
<div data-md-component="sidebar" />
<div data-md-component="main">
<div className="md-content">
<article>
<a
title="Leave feedback for this page"
href="https://gitlab.com/backstage/backstage/issues/new"
>
Leave feedback
</a>
<a
title="Edit this page"
href="https://gitlab.com/backstage/backstage/-/edit/master/docs/README.md"
>
Edit page
</a>
</article>
</div>
<div data-md-component="main">
<div className="md-content">
<article>
<a
title="Leave feedback for this page"
href="https://gitlab.com/backstage/backstage/issues/new"
>
Leave feedback
</a>
<a
title="Edit this page"
href="https://gitlab.com/backstage/backstage/-/edit/master/docs/README.md"
>
Edit page
</a>
</article>
</div>
</div>
</body>
</html>,
)
.withApis([
[scmIntegrationsApiRef, { byUrl }],
[entityPresentationApiRef, entityPresentationApiMock],
])
.renderWithEffects();
</div>
</body>
</html>,
)
.withApis([
[scmIntegrationsApiRef, { byUrl }],
[entityPresentationApiRef, entityPresentationApiMock],
])
.renderWithEffects();
(shadowRoot as ShadowRoot & Pick<Document, 'getSelection'>).getSelection =
() => selection;
await waitFor(() => {
expect(getByText('Edit page')).toBeInTheDocument();
expect(screen.getByShadowText('Edit page')).toBeInTheDocument();
});
fireSelectionChangeEvent(window);
await waitFor(() => {
expect(queryByTestId('report-issue-addon')).toBeInTheDocument();
expect(
screen.getByShadowTestId('report-issue-addon'),
).toBeInTheDocument();
const link = getByText('Open new Gitlab issue');
const link = screen.getByShadowText('Open new Gitlab issue');
expect(link).toHaveAttribute(
'href',
'https://gitlab.com/backstage/backstage/issues/new?issue[title]=Custom&issue[description]=his',
@@ -261,45 +263,46 @@ describe('ReportIssue', () => {
it('does not render report issue link for unsupported repository type', async () => {
byUrl.mockReturnValue({ type: 'gerrit', resource: 'gerrit.example.com' });
const { shadowRoot, getByText, queryByTestId } =
await TechDocsAddonTester.buildAddonsInTechDocs([
<ReportIssue debounceTime={0} />,
])
.withDom(
<html lang="en">
<head />
<body>
<div data-md-component="content">
<div data-md-component="main">
<div className="md-content">
<article>
<a
title="Edit this page"
href="https://gerrit.example.com/admin/repos/edit/repo/my/repo/branch/refs/heads/master/file/docs/README.md"
>
Edit page
</a>
</article>
</div>
const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([
<ReportIssue debounceTime={0} />,
])
.withDom(
<html lang="en">
<head />
<body>
<div data-md-component="content">
<div data-md-component="main">
<div className="md-content">
<article>
<a
title="Edit this page"
href="https://gerrit.example.com/admin/repos/edit/repo/my/repo/branch/refs/heads/master/file/docs/README.md"
>
Edit page
</a>
</article>
</div>
</div>
</body>
</html>,
)
.withApis([[scmIntegrationsApiRef, { byUrl }]])
.renderWithEffects();
</div>
</body>
</html>,
)
.withApis([[scmIntegrationsApiRef, { byUrl }]])
.renderWithEffects();
(shadowRoot as ShadowRoot & Pick<Document, 'getSelection'>).getSelection =
() => selection;
await waitFor(() => {
expect(getByText('Edit page')).toBeInTheDocument();
expect(screen.getByShadowText('Edit page')).toBeInTheDocument();
});
fireSelectionChangeEvent(window);
await waitFor(() => {
expect(queryByTestId('report-issue-addon')).not.toBeInTheDocument();
expect(
screen.queryByShadowTestId('report-issue-addon'),
).not.toBeInTheDocument();
});
});
});
@@ -16,6 +16,7 @@
import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils';
import { act, fireEvent, waitFor } from '@testing-library/react';
import { screen } from 'shadow-dom-testing-library';
import { TextSize } from '../plugin';
import { useShadowRootElements } from '@backstage/plugin-techdocs-react';
import { entityPresentationApiRef } from '@backstage/plugin-catalog-react';
@@ -42,33 +43,30 @@ describe('TextSize', () => {
});
it('renders without exploding', async () => {
const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([
<TextSize />,
])
await TechDocsAddonTester.buildAddonsInTechDocs([<TextSize />])
.withDom(<body>TEST_CONTENT</body>)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
expect(getByText('TEST_CONTENT')).toBeInTheDocument();
expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
});
it('changes content text size using slider', async () => {
const { getByTitle, getByText, getByRole, getByDisplayValue } =
await TechDocsAddonTester.buildAddonsInTechDocs([<TextSize />])
.withDom(<body>TEST_CONTENT</body>)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
await TechDocsAddonTester.buildAddonsInTechDocs([<TextSize />])
.withDom(<body>TEST_CONTENT</body>)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
const content = getByText('TEST_CONTENT');
const content = screen.getByShadowText('TEST_CONTENT');
useShadowRootElementsMock.mockReturnValue([content]);
fireEvent.click(getByTitle('Settings'));
fireEvent.click(screen.getByShadowTitle('Settings'));
await waitFor(() => {
expect(getByText('Text size')).toBeInTheDocument();
expect(screen.getByShadowText('Text size')).toBeInTheDocument();
});
const slider = getByRole('slider');
const slider = screen.getByShadowRole('slider');
act(() => {
slider.focus();
@@ -79,12 +77,12 @@ describe('TextSize', () => {
});
await waitFor(() => {
expect(getByDisplayValue('115')).toBeInTheDocument();
expect(screen.getByShadowDisplayValue('115')).toBeInTheDocument();
});
expect(slider).toHaveTextContent('115%');
let style = window.getComputedStyle(getByText('TEST_CONTENT'));
let style = window.getComputedStyle(screen.getByShadowText('TEST_CONTENT'));
await waitFor(() => {
expect(style.getPropertyValue('--md-typeset-font-size')).toBe('18.4px');
@@ -95,60 +93,54 @@ describe('TextSize', () => {
});
await waitFor(() => {
expect(getByDisplayValue('100')).toBeInTheDocument();
expect(screen.getByShadowDisplayValue('100')).toBeInTheDocument();
});
expect(slider).toHaveTextContent('100%');
style = window.getComputedStyle(getByText('TEST_CONTENT'));
style = window.getComputedStyle(screen.getByShadowText('TEST_CONTENT'));
expect(style.getPropertyValue('--md-typeset-font-size')).toBe('16px');
});
it('changes content text size using buttons', async () => {
const {
getByTitle,
getByText,
getByRole,
getByLabelText,
getByDisplayValue,
} = await TechDocsAddonTester.buildAddonsInTechDocs([<TextSize />])
await TechDocsAddonTester.buildAddonsInTechDocs([<TextSize />])
.withDom(<body>TEST_CONTENT</body>)
.withApis([[entityPresentationApiRef, entityPresentationApiMock]])
.renderWithEffects();
const content = getByText('TEST_CONTENT');
const content = screen.getByShadowText('TEST_CONTENT');
useShadowRootElementsMock.mockReturnValue([content]);
fireEvent.click(getByTitle('Settings'));
fireEvent.click(screen.getByShadowTitle('Settings'));
await waitFor(() => {
expect(getByText('Text size')).toBeInTheDocument();
expect(screen.getByShadowText('Text size')).toBeInTheDocument();
});
fireEvent.click(getByLabelText('Increase text size'));
fireEvent.click(screen.getByShadowLabelText('Increase text size'));
await waitFor(() => {
expect(getByDisplayValue('115')).toBeInTheDocument();
expect(screen.getByShadowDisplayValue('115')).toBeInTheDocument();
});
const slider = getByRole('slider');
const slider = screen.getByShadowRole('slider');
expect(slider).toHaveTextContent('115%');
let style = window.getComputedStyle(getByText('TEST_CONTENT'));
let style = window.getComputedStyle(screen.getByShadowText('TEST_CONTENT'));
expect(style.getPropertyValue('--md-typeset-font-size')).toBe('18.4px');
fireEvent.click(getByLabelText('Decrease text size'));
fireEvent.click(screen.getByShadowLabelText('Decrease text size'));
await waitFor(() => {
expect(getByDisplayValue('100')).toBeInTheDocument();
expect(screen.getByShadowDisplayValue('100')).toBeInTheDocument();
});
expect(slider).toHaveTextContent('100%');
style = window.getComputedStyle(getByText('TEST_CONTENT'));
style = window.getComputedStyle(screen.getByShadowText('TEST_CONTENT'));
expect(style.getPropertyValue('--md-typeset-font-size')).toBe('16px');
});
+11 -8
View File
@@ -7362,7 +7362,7 @@ __metadata:
react: "npm:^18.0.2"
react-dom: "npm:^18.0.2"
react-router-dom: "npm:^6.3.0"
testing-library__dom: "npm:^7.29.4-beta.1"
shadow-dom-testing-library: "npm:^1.13.1"
peerDependencies:
"@testing-library/react": ^16.0.0
"@types/react": ^17.0.0 || ^18.0.0
@@ -7437,6 +7437,7 @@ __metadata:
react: "npm:^18.0.2"
react-dom: "npm:^18.0.2"
react-router-dom: "npm:^6.3.0"
shadow-dom-testing-library: "npm:^1.13.1"
peerDependencies:
"@types/react": ^17.0.0 || ^18.0.0
react: ^17.0.0 || ^18.0.0
@@ -45240,6 +45241,15 @@ __metadata:
languageName: node
linkType: hard
"shadow-dom-testing-library@npm:^1.13.1":
version: 1.13.1
resolution: "shadow-dom-testing-library@npm:1.13.1"
peerDependencies:
"@testing-library/dom": ">= 8"
checksum: 10/a10f3466592691368f260c15230d9e830cc5122d20002ad9b6c2918fa245089219d1f45c026153fa6ccf8848b546da6f985c0e461458c8c1e09786a1de626287
languageName: node
linkType: hard
"shallow-clone@npm:^3.0.0":
version: 3.0.1
resolution: "shallow-clone@npm:3.0.1"
@@ -47166,13 +47176,6 @@ __metadata:
languageName: node
linkType: hard
"testing-library__dom@npm:^7.29.4-beta.1":
version: 7.29.4-beta.1
resolution: "testing-library__dom@npm:7.29.4-beta.1"
checksum: 10/d912418803b77df672c0894d053327a4b366cf7e5312dfb73bd2089d36272e2b38bccc1bd7284d9ed2f9f6530797778d0f72e94b8a44fe5d0327d11e7f757f2b
languageName: node
linkType: hard
"text-decoder@npm:^1.1.0":
version: 1.2.3
resolution: "text-decoder@npm:1.2.3"