import '@testing-library/jest-dom';
import { within } from '@testing-library/react';
import { Fragment } from 'react';
import { expectStylesInDom } from '../__mocks__';
import {
createRegisterHarness,
optionalLibraryWrappers,
} from '../__mocks__/register-anvil2-harness';
function mockComponent(name: string) {
return {
[name]: ({ children }: any) => (
{`<${name}>`}
{children}
),
};
}
function mockContext(name: string) {
return {
[name]: {
Provider: ({ children }: any) => (
{`<${name}.Provider>`}
{children}
),
},
};
}
jest.mock('@servicetitan/anvil2', () => ({
...mockComponent('PortalProvider'),
}));
jest.mock('@servicetitan/design-system', () => ({
...mockContext('DefaultPortalContext'),
...mockContext('TablePopupPropsContext'),
}));
describe('[web-components] register', () => {
const { Page, subject } = createRegisterHarness('mock-anvil2-app');
describe('when Anvil2 bundle is present in the DOM', () => {
let cssLink: HTMLLinkElement;
beforeEach(() => {
cssLink = Object.assign(document.createElement('link'), {
href: 'http://localhost/anvil2.foobar.bundle.css',
rel: 'stylesheet',
});
document.body.appendChild(cssLink);
});
afterEach(() => {
cssLink.remove();
});
test('loads the styles into the component shadow DOM', () => {
subject();
expectStylesInDom(cssLink.href, () => Page.componentShadowRoot);
});
test('loads the styles into the portal shadow DOM', () => {
subject();
expectStylesInDom(cssLink.href, () => Page.portalShadowRoot);
});
});
test.each(Object.values(optionalLibraryWrappers).flat())('wraps component within %s', name => {
subject();
const element = within(Page.componentShadowRoot as any).queryByText(`<${name}>`);
expect(element).toBeInTheDocument();
});
});