@@ -27,6 +27,8 @@ class ExportServiceSpec extends Specification {
27
27
def setup () {
28
28
fieldService = Mock (FieldService )
29
29
service. fieldService = fieldService
30
+ grailsApplication. config. exportCSVThreadPoolSize = 1
31
+ service. grailsApplication = grailsApplication
30
32
taskService = Mock (TaskService )
31
33
service. taskService = taskService
32
34
response = new GrailsMockHttpServletResponse ()
@@ -48,8 +50,8 @@ class ExportServiceSpec extends Specification {
48
50
mockDomain(Project , [project])
49
51
}
50
52
51
- private Task createTask () {
52
- Task task = new Task (transcriptions : new HashSet (), project :project)
53
+ private Task createTask (String externalIdentifier = ' ' ) {
54
+ Task task = new Task (transcriptions : new HashSet (), project :project, externalIdentifier : externalIdentifier )
53
55
project. tasks. add(task)
54
56
mockDomain(Task , [task])
55
57
@@ -71,6 +73,189 @@ class ExportServiceSpec extends Specification {
71
73
fields
72
74
}
73
75
76
+ def " Test non parrallel writes is working for larger tasks" () {
77
+ setup :
78
+ project. transcriptionsPerTask = 2
79
+ String userA = ' userA'
80
+ String userB = ' userB'
81
+
82
+ List allFields = new ArrayList ()
83
+
84
+ int numOfTasks = 100
85
+ for (int i= 1 ; i <= numOfTasks; i++ ) {
86
+ Task task = createTask(" image${ i} .jpq" )
87
+ List fields1 = transcribeTask(task, [[name :" scientificName" , value :" Magpie" ], [name :" individualCount" , value :" 10" ]], userA)
88
+ allFields. addAll(fields1)
89
+ List fields2 = transcribeTask(task, [[name :" scientificName" , value :" Crow" ], [name :" individualCount" , value :" 5" ]], userB)
90
+ allFields. addAll(fields2)
91
+ }
92
+
93
+ List<Task > taskList = project. tasks as List
94
+ List<String > fieldNames = taskOrTranscriptionFields + [" scientificName" , " individualCount" ]
95
+
96
+ when :
97
+ service. export_default(project, taskList, fieldNames, allFields, response)
98
+ List results = new CSVMapReader (new StringReader (response. text)). readAll()
99
+
100
+ then :
101
+ 1 * fieldService. getMaxRecordIndexByFieldForProject(project) >> [[' scientificName' , 0 ], [' individualCount' , 0 ]]
102
+ 1 * taskService. getUserMapFromTaskList(taskList) >> [(userA):[displayName :userA], (userB):[displayName :userB]]
103
+
104
+ and :
105
+ results. size() == 200
106
+ for (int i= 1 ; i <= numOfTasks; i++ ) {
107
+ results. findAll { it. externalIdentifier == " image${ i} .jpq" }. size() == 2
108
+ }
109
+ results. findAll{it. transcriberID == userA}. size() == numOfTasks
110
+ results. findAll{it. transcriberID == userB}. size() == numOfTasks
111
+ }
112
+
113
+ def " Test parrallel writes is working for larger tasks" () {
114
+ setup :
115
+ grailsApplication. config. exportCSVThreadPoolSize = 10
116
+ service. grailsApplication = grailsApplication
117
+
118
+ project. transcriptionsPerTask = 2
119
+ String userA = ' userA'
120
+ String userB = ' userB'
121
+
122
+ List allFields = new ArrayList ()
123
+
124
+ int numOfTasks = 100
125
+ for (int i= 1 ; i <= numOfTasks; i++ ) {
126
+ Task task = createTask(" image${ i} .jpq" )
127
+ List fields1 = transcribeTask(task, [[name :" scientificName" , value :" Magpie" ], [name :" individualCount" , value :" 10" ]], userA)
128
+ allFields. addAll(fields1)
129
+ List fields2 = transcribeTask(task, [[name :" scientificName" , value :" Crow" ], [name :" individualCount" , value :" 5" ]], userB)
130
+ allFields. addAll(fields2)
131
+ }
132
+
133
+ List<Task > taskList = project. tasks as List
134
+ List<String > fieldNames = taskOrTranscriptionFields + [" scientificName" , " individualCount" ]
135
+
136
+ when :
137
+ service. export_default(project, taskList, fieldNames, allFields, response)
138
+ List results = new CSVMapReader (new StringReader (response. text)). readAll()
139
+
140
+ then :
141
+ 1 * fieldService. getMaxRecordIndexByFieldForProject(project) >> [[' scientificName' , 0 ], [' individualCount' , 0 ]]
142
+ 1 * taskService. getUserMapFromTaskList(taskList) >> [(userA):[displayName :userA], (userB):[displayName :userB]]
143
+
144
+ and :
145
+ results. size() == 200
146
+ for (int i= 1 ; i <= numOfTasks; i++ ) {
147
+ results. findAll { it. externalIdentifier == " image${ i} .jpq" }. size() == 2
148
+ }
149
+ results. findAll{it. transcriberID == userA}. size() == 100
150
+ results. findAll{it. transcriberID == userB}. size() == 100
151
+ }
152
+
153
+ def " All project transcription tasks data can be exported in CSV form for multiple transcription project" () {
154
+ setup :
155
+ project. transcriptionsPerTask = 2
156
+ String userA = ' userA'
157
+ String userB = ' userB'
158
+ Task birdTask = createTask()
159
+ Task kangarooTask = createTask()
160
+ List birdFields1 = transcribeTask(birdTask, [[name :" scientificName" , value :" Magpie" ], [name :" individualCount" , value :" 10" ]], userA)
161
+ List birdFields2 = transcribeTask(birdTask, [[name :" scientificName" , value :" Crow" ], [name :" individualCount" , value :" 5" ]], userB)
162
+ List kangarooFields1 = transcribeTask(kangarooTask, [[name :" scientificName" , value :" Red Kangaroo" ], [name :" individualCount" , value :" 2" ]], userA)
163
+ List kangarooFields2 = transcribeTask(kangarooTask, [[name :" scientificName" , value :" Red Kangaroo" ], [name :" individualCount" , value :" 2" ]], userB)
164
+
165
+ List<Task > taskList = project. tasks as List
166
+ List<String > fieldNames = taskOrTranscriptionFields + [" scientificName" , " individualCount" ]
167
+
168
+ when :
169
+ service. export_default(project, taskList, fieldNames, birdFields1 + birdFields2 + kangarooFields1 + kangarooFields2, response)
170
+ List results = new CSVMapReader (new StringReader (response. text)). readAll()
171
+
172
+ then :
173
+ 1 * fieldService. getMaxRecordIndexByFieldForProject(project) >> [[' scientificName' , 0 ], [' individualCount' , 0 ]]
174
+ 1 * taskService. getUserMapFromTaskList(taskList) >> [(userA):[displayName :userA], (userB):[displayName :userB]]
175
+
176
+ and :
177
+ results. size() == 4 // not counting headers
178
+ results. findAll{it. transcriberID == userA && it. taskID == birdTask. id. toString() && it. scientificName == ' Magpie' }. size() == 1
179
+ results. findAll{it. transcriberID == userA && it. taskID == kangarooTask. id. toString() && it. scientificName == ' Red Kangaroo' }. size() == 1
180
+ results. findAll{it. transcriberID == userB && it. taskID == birdTask. id. toString() && it. scientificName == ' Crow' }. size() == 1
181
+ results. findAll{it. transcriberID == userB && it. taskID == kangarooTask. id. toString() && it. scientificName == ' Red Kangaroo' }. size() == 1
182
+ }
183
+
184
+ def " Partially transcribed project tasks data can be exported in CSV form for multiple transcription project" () {
185
+ setup :
186
+ project. transcriptionsPerTask = 2
187
+ String userA = ' userA'
188
+ String userB = ' userB'
189
+ Task birdTask = createTask()
190
+ Task kangarooTask = createTask()
191
+ List birdFields1 = transcribeTask(birdTask, [[name :" scientificName" , value :" Magpie" ], [name :" individualCount" , value :" 10" ]], userA)
192
+ List kangarooFields1 = transcribeTask(kangarooTask, [[name :" scientificName" , value :" Red Kangaroo" ], [name :" individualCount" , value :" 2" ]], userB)
193
+
194
+ List<Task > taskList = project. tasks as List
195
+ List<String > fieldNames = taskOrTranscriptionFields + [" scientificName" , " individualCount" ]
196
+
197
+ when :
198
+ service. export_default(project, taskList, fieldNames, birdFields1 + kangarooFields1, response)
199
+ List results = new CSVMapReader (new StringReader (response. text)). readAll()
200
+
201
+ then :
202
+ 1 * fieldService. getMaxRecordIndexByFieldForProject(project) >> [[' scientificName' , 0 ], [' individualCount' , 0 ]]
203
+ 1 * taskService. getUserMapFromTaskList(taskList) >> [(userA):[displayName :userA], (userB):[displayName :userB]]
204
+
205
+ and :
206
+ results. size() == 2 // not counting headers
207
+ results. findAll{it. transcriberID == userA && it. taskID == birdTask. id. toString() && it. scientificName == ' Magpie' }. size() == 1
208
+ results. findAll{it. transcriberID == userB && it. taskID == kangarooTask. id. toString() && it. scientificName == ' Red Kangaroo' }. size() == 1
209
+ }
210
+
211
+ def " For multiple transcription project with tasks that have not been transcribed, data can be exported in CSV" () {
212
+ setup :
213
+ project. transcriptionsPerTask = 2
214
+ String macpieImage = ' macpieImage.jpg'
215
+ String kangarooImage = ' kangarooImage.jpg'
216
+ Task birdTask = createTask(macpieImage)
217
+ Task kangarooTask = createTask(kangarooImage)
218
+
219
+ List<Task > taskList = project. tasks as List
220
+ List<String > fieldNames = taskOrTranscriptionFields
221
+
222
+ when :
223
+ service. export_default(project, taskList, fieldNames, [], response)
224
+ List results = new CSVMapReader (new StringReader (response. text)). readAll()
225
+
226
+ then :
227
+ 1 * fieldService. getMaxRecordIndexByFieldForProject(project) >> []
228
+ 1 * taskService. getUserMapFromTaskList(taskList) >> [:]
229
+
230
+ and :
231
+ results. size() == 2
232
+ results. find{it. taskID == kangarooTask. id. toString()}. externalIdentifier == kangarooImage
233
+ results. find{it. taskID == birdTask. id. toString()}. externalIdentifier == macpieImage
234
+ }
235
+
236
+ def " For single transcription project with tasks that have not been transcribed, data can be exported in CSV" () {
237
+ setup :
238
+ project. transcriptionsPerTask = 1
239
+ String macpieImage = ' macpieImage.jpg'
240
+ Task birdTask = createTask(macpieImage)
241
+
242
+ List<Task > taskList = project. tasks as List
243
+ List<String > fieldNames = taskOrTranscriptionFields
244
+
245
+ when :
246
+ service. export_default(project, taskList, fieldNames, [], response)
247
+ List results = new CSVMapReader (new StringReader (response. text)). readAll()
248
+
249
+ then :
250
+ 1 * fieldService. getMaxRecordIndexByFieldForProject(project) >> []
251
+ 1 * taskService. getUserMapFromTaskList(taskList) >> [:]
252
+
253
+ and :
254
+ results. size() == 1
255
+ results[0 ]. externalIdentifier == macpieImage
256
+ }
257
+
258
+
74
259
def " All project task data can be exported in CSV form for single transcription projects" () {
75
260
setup :
76
261
String userId = ' 1234'
0 commit comments