import '@testing-library/jest-dom';
import { act, render, screen, waitFor } from '@testing-library/react';
import { FC, Fragment, useState } from 'react';
import { bundleState } from '../bundle-state';
import { DatadogProvider, Options } from '../datadog-provider';
import type { RumUser } from '../set-user';
import { setUser } from '../set-user';
jest.mock('../set-user');
jest.mock('../hash-routing', () => mockComponent('HashRouting'));
function mockComponent(name: string) {
return {
[name]: ({ children }: any) => (
{`<${name} />`}
{children}
),
};
}
describe(`[datadog-rum] ${DatadogProvider.name}`, () => {
const initialUser: RumUser = { id: '1' };
let isEnabled: boolean;
let options: Options;
let updateUser: (user?: RumUser) => void;
beforeEach(() => {
jest.clearAllMocks();
isEnabled = true;
options = {};
bundleState.isSdkInitializer = false;
});
const subject = () => {
const Component: FC = () => {
const [user, setUserInner] = useState(initialUser);
updateUser = setUserInner;
return ;
};
return render();
};
function itRendersHashRoutingWhenEnabled() {
test('does not render ', async () => {
subject();
await waitFor(() =>
expect(screen.queryByText('')).not.toBeInTheDocument()
);
});
describe('with options.hashRouting=true', () => {
beforeEach(() => {
options.hashRouting = true;
});
test('renders ', async () => {
subject();
await waitFor(() =>
expect(screen.queryByText('')).toBeInTheDocument()
);
});
});
}
function itCallsSetUser() {
test('calls setUser', () => {
subject();
expect(setUser).toHaveBeenCalledWith(initialUser);
});
}
itCallsSetUser();
itRendersHashRoutingWhenEnabled();
describe('when the user is changed', () => {
const nextUser: RumUser = { id: '2' };
beforeEach(() => {
subject();
act(() => {
updateUser(nextUser);
});
});
test('calls setUser with the new user', () => {
expect(setUser).toHaveBeenCalledWith(nextUser);
});
describe('when the user is then unset', () => {
beforeEach(() => {
jest.clearAllMocks();
act(() => {
updateUser(undefined);
});
});
test('does not call setUser', () => {
expect(setUser).not.toHaveBeenCalled();
});
});
});
describe('with isEnabled=false', () => {
beforeEach(() => {
isEnabled = false;
});
test('does not call setUser', () => {
subject();
expect(setUser).not.toHaveBeenCalled();
});
describe('with options.hashRouting=true', () => {
beforeEach(() => {
options.hashRouting = true;
});
test('does not render ', async () => {
subject();
await waitFor(() =>
expect(screen.queryByText('')).not.toBeInTheDocument()
);
});
});
describe('when the bundle is the SDK initializer', () => {
beforeEach(() => {
bundleState.isSdkInitializer = true;
});
itCallsSetUser();
itRendersHashRoutingWhenEnabled();
});
});
});