import React from 'react';
import { queryByTestId, findByTestId } from '@testing-library/dom';
import type { MountableExtension } from '@atlassian/clientside-extensions';
import renderElementAsReact from './renderElementAsReact';
/* eslint-disable react/no-unused-prop-types */
interface TestProps {
name?: string;
value?: number;
children?: React.ReactNode;
}
/* eslint-enable react/no-unused-prop-types */
describe('renderElementAsReact', () => {
let testContainer: HTMLElement;
let onMountCallback: (element: HTMLElement) => void;
let onUnmountCallback: (element: HTMLElement) => void;
const testRenderAPI: MountableExtension = {
onMount: (callback) => {
onMountCallback = callback;
return testRenderAPI;
},
onUnmount: (callback) => {
onUnmountCallback = callback;
return testRenderAPI;
},
};
const TestComponent = (props: unknown) => (
A test content
{JSON.stringify(props)}
);
beforeEach(() => {
testContainer = document.createElement('div');
});
it('should use the renderApi to mount and unmount the given react component', () => {
const getTestComponent = () => queryByTestId(testContainer, 'test-component');
renderElementAsReact(testRenderAPI, TestComponent);
// expect the component NOT to be rendered until onMount is called by the handler
expect(getTestComponent()).toBeFalsy();
onMountCallback(testContainer);
// rendered using onMount
expect(getTestComponent()).toBeTruthy();
expect(getTestComponent()?.textContent).toMatch('A test content');
onUnmountCallback(testContainer);
// destroyed using onUnmount
expect(getTestComponent()).toBeFalsy();
});
it('should receive additional props to assing to the given react component', async () => {
const testProps: TestProps = {
name: 'Meaning of life',
value: 42,
};
renderElementAsReact(testRenderAPI, TestComponent, testProps);
onMountCallback(testContainer);
const testPropsElement = await findByTestId(testContainer, 'test-props');
// props applied to the component when rendering
expect(testPropsElement).toBeTruthy();
expect(JSON.parse(testPropsElement.textContent as string)).toMatchObject(testProps);
});
});