1616
1717import { TestBed } from '@angular/core/testing' ;
1818import { RouterTestingModule } from '@angular/router/testing' ;
19- import { Map } from 'immutable' ;
19+ import { List , Map } from 'immutable' ;
2020
2121import { DataCollectionStrategy , Job } from 'app/models/job.model' ;
2222import { DataSharingType , Survey } from 'app/models/survey.model' ;
23+ import { Cardinality , MultipleChoice } from 'app/models/task/multiple-choice.model' ;
24+ import { Option } from 'app/models/task/option.model' ;
25+ import {
26+ TaskCondition ,
27+ TaskConditionExpression ,
28+ TaskConditionExpressionType ,
29+ TaskConditionMatchType ,
30+ } from 'app/models/task/task-condition.model' ;
2331import { Task , TaskType } from 'app/models/task/task.model' ;
2432import { DataStoreService } from 'app/services/data-store/data-store.service' ;
2533import { JobService } from 'app/services/job/job.service' ;
@@ -90,7 +98,7 @@ describe('JobService', () => {
9098 describe ( 'duplicateJob' , ( ) => {
9199 it ( 'should duplicate job with new IDs' , ( ) => {
92100 const oldTask = new Task ( 'task1' , TaskType . TEXT , 'Label' , false , 0 ) ;
93- const newTask = new Task ( 'task1 ' , TaskType . TEXT , 'Label' , false , 0 ) ;
101+ const newTask = new Task ( 'newTask1 ' , TaskType . TEXT , 'Label' , false , 0 ) ;
94102 const job = new Job (
95103 'job1' ,
96104 0 ,
@@ -108,8 +116,124 @@ describe('JobService', () => {
108116 expect ( newJob . id ) . toBe ( 'job2' ) ;
109117 expect ( newJob . name ) . toBe ( 'Copy of Job 1' ) ;
110118 expect ( newJob . color ) . toBe ( '#FFF' ) ;
111- expect ( newJob . tasks ?. get ( 'task1' ) ) . toEqual ( newTask ) ;
112- expect ( taskServiceSpy . duplicateTask ) . toHaveBeenCalledWith ( oldTask , true ) ;
119+ expect ( newJob . tasks ?. get ( 'newTask1' ) ) . toEqual ( newTask ) ;
120+ expect ( taskServiceSpy . duplicateTask ) . toHaveBeenCalledWith ( oldTask ) ;
121+ } ) ;
122+
123+ it ( 'should remap condition references to the duplicated task and option ids' , ( ) => {
124+ const sourceOption = new Option ( 'opt1' , 'A' , 'A' , 0 ) ;
125+ const sourceTask = new Task (
126+ 'src' ,
127+ TaskType . MULTIPLE_CHOICE ,
128+ 'Source' ,
129+ false ,
130+ 0 ,
131+ new MultipleChoice ( Cardinality . SELECT_ONE , List ( [ sourceOption ] ) )
132+ ) ;
133+ const dependentTask = new Task (
134+ 'dep' ,
135+ TaskType . TEXT ,
136+ 'Dependent' ,
137+ false ,
138+ 1 ,
139+ undefined ,
140+ new TaskCondition (
141+ TaskConditionMatchType . MATCH_ALL ,
142+ List ( [
143+ new TaskConditionExpression (
144+ TaskConditionExpressionType . ONE_OF_SELECTED ,
145+ 'src' ,
146+ List ( [ 'opt1' ] )
147+ ) ,
148+ ] )
149+ )
150+ ) ;
151+ const job = new Job (
152+ 'job1' ,
153+ 0 ,
154+ '#000' ,
155+ 'Job 1' ,
156+ Map ( { src : sourceTask , dep : dependentTask } ) ,
157+ DataCollectionStrategy . MIXED
158+ ) ;
159+
160+ const newSourceTask = new Task (
161+ 'newSrc' ,
162+ TaskType . MULTIPLE_CHOICE ,
163+ 'Source' ,
164+ false ,
165+ 0 ,
166+ new MultipleChoice (
167+ Cardinality . SELECT_ONE ,
168+ List ( [ new Option ( 'newOpt1' , 'A' , 'A' , 0 ) ] )
169+ )
170+ ) ;
171+ const newDependentTask = new Task (
172+ 'newDep' ,
173+ TaskType . TEXT ,
174+ 'Dependent' ,
175+ false ,
176+ 1 ,
177+ undefined ,
178+ dependentTask . condition
179+ ) ;
180+ dataStoreServiceSpy . generateId . and . returnValue ( 'job2' ) ;
181+ taskServiceSpy . duplicateTask . and . returnValues (
182+ newSourceTask ,
183+ newDependentTask
184+ ) ;
185+
186+ const newJob = service . duplicateJob ( job , '#FFF' ) ;
187+
188+ const remapped = newJob . tasks ?. get ( 'newDep' ) ;
189+ const expression = remapped ?. condition ?. expressions . first ( ) ;
190+ expect ( expression ?. taskId ) . toBe ( 'newSrc' ) ;
191+ expect ( expression ?. optionIds . toArray ( ) ) . toEqual ( [ 'newOpt1' ] ) ;
192+ } ) ;
193+
194+ it ( 'should drop condition expressions whose source task is missing' , ( ) => {
195+ const dependentTask = new Task (
196+ 'dep' ,
197+ TaskType . TEXT ,
198+ 'Dependent' ,
199+ false ,
200+ 0 ,
201+ undefined ,
202+ new TaskCondition (
203+ TaskConditionMatchType . MATCH_ALL ,
204+ List ( [
205+ new TaskConditionExpression (
206+ TaskConditionExpressionType . ONE_OF_SELECTED ,
207+ 'missing' ,
208+ List ( [ 'opt-missing' ] )
209+ ) ,
210+ ] )
211+ )
212+ ) ;
213+ const job = new Job (
214+ 'job1' ,
215+ 0 ,
216+ '#000' ,
217+ 'Job 1' ,
218+ Map ( { dep : dependentTask } ) ,
219+ DataCollectionStrategy . MIXED
220+ ) ;
221+
222+ const newDependentTask = new Task (
223+ 'newDep' ,
224+ TaskType . TEXT ,
225+ 'Dependent' ,
226+ false ,
227+ 0 ,
228+ undefined ,
229+ dependentTask . condition
230+ ) ;
231+ dataStoreServiceSpy . generateId . and . returnValue ( 'job2' ) ;
232+ taskServiceSpy . duplicateTask . and . returnValue ( newDependentTask ) ;
233+
234+ const newJob = service . duplicateJob ( job , '#FFF' ) ;
235+
236+ expect ( newJob . tasks ?. get ( 'newDep' ) ?. condition ?. expressions . size ) . toBe ( 0 ) ;
113237 } ) ;
114238 } ) ;
115239
0 commit comments