@@ -9,6 +9,8 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
9
9
let assessmentRepository_getStub ;
10
10
let assessmentRepository_updateLastQuestionDateStub ;
11
11
let assessmentRepository_updateWhenNewChallengeIsAskedStub ;
12
+ let answerRepository_findByAssessmentStub ;
13
+ let challengeRepository_getStub ;
12
14
let evaluationUsecases_getNextChallengeForPreviewStub ;
13
15
let evaluationUsecases_getNextChallengeForDemoStub ;
14
16
let evaluationUsecases_getNextChallengeForCampaignAssessmentStub ;
@@ -22,6 +24,8 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
22
24
assessmentRepository_getStub = sinon . stub ( ) . named ( 'get' ) ;
23
25
assessmentRepository_updateLastQuestionDateStub = sinon . stub ( ) . named ( 'updateLastQuestionDate' ) ;
24
26
assessmentRepository_updateWhenNewChallengeIsAskedStub = sinon . stub ( ) . named ( 'updateWhenNewChallengeIsAsked' ) ;
27
+ answerRepository_findByAssessmentStub = sinon . stub ( ) . named ( 'findByAssessment' ) ;
28
+ challengeRepository_getStub = sinon . stub ( ) . named ( 'get' ) ;
25
29
evaluationUsecases_getNextChallengeForPreviewStub = sinon . stub ( ) . named ( 'getNextChallengeForPreview' ) ;
26
30
evaluationUsecases_getNextChallengeForDemoStub = sinon . stub ( ) . named ( 'getNextChallengeForDemo' ) ;
27
31
evaluationUsecases_getNextChallengeForCampaignAssessmentStub = sinon
@@ -34,8 +38,11 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
34
38
. stub ( )
35
39
. named ( 'selectNextCertificationChallenge' ) ;
36
40
preventStubsToBeCalledUnexpectedly ( [
41
+ assessmentRepository_getStub ,
37
42
assessmentRepository_updateLastQuestionDateStub ,
38
43
assessmentRepository_updateWhenNewChallengeIsAskedStub ,
44
+ answerRepository_findByAssessmentStub ,
45
+ challengeRepository_getStub ,
39
46
evaluationUsecases_getNextChallengeForPreviewStub ,
40
47
evaluationUsecases_getNextChallengeForDemoStub ,
41
48
evaluationUsecases_getNextChallengeForCampaignAssessmentStub ,
@@ -49,6 +56,14 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
49
56
updateWhenNewChallengeIsAsked : assessmentRepository_updateWhenNewChallengeIsAskedStub ,
50
57
} ;
51
58
59
+ const answerRepository = {
60
+ findByAssessment : answerRepository_findByAssessmentStub ,
61
+ } ;
62
+
63
+ const challengeRepository = {
64
+ get : challengeRepository_getStub ,
65
+ } ;
66
+
52
67
const evaluationUsecases = {
53
68
getNextChallengeForPreview : evaluationUsecases_getNextChallengeForPreviewStub ,
54
69
getNextChallengeForDemo : evaluationUsecases_getNextChallengeForDemoStub ,
@@ -65,6 +80,8 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
65
80
userId,
66
81
locale,
67
82
assessmentRepository,
83
+ answerRepository,
84
+ challengeRepository,
68
85
evaluationUsecases,
69
86
certificationEvaluationRepository,
70
87
} ;
@@ -77,19 +94,92 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
77
94
assessment = domainBuilder . buildAssessment ( { id : assessmentId , type : Assessment . types . PREVIEW } ) ;
78
95
} ) ;
79
96
80
- // eslint-disable-next-line mocha/no-setup-in-describe
81
- Object . values ( Assessment . states )
82
- . filter ( ( assessmentState ) => assessmentState !== Assessment . states . STARTED )
83
- . forEach ( ( assessmentState ) => {
84
- it ( `should throw a AssessmentEndedError when assessment is ${ assessmentState } ` , async function ( ) {
85
- assessment . state = assessmentState ;
86
- assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
97
+ /* eslint-disable mocha/no-setup-in-describe */
98
+ [
99
+ Assessment . states . ABORTED ,
100
+ Assessment . states . COMPLETED ,
101
+ Assessment . states . ENDED_BY_SUPERVISOR ,
102
+ Assessment . states . ENDED_DUE_TO_FINALIZATION ,
103
+ ] . forEach ( ( assessmentState ) => {
104
+ it ( `should throw a AssessmentEndedError when assessment is ${ assessmentState } ` , async function ( ) {
105
+ assessment . state = assessmentState ;
106
+ assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
87
107
88
- const err = await catchErr ( getNextChallenge ) ( dependencies ) ;
108
+ const err = await catchErr ( getNextChallenge ) ( dependencies ) ;
89
109
90
- expect ( err ) . to . be . instanceOf ( AssessmentEndedError ) ;
110
+ expect ( err ) . to . be . instanceOf ( AssessmentEndedError ) ;
111
+ } ) ;
112
+ } ) ;
113
+ /* eslint-enable mocha/no-setup-in-describe */
114
+ } ) ;
115
+
116
+ context ( 'latest challenge asked' , function ( ) {
117
+ context ( 'when there are no challenge saved as latest challenge asked in assessment' , function ( ) {
118
+ it ( 'should compute next challenge' , async function ( ) {
119
+ const assessment = domainBuilder . buildAssessment ( {
120
+ state : Assessment . states . STARTED ,
121
+ type : Assessment . types . PREVIEW ,
122
+ lastChallengeId : null ,
91
123
} ) ;
124
+ assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
125
+ assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
126
+ assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
127
+ const challenge = domainBuilder . buildChallenge ( { id : 'challengeForPreview' } ) ;
128
+ evaluationUsecases_getNextChallengeForPreviewStub . withArgs ( { } ) . resolves ( challenge ) ;
129
+ answerRepository_findByAssessmentStub . withArgs ( assessment . id ) . resolves ( [ domainBuilder . buildAnswer ( ) ] ) ;
130
+
131
+ const actualNextChallenge = await getNextChallenge ( dependencies ) ;
132
+
133
+ expect ( actualNextChallenge ) . to . deepEqualInstance ( challenge ) ;
92
134
} ) ;
135
+ } ) ;
136
+
137
+ context ( 'when the latest challenge asked has been answered' , function ( ) {
138
+ it ( 'should compute next challenge' , async function ( ) {
139
+ const assessment = domainBuilder . buildAssessment ( {
140
+ state : Assessment . states . STARTED ,
141
+ type : Assessment . types . PREVIEW ,
142
+ lastChallengeId : 'previousChallengeId' ,
143
+ } ) ;
144
+ assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
145
+ assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
146
+ assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
147
+ const challenge = domainBuilder . buildChallenge ( { id : 'challengeForPreview' } ) ;
148
+ evaluationUsecases_getNextChallengeForPreviewStub . withArgs ( { } ) . resolves ( challenge ) ;
149
+ answerRepository_findByAssessmentStub
150
+ . withArgs ( assessment . id )
151
+ . resolves ( [ domainBuilder . buildAnswer ( { challengeId : 'previousChallengeId' } ) ] ) ;
152
+
153
+ const actualNextChallenge = await getNextChallenge ( dependencies ) ;
154
+
155
+ expect ( actualNextChallenge ) . to . deepEqualInstance ( challenge ) ;
156
+ } ) ;
157
+ } ) ;
158
+
159
+ context ( 'when the latest challenge asked has not been answered yet' , function ( ) {
160
+ it ( 'should return latest challenge' , async function ( ) {
161
+ const assessment = domainBuilder . buildAssessment ( {
162
+ state : Assessment . states . STARTED ,
163
+ type : Assessment . types . PREVIEW ,
164
+ lastChallengeId : 'previousChallengeId' ,
165
+ } ) ;
166
+ assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
167
+ assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
168
+ assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
169
+ const previousChallenge = domainBuilder . buildChallenge ( { id : 'previousChallengeId' } ) ;
170
+ answerRepository_findByAssessmentStub
171
+ . withArgs ( assessment . id )
172
+ . resolves ( [
173
+ domainBuilder . buildAnswer ( { challengeId : 'someChallengeId' } ) ,
174
+ domainBuilder . buildAnswer ( { challengeId : 'someOtherChallengeId' } ) ,
175
+ ] ) ;
176
+ challengeRepository_getStub . withArgs ( 'previousChallengeId' ) . resolves ( previousChallenge ) ;
177
+
178
+ const actualNextChallenge = await getNextChallenge ( dependencies ) ;
179
+
180
+ expect ( actualNextChallenge ) . to . deepEqualInstance ( previousChallenge ) ;
181
+ } ) ;
182
+ } ) ;
93
183
} ) ;
94
184
95
185
context ( 'Assessment types' , function ( ) {
@@ -104,6 +194,7 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
104
194
assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
105
195
assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
106
196
assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
197
+ answerRepository_findByAssessmentStub . resolves ( [ ] ) ;
107
198
} ) ;
108
199
109
200
it ( 'should call usecase and return value from preview usecase' , async function ( ) {
@@ -126,6 +217,7 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
126
217
assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
127
218
assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
128
219
assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
220
+ answerRepository_findByAssessmentStub . resolves ( [ ] ) ;
129
221
} ) ;
130
222
131
223
it ( 'should call usecase and return value from demo usecase' , async function ( ) {
@@ -148,6 +240,7 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
148
240
assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
149
241
assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
150
242
assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
243
+ answerRepository_findByAssessmentStub . resolves ( [ ] ) ;
151
244
} ) ;
152
245
153
246
it ( 'should call usecase and return value from campaign usecase' , async function ( ) {
@@ -172,6 +265,7 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
172
265
assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
173
266
assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
174
267
assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
268
+ answerRepository_findByAssessmentStub . resolves ( [ ] ) ;
175
269
} ) ;
176
270
177
271
it ( 'should call usecase and return value from competence evaluation usecase' , async function ( ) {
@@ -197,6 +291,7 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
197
291
assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
198
292
assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
199
293
assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
294
+ answerRepository_findByAssessmentStub . resolves ( [ ] ) ;
200
295
} ) ;
201
296
202
297
it ( 'should call usecase and return value from certification usecase' , async function ( ) {
@@ -222,6 +317,7 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
222
317
assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
223
318
assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
224
319
assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
320
+ answerRepository_findByAssessmentStub . resolves ( [ ] ) ;
225
321
} ) ;
226
322
227
323
it ( 'should return null' , async function ( ) {
@@ -246,6 +342,7 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
246
342
} ) ;
247
343
evaluationUsecases_getNextChallengeForPreviewStub . withArgs ( { } ) . resolves ( { id : 'someChallengeId' } ) ;
248
344
assessmentRepository_updateWhenNewChallengeIsAskedStub . resolves ( ) ;
345
+ answerRepository_findByAssessmentStub . resolves ( [ ] ) ;
249
346
} ) ;
250
347
251
348
afterEach ( async function ( ) {
@@ -267,6 +364,7 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
267
364
context ( 'updating last challenge asked' , function ( ) {
268
365
beforeEach ( function ( ) {
269
366
assessmentRepository_updateLastQuestionDateStub . resolves ( ) ;
367
+ answerRepository_findByAssessmentStub . resolves ( [ ] ) ;
270
368
} ) ;
271
369
272
370
context ( 'when no next challenge has been found' , function ( ) {
@@ -293,6 +391,9 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
293
391
type : Assessment . types . PREVIEW ,
294
392
lastChallengeId : 'currentChallengeId' ,
295
393
} ) ;
394
+ answerRepository_findByAssessmentStub . resolves ( [
395
+ domainBuilder . buildAnswer ( { challengeId : 'currentChallengeId' } ) ,
396
+ ] ) ;
296
397
assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
297
398
evaluationUsecases_getNextChallengeForPreviewStub
298
399
. withArgs ( { } )
@@ -312,6 +413,9 @@ describe('Shared | Unit | Domain | Use Cases | get-next-challenge', function ()
312
413
type : Assessment . types . PREVIEW ,
313
414
lastChallengeId : 'previousChallengeId' ,
314
415
} ) ;
416
+ answerRepository_findByAssessmentStub . resolves ( [
417
+ domainBuilder . buildAnswer ( { challengeId : 'previousChallengeId' } ) ,
418
+ ] ) ;
315
419
assessmentRepository_getStub . withArgs ( assessmentId ) . resolves ( assessment ) ;
316
420
evaluationUsecases_getNextChallengeForPreviewStub
317
421
. withArgs ( { } )
0 commit comments