Search code examples
reactjsunit-testingtestingintegration-testingreact-testing-library

How to paste clipboard data using React Testing Library?


I'm trying to paste text that's already in my clipboard into a textbox, but I dont understand how to use "eventInit" to do this. I've read the documentation on how to paste text into a textbox, but it isn't clear on how to use eventInit.

How do i paste text that's in my clipboard into a textbox using userEvent?

This is my code:

test('Copy id button copies correct id', async () => {
  const { getAllByLabelText, debug, getByText } = render(
    <MockedProvider mocks={mocks} addTypename={false}>
      <History />
    </MockedProvider>
  );

  const textbox = <input type="text" />;
  
  await waitFor(() => new Promise((resolve) => setTimeout(resolve, 0)));

  const button = getAllByLabelText('click to copy id')[0];
  fireEvent.click(button);
  // userEvent.paste(textbox,_,) unsure what to do here...
});

Documentation: Documentation


Solution

  • Another option would be to do something like

    test('Pasting fires onPaste event which returns clipboard data', () => {
      const pasted = jest.fn(() => null);
      const changed = jest.fn(() => null);
    
      render(
        <PasteComponent paste={pasted} changeEvent={changed} data-testid='paste-input' />);
    
      const PhoneNumberElement = screen.queryByTestId('paste-input');
    
      const paste = createEvent.paste(PhoneNumberElement, {
        clipboardData: {
          getData: () => '123456',
        },
      });
    
      fireEvent(PhoneNumberElement, paste);
    
      expect(pasted).toHaveBeenCalled();
      expect(pasted).toHaveBeenCalledWith('123456');
    });
    

    I wrote up a post on it - https://medium.davidendersby.me/2-ways-to-trigger-the-onpaste-event-with-testing-library-1502c5fdb9e