import { render, fireEvent, screen, act } from '@testing-library/react';
import { useCopyToClipboard } from '..';
const mockWriteText = jest.fn();
const originalNavigator = { ...window.navigator };
describe('useCopyToClipboard', () => {
beforeEach(() => {
jest.useFakeTimers();
Object.defineProperty(window, 'navigator', {
value: {
clipboard: {
writeText: mockWriteText,
},
},
});
});
afterEach(() => {
Object.defineProperty(window, 'navigator', {
value: originalNavigator,
});
});
it('should call clipboard API with `test` once', async () => {
const navigatorClipboardWriteTextSpy = jest
.fn()
.mockImplementation(() => Promise.resolve());
Object.defineProperty(window.navigator, 'clipboard', {
writable: true,
value: {
writeText: navigatorClipboardWriteTextSpy,
},
});
const TestComponent = ({ textToCopy }) => {
const [copied, copyText] = useCopyToClipboard();
return (
);
};
render();
const button = screen.getByRole('button');
await fireEvent.click(button);
expect(await screen.findByText(/copied/i)).toBeInTheDocument();
act(() => jest.advanceTimersByTime(3000));
expect(await screen.findByText(/copy/i)).toBeInTheDocument();
expect(navigatorClipboardWriteTextSpy).toHaveBeenCalledTimes(1);
expect(navigatorClipboardWriteTextSpy).toHaveBeenCalledWith('test');
});
});