1
- import React from 'react' ;
2
- // import {cleanup, fireEvent, render} from '@testing-library/react';
3
- import { shallow } from '@edx/react-unit-test-utils' ;
1
+ import { render } from '@testing-library/react' ;
2
+ import '@testing-library/jest-dom' ;
4
3
5
4
import {
6
5
useGlobalState ,
@@ -11,103 +10,153 @@ import { stepNames, stepStates } from 'constants/index';
11
10
12
11
import HotjarSurvey from './index' ;
13
12
13
+ jest . unmock ( '@openedx/paragon' ) ;
14
+ jest . unmock ( 'react' ) ;
15
+ jest . unmock ( '@edx/frontend-platform/i18n' ) ;
16
+
14
17
jest . mock ( 'hooks/app' , ( ) => ( {
15
18
useGlobalState : jest . fn ( ) ,
16
19
useStepInfo : jest . fn ( ) ,
17
20
useAssessmentStepConfig : jest . fn ( ) ,
18
21
} ) ) ;
19
22
20
23
describe ( '<HotjarSurvey />' , ( ) => {
21
- // * These tests opts to use shallow instead of render because I want to trigger the useEffect
22
- // * manually.
23
24
beforeEach ( ( ) => {
24
25
window . hj = jest . fn ( ) ;
25
26
} ) ;
27
+
26
28
afterEach ( ( ) => {
27
29
delete window . hj ;
28
30
jest . clearAllMocks ( ) ;
29
31
} ) ;
30
32
31
- it ( 'show survey when self is require and step is not while peer is not require' , ( ) => {
32
- useAssessmentStepConfig . mockReturnValueOnce ( {
33
+ it ( 'renders survey container element' , ( ) => {
34
+ useAssessmentStepConfig . mockReturnValue ( {
35
+ settings : {
36
+ self : { required : false } ,
37
+ peer : { required : false } ,
38
+ } ,
39
+ } ) ;
40
+ useGlobalState . mockReturnValue ( {
41
+ activeStepState : stepStates . done ,
42
+ } ) ;
43
+ useStepInfo . mockReturnValue ( { } ) ;
44
+
45
+ const { container } = render ( < HotjarSurvey /> ) ;
46
+ const surveyElement = container . querySelector ( '#openassessment_hotjar' ) ;
47
+ expect ( surveyElement ) . toBeInTheDocument ( ) ;
48
+ } ) ;
49
+
50
+ it ( 'shows survey when self is required and step is done while peer is not required' , ( ) => {
51
+ useAssessmentStepConfig . mockReturnValue ( {
33
52
settings : {
34
53
self : { required : true } ,
35
54
peer : { required : false } ,
36
55
} ,
37
56
} ) ;
38
- useGlobalState . mockReturnValueOnce ( {
57
+ useGlobalState . mockReturnValue ( {
39
58
activeStepState : stepStates . done ,
40
59
} ) ;
60
+ useStepInfo . mockReturnValue ( { } ) ;
41
61
42
- expect ( React . useEffect ) . not . toHaveBeenCalled ( ) ;
43
- shallow ( < HotjarSurvey /> ) ;
62
+ render ( < HotjarSurvey /> ) ;
44
63
45
- const [ [ cb , [ isShowSurvey ] ] ] = React . useEffect . mock . calls ;
46
- expect ( isShowSurvey ) . toBe ( true ) ;
47
- cb ( ) ;
48
64
expect ( window . hj ) . toHaveBeenCalledWith (
49
65
'event' ,
50
66
'lms_openassessment_survey_mfe' ,
51
67
) ;
52
68
} ) ;
53
69
54
- it ( 'show survey when peer is require iif completed the peer grading' , ( ) => {
55
- useAssessmentStepConfig . mockReturnValueOnce ( {
70
+ it ( 'does not show survey when self is required but step is not done' , ( ) => {
71
+ useAssessmentStepConfig . mockReturnValue ( {
72
+ settings : {
73
+ self : { required : true } ,
74
+ peer : { required : false } ,
75
+ } ,
76
+ } ) ;
77
+ useGlobalState . mockReturnValue ( {
78
+ activeStepState : stepStates . inProgress ,
79
+ } ) ;
80
+ useStepInfo . mockReturnValue ( { } ) ;
81
+
82
+ render ( < HotjarSurvey /> ) ;
83
+
84
+ expect ( window . hj ) . not . toHaveBeenCalled ( ) ;
85
+ } ) ;
86
+
87
+ it ( 'shows survey when peer is required and completed the required peer grading' , ( ) => {
88
+ useAssessmentStepConfig . mockReturnValue ( {
56
89
settings : {
57
90
self : { required : false } ,
58
91
peer : { required : true , minNumberToGrade : 2 } ,
59
92
} ,
60
93
} ) ;
61
- useStepInfo . mockReturnValueOnce ( {
94
+ useStepInfo . mockReturnValue ( {
62
95
[ stepNames . peer ] : { numberOfAssessmentsCompleted : 2 } ,
63
96
} ) ;
64
- useGlobalState . mockReturnValueOnce ( {
65
- activeStepState : 'abitrairy ' ,
97
+ useGlobalState . mockReturnValue ( {
98
+ activeStepState : 'arbitrary ' ,
66
99
} ) ;
67
100
68
- expect ( React . useEffect ) . not . toHaveBeenCalled ( ) ;
69
- shallow ( < HotjarSurvey /> ) ;
101
+ render ( < HotjarSurvey /> ) ;
70
102
71
- const [ [ , [ isShowSurvey ] ] ] = React . useEffect . mock . calls ;
72
- expect ( isShowSurvey ) . toBe ( true ) ;
103
+ expect ( window . hj ) . toHaveBeenCalledWith (
104
+ 'event' ,
105
+ 'lms_openassessment_survey_mfe' ,
106
+ ) ;
73
107
} ) ;
74
108
75
- it ( 'should not show survey when peer is require but not completed the peer grading' , ( ) => {
76
- useAssessmentStepConfig . mockReturnValueOnce ( {
109
+ it ( 'does not show survey when peer is required but not completed the peer grading' , ( ) => {
110
+ useAssessmentStepConfig . mockReturnValue ( {
77
111
settings : {
78
112
self : { required : false } ,
79
113
peer : { required : true , minNumberToGrade : 2 } ,
80
114
} ,
81
115
} ) ;
82
- useStepInfo . mockReturnValueOnce ( {
116
+ useStepInfo . mockReturnValue ( {
83
117
[ stepNames . peer ] : { numberOfAssessmentsCompleted : 1 } ,
84
118
} ) ;
85
- useGlobalState . mockReturnValueOnce ( {
86
- activeStepState : 'abitrairy ' ,
119
+ useGlobalState . mockReturnValue ( {
120
+ activeStepState : 'arbitrary ' ,
87
121
} ) ;
88
122
89
- expect ( React . useEffect ) . not . toHaveBeenCalled ( ) ;
90
- shallow ( < HotjarSurvey /> ) ;
123
+ render ( < HotjarSurvey /> ) ;
91
124
92
- const [ [ , [ isShowSurvey ] ] ] = React . useEffect . mock . calls ;
93
- expect ( isShowSurvey ) . toBe ( false ) ;
125
+ expect ( window . hj ) . not . toHaveBeenCalled ( ) ;
94
126
} ) ;
95
127
96
- it ( 'should not show survey neither step is required' , ( ) => {
97
- useAssessmentStepConfig . mockReturnValueOnce ( {
128
+ it ( 'does not show survey when neither step is required' , ( ) => {
129
+ useAssessmentStepConfig . mockReturnValue ( {
98
130
settings : {
99
131
[ stepNames . self ] : { required : false } ,
100
132
[ stepNames . peer ] : { required : false } ,
101
133
} ,
102
134
} ) ;
103
- useGlobalState . mockReturnValueOnce ( {
104
- activeStepState : 'abitrairy ' ,
135
+ useGlobalState . mockReturnValue ( {
136
+ activeStepState : 'arbitrary ' ,
105
137
} ) ;
138
+ useStepInfo . mockReturnValue ( { } ) ;
139
+
140
+ render ( < HotjarSurvey /> ) ;
141
+
142
+ expect ( window . hj ) . not . toHaveBeenCalled ( ) ;
143
+ } ) ;
106
144
107
- expect ( React . useEffect ) . not . toHaveBeenCalled ( ) ;
145
+ it ( 'does not show survey when window.hj is not available' , ( ) => {
146
+ delete window . hj ;
147
+
148
+ useAssessmentStepConfig . mockReturnValue ( {
149
+ settings : {
150
+ self : { required : true } ,
151
+ peer : { required : false } ,
152
+ } ,
153
+ } ) ;
154
+ useGlobalState . mockReturnValue ( {
155
+ activeStepState : stepStates . done ,
156
+ } ) ;
157
+ useStepInfo . mockReturnValue ( { } ) ;
108
158
109
- shallow ( < HotjarSurvey /> ) ;
110
- const [ [ , [ isShowSurvey ] ] ] = React . useEffect . mock . calls ;
111
- expect ( isShowSurvey ) . toBe ( false ) ;
159
+ // Should not throw error when window.hj is undefined
160
+ expect ( ( ) => render ( < HotjarSurvey /> ) ) . not . toThrow ( ) ;
112
161
} ) ;
113
162
} ) ;
0 commit comments