-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Expand file tree
/
Copy pathindex.js
More file actions
82 lines (65 loc) · 1.65 KB
/
index.js
File metadata and controls
82 lines (65 loc) · 1.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
* External dependencies
*/
import {
act,
render,
screen,
fireEvent,
waitFor,
} from '@testing-library/react';
/**
* WordPress dependencies
*/
import { useRef } from '@wordpress/element';
/**
* Internal dependencies
*/
import useCopyOnClick from '../';
const ExampleComponent = ( { text, ...props } ) => {
const ref = useRef();
const hasCopied = useCopyOnClick( ref, text, 1000 );
return (
<button ref={ ref } { ...props }>
{ hasCopied ? 'Copied' : 'Click to copy' }
</button>
);
};
let clipboardValue;
const originalClipboard = global.navigator.clipboard;
const mockClipboard = {
writeText: jest.fn().mockImplementation( ( text ) => {
return new Promise( ( resolve ) => {
clipboardValue = text;
resolve();
} );
} ),
};
describe( 'useCopyOnClick', () => {
beforeAll( () => {
global.navigator.clipboard = mockClipboard;
} );
beforeEach( () => {
clipboardValue = undefined;
} );
afterAll( () => {
global.navigator.clipboard = originalClipboard;
} );
it( 'should copy the text to the clipboard and display a warning notice', async () => {
const textToBeCopied = 'mango';
render( <ExampleComponent text={ textToBeCopied } /> );
expect( console ).toHaveWarned();
const triggerButton = screen.getByText( 'Click to copy' );
fireEvent.click( triggerButton );
await waitFor( () =>
expect( clipboardValue ).toEqual( textToBeCopied )
);
// Check that the displayed text changes as a way of testing
// the `hasCopied` logic
expect( screen.getByText( 'Copied' ) ).toBeInTheDocument();
act( () => {
jest.runAllTimers();
} );
expect( screen.getByText( 'Click to copy' ) ).toBeInTheDocument();
} );
} );