CSSStyleSheet.replace(),
Intersection Observer, Element.prototype.scrollTo and others.@porsche-design-system/components-vue package.setupTest.{js|ts} file.PorscheDesignSystemProvider in order to avoid exceptions.Attention
// setupTest.{js|ts}
import '@porsche-design-system/components-vue/jsdom-polyfill';
<!-- SingleComponent.vue -->
<script setup lang="ts">
import { ref } from 'vue';
import { PTabsBar, type TabsBarUpdateEventDetail } from '@porsche-design-system/components-vue';
const activeTab = ref(0);
const onUpdate = (e: CustomEvent<TabsBarUpdateEventDetail>) => {
activeTab.value = e.detail.activeTabIndex;
};
</script>
<template>
<PTabsBar :activeTabIndex="activeTab" @update="onUpdate">
<button data-testid="button1">Some label</button>
<button data-testid="button2">Some label</button>
<button data-testid="button3">Some label</button>
</PTabsBar>
<div data-testid="debug">Active Tab: {{ activeTab + 1 }}</div>
</template>
// SingleComponent.test.ts
import { PorscheDesignSystemProvider, componentsReady } from '@porsche-design-system/components-vue';
import userEvent from '@testing-library/user-event';
import { render } from '@testing-library/vue';
import { h } from 'vue';
import SingleComponent from './SingleComponent.vue';
it('should render Tabs Bar from Porsche Design System and use its events', async () => {
const { getByTestId } = render(PorscheDesignSystemProvider, {
slots: { default: h(SingleComponent) }, // required for the component to work
});
await componentsReady(); // we need to make sure Porsche Design System components are initialized
const debug = getByTestId('debug');
const button1 = getByTestId('button1');
const button2 = getByTestId('button2');
const button3 = getByTestId('button3');
expect(debug.innerHTML).toBe('Active Tab: 1');
await userEvent.click(button2);
expect(debug.innerHTML).toBe('Active Tab: 2');
await userEvent.click(button3);
expect(debug.innerHTML).toBe('Active Tab: 3');
await userEvent.click(button1);
expect(debug.innerHTML).toBe('Active Tab: 1');
});
getByRole only search light DOM, so they never reach those elements and find nothing.testing sub-package provides a Shadow counterpart for every Testing Library query. These search light
DOM and Shadow DOM, including nested Shadow DOM.getByShadowAltText, getAllByShadowAltText, queryByShadowAltText, queryAllByShadowAltText,
findByShadowAltText, findAllByShadowAltTextgetByShadowDisplayValue, getAllByShadowDisplayValue, queryByShadowDisplayValue,
queryAllByShadowDisplayValue, findByShadowDisplayValue, findAllByShadowDisplayValuegetByShadowLabelText, getAllByShadowLabelText, queryByShadowLabelText,
queryAllByShadowLabelText, findByShadowLabelText, findAllByShadowLabelTextgetByShadowPlaceholderText, getAllByShadowPlaceholderText, queryByShadowPlaceholderText,
queryAllByShadowPlaceholderText, findByShadowPlaceholderText, findAllByShadowPlaceholderTextgetByShadowRole, getAllByShadowRole, queryByShadowRole, queryAllByShadowRole, findByShadowRole,
findAllByShadowRolegetByShadowTestId, getAllByShadowTestId, queryByShadowTestId, queryAllByShadowTestId,
findByShadowTestId, findAllByShadowTestIdgetByShadowText, getAllByShadowText, queryByShadowText, queryAllByShadowText, findByShadowText,
findAllByShadowTextgetByShadowTitle, getAllByShadowTitle, queryByShadowTitle, queryAllByShadowTitle,
findByShadowTitle, findAllByShadowTitleimport { PButton, PorscheDesignSystemProvider, componentsReady } from '@porsche-design-system/components-vue';
import { screen } from '@porsche-design-system/components-vue/testing';
import { render } from '@testing-library/vue';
import { h } from 'vue';
it('should work for PButton', async () => {
render(PorscheDesignSystemProvider, { slots: { default: h(PButton) } });
await componentsReady();
expect(screen.getByShadowRole('button')).toBe(document.querySelector('p-button').shadowRoot.querySelector('button'));
});
screen (every query above, bound to document), within, deepQuerySelector, deepQuerySelectorAll,
getAllElementsAndShadowRoots, debug, logShadowDOM, prettyShadowDOM, logRoles, configure and getConfig.Requires a DOM
testing sub-package where no DOM is available throws an error.getByRoleShadowedgetByShadowRolegetByLabelTextShadowedgetByShadowLabelTextgetByTextShadowedgetByShadowTextp-modal, p-flyout, p-sheet, p-drilldownHTMLDialogElement.prototype.show = vi.fn();
HTMLDialogElement.prototype.showModal = vi.fn(function (this: HTMLDialogElement) {
this.setAttribute('open', '');
});
HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
this.removeAttribute('open');
});
p-button, p-button-pure, p-checkbox, p-input-date, p-input-email, p-input-month, p-input-number, p-input-password, p-input-search, p-input-tel, p-input-text, p-input-time, p-input-url, p-input-week, p-multi-select, p-pin-code, p-radio-group, p-segmented-control, p-select, p-textareaHTMLElement.prototype.attachInternals = vi.fn(
() =>
({
setFormValue: vi.fn(),
setValidity: vi.fn(),
}) as ElementInternals
);
p-tabs-bar, p-tabs, p-drilldownElement.prototype.animate = vi.fn(
() =>
({
onfinish: null,
cancel: vi.fn(),
finish: vi.fn(),
}) as unknown as Animation
);
