1
1
import React from 'react' ;
2
- import {
3
- render , screen , waitFor ,
4
- } from '@testing-library/react' ;
2
+ import { render , screen , waitFor } from '@testing-library/react' ;
5
3
import userEvent from '@testing-library/user-event' ;
6
4
import { useSelector } from 'react-redux' ;
7
5
import { IntlProvider } from 'react-intl' ;
8
6
7
+ import { fireEvent } from '@testing-library/dom' ;
9
8
import GradeSummaryHeader from './GradeSummaryHeader' ;
10
9
import { useModel } from '../../../../generic/model-store' ;
11
10
import messages from '../messages' ;
@@ -18,6 +17,10 @@ jest.mock('../../../../generic/model-store', () => ({
18
17
useModel : jest . fn ( ) ,
19
18
} ) ) ;
20
19
20
+ jest . mock ( '../../../../data/hooks' , ( ) => ( {
21
+ useContextId : ( ) => 'test-course-id' ,
22
+ } ) ) ;
23
+
21
24
describe ( 'GradeSummaryHeader' , ( ) => {
22
25
beforeEach ( ( ) => {
23
26
useSelector . mockImplementation ( ( selector ) => selector ( {
@@ -30,25 +33,95 @@ describe('GradeSummaryHeader', () => {
30
33
render (
31
34
< IntlProvider locale = "en" messages = { messages } >
32
35
< GradeSummaryHeader
33
- intl = { { formatMessage : jest . fn ( ( msg ) => msg . defaultMessage ) } }
34
36
allOfSomeAssignmentTypeIsLocked = { false }
35
37
{ ...props }
36
38
/>
37
39
</ IntlProvider > ,
38
40
) ;
39
41
} ;
40
42
41
- it ( 'visible the tooltip when Escape is pressed' , async ( ) => {
43
+ it ( 'shows tooltip on icon button click' , async ( ) => {
44
+ renderComponent ( ) ;
45
+
46
+ const iconButton = screen . getByRole ( 'button' , {
47
+ name : messages . gradeSummaryTooltipAlt . defaultMessage ,
48
+ } ) ;
49
+
50
+ await userEvent . click ( iconButton ) ;
51
+
52
+ await waitFor ( ( ) => {
53
+ expect ( screen . getByText ( messages . gradeSummaryTooltipBody . defaultMessage ) ) . toBeInTheDocument ( ) ;
54
+ } ) ;
55
+ } ) ;
56
+
57
+ it ( 'hides tooltip on mouse out' , async ( ) => {
42
58
renderComponent ( ) ;
43
59
44
60
const iconButton = screen . getByRole ( 'button' , {
45
61
name : messages . gradeSummaryTooltipAlt . defaultMessage ,
46
62
} ) ;
47
63
48
- userEvent . click ( iconButton ) ;
64
+ fireEvent . mouseOver ( iconButton ) ;
49
65
50
66
await waitFor ( ( ) => {
51
67
expect ( screen . getByText ( messages . gradeSummaryTooltipBody . defaultMessage ) ) . toBeVisible ( ) ;
52
68
} ) ;
69
+
70
+ fireEvent . mouseOut ( iconButton ) ;
71
+
72
+ await waitFor ( ( ) => {
73
+ expect ( screen . queryByText ( messages . gradeSummaryTooltipBody . defaultMessage ) ) . toBeNull ( ) ;
74
+ } ) ;
75
+ } ) ;
76
+
77
+ it ( 'hides tooltip on blur' , async ( ) => {
78
+ renderComponent ( ) ;
79
+
80
+ const iconButton = screen . getByRole ( 'button' , {
81
+ name : messages . gradeSummaryTooltipAlt . defaultMessage ,
82
+ } ) ;
83
+
84
+ await userEvent . hover ( iconButton ) ;
85
+ await userEvent . click ( iconButton ) ;
86
+
87
+ await waitFor ( ( ) => {
88
+ expect ( screen . getByText ( messages . gradeSummaryTooltipBody . defaultMessage ) ) . toBeInTheDocument ( ) ;
89
+ } ) ;
90
+
91
+ const blurTarget = document . createElement ( 'button' ) ;
92
+ blurTarget . textContent = 'Outside' ;
93
+ document . body . appendChild ( blurTarget ) ;
94
+ blurTarget . focus ( ) ;
95
+
96
+ await userEvent . unhover ( iconButton ) ;
97
+
98
+ await waitFor ( ( ) => {
99
+ expect ( screen . queryByText ( messages . gradeSummaryTooltipBody . defaultMessage ) ) . not . toBeInTheDocument ( ) ;
100
+ } ) ;
101
+
102
+ document . body . removeChild ( blurTarget ) ;
103
+ } ) ;
104
+
105
+ it ( 'hides tooltip when Escape is pressed (covers handleKeyDown)' , async ( ) => {
106
+ renderComponent ( ) ;
107
+
108
+ const iconButton = screen . getByRole ( 'button' , {
109
+ name : messages . gradeSummaryTooltipAlt . defaultMessage ,
110
+ } ) ;
111
+
112
+ await userEvent . hover ( iconButton ) ;
113
+ await userEvent . click ( iconButton ) ;
114
+
115
+ await waitFor ( ( ) => {
116
+ expect ( screen . getByText ( messages . gradeSummaryTooltipBody . defaultMessage ) ) . toBeInTheDocument ( ) ;
117
+ } ) ;
118
+
119
+ fireEvent . keyDown ( iconButton , { key : 'Escape' , code : 'Escape' } ) ;
120
+
121
+ await userEvent . unhover ( iconButton ) ;
122
+
123
+ await waitFor ( ( ) => {
124
+ expect ( screen . queryByText ( messages . gradeSummaryTooltipBody . defaultMessage ) ) . not . toBeInTheDocument ( ) ;
125
+ } ) ;
53
126
} ) ;
54
127
} ) ;
0 commit comments