kgrift 1.3.108

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/KGrift/Gemfile +22 -0
  3. data/KGrift/README.md +66 -0
  4. data/KGrift/bin/kgrift +11 -0
  5. data/KGrift/grifter.yml +224 -0
  6. data/KGrift/internal_test_graphs/basic_test_graph_definition.yml +2915 -0
  7. data/KGrift/internal_test_graphs/unicode_test_graph_definition.yml +3070 -0
  8. data/KGrift/knewton_grifts/analytics_grifts.rb +103 -0
  9. data/KGrift/knewton_grifts/async_helper_grifts.rb +63 -0
  10. data/KGrift/knewton_grifts/authenticator_grifts.rb +46 -0
  11. data/KGrift/knewton_grifts/basic_grifts.rb +29 -0
  12. data/KGrift/knewton_grifts/batch_grifts.rb +14 -0
  13. data/KGrift/knewton_grifts/content_collection_grifts.rb +204 -0
  14. data/KGrift/knewton_grifts/content_collection_v1_grifts.rb +521 -0
  15. data/KGrift/knewton_grifts/content_eid_grifts.rb +41 -0
  16. data/KGrift/knewton_grifts/copy_grifts.rb +151 -0
  17. data/KGrift/knewton_grifts/deprecated_graph_and_taxonomy_grifts.rb +353 -0
  18. data/KGrift/knewton_grifts/goal_grifts.rb +203 -0
  19. data/KGrift/knewton_grifts/graph_and_taxonomy_grifts.rb +136 -0
  20. data/KGrift/knewton_grifts/graph_create_grifts.rb +34 -0
  21. data/KGrift/knewton_grifts/graph_query_grifts.rb +448 -0
  22. data/KGrift/knewton_grifts/graph_tools_grifts.rb +151 -0
  23. data/KGrift/knewton_grifts/graph_validation_grifts.rb +447 -0
  24. data/KGrift/knewton_grifts/helper_grifts.rb +92 -0
  25. data/KGrift/knewton_grifts/jmeter_data_grifts.rb +56 -0
  26. data/KGrift/knewton_grifts/learning_instance_grifts.rb +46 -0
  27. data/KGrift/knewton_grifts/looper_grifts.rb +34 -0
  28. data/KGrift/knewton_grifts/moxy_grifts.rb +64 -0
  29. data/KGrift/knewton_grifts/oauth_grifts.rb +182 -0
  30. data/KGrift/knewton_grifts/partner_grifts.rb +70 -0
  31. data/KGrift/knewton_grifts/partner_support_grifts.rb +85 -0
  32. data/KGrift/knewton_grifts/recommendation_setup_grifts.rb +215 -0
  33. data/KGrift/knewton_grifts/registration_grifts.rb +159 -0
  34. data/KGrift/knewton_grifts/registration_info_grifts.rb +23 -0
  35. data/KGrift/knewton_grifts/report_grifts.rb +122 -0
  36. data/KGrift/knewton_grifts/shell_command_grifts.rb +21 -0
  37. data/KGrift/knewton_grifts/student_flow_grifts.rb +560 -0
  38. data/KGrift/knewton_grifts/tag_grifts.rb +41 -0
  39. data/KGrift/knewton_grifts/test_data_grifts.rb +328 -0
  40. data/KGrift/knewton_grifts/test_user_grifts.rb +264 -0
  41. data/KGrift/lib/dtrace.rb +20 -0
  42. data/KGrift/lib/kgrift.rb +7 -0
  43. data/KGrift/test_data_generators/basic_book_and_taxonomies.rb +35 -0
  44. data/KGrift/test_data_generators/lo_test_graph.rb +34 -0
  45. data/KGrift/test_data_generators/partner_owned_book_and_taxonomies.rb +28 -0
  46. data/KGrift/test_data_generators/partner_owned_book_and_taxonomies_unicode.rb +28 -0
  47. data/KGrift/test_data_generators/sandcastle_book_and_taxonomies.rb +13 -0
  48. data/KGrift/test_data_generators/sandcastle_book_and_taxonomies.yml +3709 -0
  49. data/KGrift/test_data_generators/sandcastle_graph.rb +8 -0
  50. data/KGrift/test_data_generators/sandcastle_graph_definition.json +4483 -0
  51. data/KGrift/test_data_generators/sandcastle_graph_full.rb +7 -0
  52. data/KGrift/test_data_generators/sandcastle_taxonomies.yml +378 -0
  53. data/KGrift/test_data_generators/sandcastle_with_taxons.rb +56 -0
  54. data/KGrift/test_data_generators/sandcastle_with_taxons.yml +3994 -0
  55. data/KGrift/test_data_generators/test_users_and_partners.rb +76 -0
  56. data/kgrift.gemspec +43 -0
  57. metadata +144 -0
@@ -0,0 +1,521 @@
1
+
2
+ # return a list of all inventories
3
+ def get_inventories_v1
4
+ Log.info "getting all inventories"
5
+ coco.get "/v1/cc/admin/inventories"
6
+ end
7
+
8
+ def create_inventory_admin_v1 partner_id, new_inventory_id=nil
9
+ new_inventory_id = "V1_KGriftTestInventory_#{random_string(16)}" if new_inventory_id.nil?
10
+ Log.info "Admin creating an inventory - partner_id: #{partner_id} - inventory_id: #{new_inventory_id}"
11
+ # response = create_modules_admin partner_id, new_inventory_id
12
+ response = coco.post "/v1/cc/admin/#{partner_id}/#{URI.encode new_inventory_id}/inventory", ''
13
+
14
+ {
15
+ 'id' => new_inventory_id,
16
+ 'inventory_id' => new_inventory_id,
17
+ 'partner_id' => partner_id,
18
+ 'inventory' => response,
19
+ }
20
+ end
21
+
22
+ # this is used to make production inventories for real partners
23
+ def create_prod_inventory_admin_v1 partner_id, new_inventory_id
24
+ set_prod_mode
25
+ set_account :prod_knerd
26
+ create_inventory_admin_v1 partner_id, new_inventory_id
27
+ end
28
+
29
+ def delete_inventory_admin_v1 partner_id, inventory_id
30
+ Log.info "Admin deleting an inventory - partner_id: #{partner_id}"
31
+ coco.delete "/v1/cc/admin/#{partner_id}/#{inventory_id}/inventory"
32
+ end
33
+
34
+ def get_all_v1_inventories_for_partner partner_id
35
+ invs = get_inventories_v1['partner_inventories']
36
+ invs.select!{|i| i['partner_id'] == partner_id}
37
+ end
38
+
39
+ def delete_all_v1_inventories_for_partner partner_id
40
+ invs = get_inventories_v1['partner_inventories']
41
+ invs.select!{|i| i['partner_id'] == partner_id}
42
+ inv_ids = invs.map{|i| i['inventory_id']}
43
+ inv_ids.each do |inv_id|
44
+ delete_inventory_admin_v1 partner_id, inv_id
45
+ end
46
+ end
47
+
48
+ def get_inventory_admin_v1 partner_id, inventory_id, query_params={}
49
+ Log.info "Admin getting inventory - partner_id: #{partner_id} - inventory_id: #{inventory_id}"
50
+ coco.get "/v1/cc/admin/#{partner_id}/#{inventory_id}?#{URI.encode_www_form query_params}"
51
+ end
52
+
53
+ def get_inventory_v1 inventory_id, query_params={}
54
+ Log.info "getting inventory - inventory_id: #{inventory_id}"
55
+ coco.get "/v1/cc/inventory/#{inventory_id}?#{URI.encode_www_form query_params}"
56
+ end
57
+
58
+ def check_inventory_existence_v1 partner_id, inventory_id
59
+ Log.info "Admin checking inventory existence - partner_id: #{partner_id} - inventory_id: #{inventory_id}"
60
+ coco.head "/v1/cc/admin/#{partner_id}/#{inventory_id}/inventory"
61
+ end
62
+
63
+ # build out a basic module object, ready to be created directly
64
+ # or you can merge in customizations
65
+ def test_module_object_v1 params={}
66
+ params = {
67
+ "module_id" => 'KGrift V1 test module ' + random_uuid,
68
+ "module_name" => random_string,
69
+ "module_version" => random_string,
70
+ "module_type" => ['instruction', 'assessment', 'both'].sample,
71
+ "module_url" => "http://kgriftlms.com/#{random_string}",
72
+ 'module_metadata' => ["some-test-metadata",random_string],
73
+ }.merge(params)
74
+ end
75
+
76
+ # create a batch of modules against some inventory
77
+ def create_modules_v1 inventory_id, modules=[]
78
+ modules << test_module_object_v1 if modules.empty?
79
+ Log.info "Creating '#{modules.length}' modules for inventory_id: #{inventory_id}"
80
+ coco.post "/v1/cc/inventory/#{inventory_id}/modules", modules
81
+ end
82
+ alias :update_modules_v1 :create_modules_v1
83
+
84
+ # create a batch of modules against some inventory
85
+ def create_modules_admin_v1 partner_id, inventory_id, modules=[]
86
+ modules << test_module_object_v1 if modules.empty?
87
+ Log.info "Admin creating '#{modules.length}' modules for inventory - partner_id: #{partner_id} - inventory_id: #{inventory_id}"
88
+ coco.post "/v1/cc/admin/#{partner_id}/#{inventory_id}/modules", modules
89
+ end
90
+ alias :update_modules_admin_v1 :create_modules_admin_v1
91
+
92
+ # get a inventory module
93
+ def get_inventory_module_v1 inventory_id, module_id
94
+ Log.info "Getting module - inventory_id: #{inventory_id} - module_id: #{module_id}"
95
+ coco.get "/v1/cc/inventory/#{URI.encode inventory_id}/module/#{URI.encode module_id}"
96
+ end
97
+
98
+ # get a single inventory module
99
+ def get_inventory_module_admin_v1 partner_id, inventory_id, module_id
100
+ Log.info "Admin getting module - partner_id: #{partner_id} - inventory_id: #{inventory_id} - module_id: #{module_id}"
101
+ coco.get "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/module/#{URI.encode module_id}"
102
+ end
103
+
104
+ # delete a module
105
+ def delete_module_v1 inventory_id, module_id
106
+ Log.info "Deleting inventory module - inventory_id: #{inventory_id} - module_id: #{module_id}"
107
+ coco.delete "/v1/cc/inventory/#{inventory_id}/module/#{URI.encode module_id}"
108
+ end
109
+
110
+ # delete a module as a knerd
111
+ def delete_module_admin_v1 partner_id, inventory_id, module_id
112
+ Log.info "Admin deleting inventory module - partner_id: #{partner_id} - inventory_id: #{inventory_id} - module_id: #{module_id}"
113
+ coco.do_request :delete, "/v1/cc/admin/#{partner_id}/#{inventory_id}/module/#{URI.encode module_id}", {}
114
+ end
115
+
116
+ # mark a module mapped
117
+ def mark_module_mapped_v1 partner_id, inventory_id, module_id, module_version
118
+ Log.info "Marking module mapped for inventory - partner_id: #{partner_id} - inventory_id: #{inventory_id} - module_id: #{module_id} - module_version: #{module_version}"
119
+ coco.put "/v1/cc/admin/#{partner_id}/#{inventory_id}/map", {
120
+ 'module_id' => module_id,
121
+ 'module_version' => module_version,
122
+ }
123
+ end
124
+
125
+ # this is a useful grift for testing purposes
126
+ # it will ensure an inventory has b/t 200 and 400 modules
127
+ # This is a good way to ensure that tests dont keep creating
128
+ # modules and never delete them
129
+ def attempt_to_set_number_of_test_modules partner_id, inventory_id, opts={}
130
+ opts = {
131
+ min: 150,
132
+ max: 300,
133
+ }.merge(opts)
134
+
135
+ as_account :knerd do
136
+ inv = get_inventory_admin_v1 partner_id, inventory_id
137
+ num_mods = inv['modules'].length
138
+ num_needed = opts[:min] - num_mods
139
+ num_to_delete = num_mods - opts[:max]
140
+ if num_needed > 0
141
+ mods = num_needed.times.map{ test_module_object_v1}
142
+ Log.info "Adding #{num_needed} modules to bring inventory to #{opts[:min]} modules"
143
+ mods.each_slice(50) do |slice|
144
+ create_modules_admin_v1 partner_id, inventory_id, slice
145
+ end
146
+ end
147
+ if num_to_delete > 0
148
+ Log.info "Deleting #{num_to_delete} modules to bring inventory to #{opts[:max]} modules"
149
+ mod_ids = inv['modules'].map{|m| m['module_id']}.shuffle
150
+ # lets be fast aboout it though and use concurrent requests...
151
+ connection_pool = Typhoeus::Hydra.new(:max_concurrency => 8)
152
+ responses = []
153
+ coco.conn.in_parallel(connection_pool) do
154
+ num_to_delete.times do |i|
155
+ responses << kapi.conn.send(:delete) do |request|
156
+ request.headers['Content-Type'] = 'application/json'
157
+ request.headers['Authorization'] = kapi.headers['Authorization']
158
+ request.url "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/module/#{URI.encode mod_ids[i]}"
159
+ end
160
+ end
161
+ end
162
+ response_codes = responses.map{|r| r.status }
163
+ Log.debug "Responses:\n#{response_codes.join(', ')}"
164
+ end
165
+ end
166
+ nil
167
+ end
168
+
169
+ def attempt_to_set_number_of_test_taxons partner_id, inventory_id, opts={}
170
+ opts = {
171
+ min: 150,
172
+ max: 300,
173
+ }.merge(opts)
174
+
175
+ as_account :knerd do
176
+ inv = get_inventory_taxons_admin_v1 partner_id, inventory_id
177
+ num_taxons = inv['taxons'].length
178
+ num_needed = opts[:min] - num_taxons
179
+ num_to_delete = num_taxons - opts[:max]
180
+ if num_needed > 0
181
+ taxons = num_needed.times.map{ test_taxon_object_v1 }
182
+ Log.info "Adding #{num_needed} taxons to bring inventory to #{opts[:min]} taxons"
183
+ taxons.each_slice(50) do |slice|
184
+ create_taxons_admin_v1 partner_id, inventory_id, slice
185
+ end
186
+ end
187
+ if num_to_delete > 0
188
+ Log.info "Deleting #{num_to_delete} taxons to bring inventory to #{opts[:max]} taxons"
189
+ taxon_ids = inv['taxons'].map{|m| m['taxon_id']}.shuffle
190
+ # lets be fast aboout it though and use concurrent requests...
191
+ connection_pool = Typhoeus::Hydra.new(:max_concurrency => 8)
192
+ responses = []
193
+ coco.conn.in_parallel(connection_pool) do
194
+ num_to_delete.times do |i|
195
+ responses << kapi.conn.send(:delete) do |request|
196
+ request.headers['Content-Type'] = 'application/json'
197
+ request.headers['Authorization'] = kapi.headers['Authorization']
198
+ request.url "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/taxon/#{URI.encode taxon_ids[i]}"
199
+ end
200
+ end
201
+ end
202
+ response_codes = responses.map{|r| r.status }
203
+ Log.debug "Responses:\n#{response_codes.join(', ')}"
204
+ end
205
+ end
206
+ nil
207
+ end
208
+
209
+ def attempt_to_set_number_of_test_containers partner_id, inventory_id, opts={}
210
+ opts = {
211
+ min: 150,
212
+ max: 300,
213
+ }.merge(opts)
214
+
215
+ as_account :knerd do
216
+ inv = get_inventory_containers_admin_v1 partner_id, inventory_id
217
+ num_containers = inv['containers'].length
218
+ num_needed = opts[:min] - num_containers
219
+ num_to_delete = num_containers - opts[:max]
220
+ if num_needed > 0
221
+ containers = num_needed.times.map{ test_container_object_v1 }
222
+ Log.info "Adding #{num_needed} containers to bring inventory to #{opts[:min]} containers"
223
+ containers.each_slice(50) do |slice|
224
+ create_containers_admin_v1 partner_id, inventory_id, slice
225
+ end
226
+ end
227
+ if num_to_delete > 0
228
+ Log.info "Deleting #{num_to_delete} containers to bring inventory to #{opts[:max]} containers"
229
+ container_ids = inv['containers'].map{|m| m['container_id']}.shuffle
230
+ # lets be fast aboout it though and use concurrent requests...
231
+ connection_pool = Typhoeus::Hydra.new(:max_concurrency => 8)
232
+ responses = []
233
+ coco.conn.in_parallel(connection_pool) do
234
+ num_to_delete.times do |i|
235
+ responses << kapi.conn.send(:delete) do |request|
236
+ request.headers['Content-Type'] = 'application/json'
237
+ request.headers['Authorization'] = kapi.headers['Authorization']
238
+ request.url "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/container/#{URI.encode container_ids[i]}"
239
+ end
240
+ end
241
+ end
242
+ response_codes = responses.map{|r| r.status }
243
+ Log.debug "Responses:\n#{response_codes.join(', ')}"
244
+ end
245
+ end
246
+ nil
247
+ end
248
+
249
+
250
+ def test_taxon_object_v1 params={}
251
+ params = {
252
+ "taxon_id" => 'TEST_TAXON:Foo|' + random_uuid,
253
+ "taxon_name" => "TEST_TAXON_#{random_string}",
254
+ "modules" => [],
255
+ "containers" => []
256
+ }.merge(params)
257
+ end
258
+
259
+ def create_taxons_admin_v1 partner_id, inventory_id, taxons=[]
260
+ taxons << test_taxon_object_v1 if taxons.empty?
261
+ Log.info "Admin creating taxons - partner_id: #{partner_id} - inventory_id: #{inventory_id} - taxons: #{taxons}"
262
+ coco.post "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/taxons", taxons
263
+ end
264
+ alias :update_taxons_admin_v1 :create_taxons_admin_v1
265
+
266
+ def get_inventory_taxons_admin_v1 partner_id, inventory_id, query_params={}
267
+ Log.info "Admin getting taxons - partner_id: #{partner_id} - inventory_id: #{inventory_id}"
268
+ coco.get "/v1/cc/admin/#{partner_id}/#{inventory_id}/taxons?#{URI.encode_www_form query_params}"
269
+ end
270
+
271
+ def get_module_taxons_admin_v1 partner_id, inventory_id, module_id
272
+ Log.info "Admin getting taxons - partner_id: #{partner_id} - inventory_id: #{inventory_id} - module_id: #{module_id}"
273
+ coco.get "/v1/cc/admin/#{partner_id}/#{inventory_id}/taxons/#{URI.encode module_id}"
274
+ end
275
+
276
+ def delete_taxons_admin_v1 partner_id, inventory_id, taxon_id
277
+ Log.info "Admin deleting taxons - partner_id: #{partner_id} - inventory_id: #{inventory_id} - taxon_id: #{taxon_id}"
278
+ coco.delete "/v1/cc/admin/#{partner_id}/#{inventory_id}/taxon/#{URI.encode taxon_id}"
279
+ end
280
+
281
+ def create_taxons_v1 inventory_id, taxons=[]
282
+ taxons << test_taxon_object_v1 if taxons.empty?
283
+ Log.info "Partner creating taxons - inventory_id: #{inventory_id} - taxons: #{taxons}"
284
+ coco.post "/v1/cc/inventory/#{URI.encode inventory_id}/taxons", taxons
285
+ end
286
+
287
+ def delete_taxons_v1 inventory_id, taxon_id
288
+ Log.info "Partner deleting taxons - inventory_id: #{inventory_id} - taxon_id: #{taxon_id}"
289
+ coco.delete "/v1/cc/inventory/#{inventory_id}/taxon/#{URI.encode taxon_id}"
290
+ end
291
+
292
+ def test_container_object_v1 params={}
293
+ params = {
294
+ "container_id" => 'TEST_CONTAINER_' + random_uuid,
295
+ "modules" => [],
296
+ "container_name" => nil,
297
+ "container_url" => "http://kgriftlms.com/#{random_string(rand(10))}",
298
+ "container_type" => ['presentation', 'target', 'both'].sample(),
299
+ "container_metadata" => []
300
+ }.merge(params)
301
+ end
302
+
303
+ def create_containers_admin_v1 partner_id, inventory_id, containers=[]
304
+ containers << test_container_object_v1 if containers.empty?
305
+ Log.info "Admin creating #{containers.length} containers - partner_id: #{partner_id} - inventory_id: #{inventory_id}"
306
+ coco.post "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/containers", containers
307
+ end
308
+ alias :update_containers_admin_v1 :create_containers_admin_v1
309
+
310
+ def delete_containers_admin_v1 partner_id, inventory_id, container_id
311
+ Log.info "Admin deleting containers - partner_id: #{partner_id} - inventory_id: #{inventory_id} - container_id: #{container_id}"
312
+ coco.delete "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/container/#{URI.encode container_id}"
313
+ end
314
+
315
+ def get_containers_admin_v1 partner_id, inventory_id, module_id
316
+ Log.info "Admin getting containers - partner_id: #{partner_id} - inventory_id: #{inventory_id} - module_id: #{module_id}"
317
+ coco.get "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/containers/#{URI.encode module_id}"
318
+ end
319
+
320
+ def create_containers_v1 inventory_id, containers=[]
321
+ containers << test_container_object_v1 if containers.empty?
322
+ Log.info "Partner creating #{containers.length} containers - inventory_id: #{inventory_id}"
323
+ coco.post "/v1/cc/inventory/#{URI.encode inventory_id}/containers", containers
324
+ end
325
+
326
+ def delete_containers_v1 inventory_id, container_id
327
+ Log.info "Partner deleting containers - inventory_id: #{inventory_id} - container_id: #{container_id}"
328
+ coco.delete "/v1/cc/inventory/#{URI.encode inventory_id}/container/#{URI.encode container_id}"
329
+ end
330
+
331
+ def get_inventory_containers_admin_v1 partner_id, inventory_id, query_params={}
332
+ Log.info "Admin getting containers - partner_id: #{partner_id} - inventory_id: #{inventory_id}"
333
+ coco.get "/v1/cc/admin/#{partner_id}/#{inventory_id}/containers?#{URI.encode_www_form query_params}"
334
+ end
335
+
336
+ def test_learning_objective_object_v1 params={}
337
+ params = {
338
+ 'learning_objective_id' => "TEST_OBJECTIVE_#{random_uuid}",
339
+ 'learning_objective_name' => 'Test Learning Objective',
340
+ 'learning_objective_description' => "Able to test learning objectives on Knewton Platform",
341
+ 'modules' => [],
342
+ 'reference_modules' => [],
343
+ }.merge(params)
344
+ end
345
+
346
+ def create_objectives_v1 inventory_id, objectives=[]
347
+ objectives << test_learning_objective_object_v1 if objectives.empty?
348
+ Log.info "Partner creating #{objectives.length} objectives - inventory_id: #{inventory_id}"
349
+ coco.post "/v1/cc/inventory/#{URI.encode inventory_id}/objectives", objectives
350
+ end
351
+
352
+ alias :update_objectives_v1 :create_objectives_v1
353
+
354
+ def create_objectives_admin_v1 partner_id, inventory_id, objectives=[]
355
+ objectives << test_learning_objective_object_v1 if objectives.empty?
356
+ Log.info "Partner creating #{objectives.length} objectives - inventory_id: #{inventory_id}"
357
+ coco.post "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/objectives", objectives
358
+ end
359
+
360
+ alias :update_objectives_admin_v1 :create_objectives_admin_v1
361
+
362
+ def get_objective_admin_v1 partner_id, inventory_id, objective_id
363
+ Log.info "Admin getting objective - inventory_id: #{inventory_id} - partner_id: #{partner_id} - objective_id: #{objective_id}"
364
+ coco.get "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/objective/#{objective_id}"
365
+ end
366
+
367
+ def get_objectives_admin_v1 partner_id, inventory_id
368
+ Log.info "Admin getting objectives - inventory_id: #{inventory_id} - partner_id: #{partner_id}"
369
+ coco.get "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/objectives"
370
+ end
371
+
372
+ def delete_objective_admin_v1 partner_id, inventory_id, objective_id
373
+ Log.info "Admin deleting objective - inventory_id: #{inventory_id} - partner_id: #{partner_id} - objective_id: #{objective_id}"
374
+ coco.delete "/v1/cc/admin/#{partner_id}/#{URI.encode inventory_id}/objective/#{objective_id}"
375
+ end
376
+
377
+
378
+ # get the transaction log of an inventory,
379
+ def get_inventory_log_v1 partner_id, inventory_id, params={}
380
+ params = {
381
+ 'start' => days_from_now(-7),
382
+ 'coalesce' => false,
383
+ }.merge(params)
384
+ # format the timestamp if we need to
385
+ if params['start'].respond_to? :utc
386
+ params['start'] = params['start'].utc.iso8601(3)
387
+ end
388
+ Log.info "Getting inventory log - partner_id: #{partner_id} - inventory_id: #{inventory_id}"
389
+ coco.post "/v1/cc/admin/#{partner_id}/#{inventory_id}/log", params
390
+ end
391
+
392
+ def ensure_inventory_does_not_exist_v1 partner_id, inventory_id
393
+ delete_inventory_admin_v1 partner_id, inventory_id
394
+ rescue Grifter::RequestException => e
395
+ # if the inventory does not an exist a 404 is returned. For our purposes, that is fine
396
+ # so we'll allow the request to fail if 404 comes back
397
+ raise e unless e.code.to_i == 404
398
+ end
399
+
400
+ # make an inventory complete with
401
+ # - modules
402
+ # - containers
403
+ # - taxons
404
+ # - coming soon: Learning objectives
405
+ def create_v1_test_inventory partner_id, options={}
406
+ options = {
407
+ inventory_id: "Intro_to_#{random_string}",
408
+
409
+ # concepts are not really made, but are used as an organizational element
410
+ num_concepts: 2,
411
+ # containers are made per concept
412
+ num_assessing_containers_per_concept: 1,
413
+ num_teaching_containers_per_concept: 2,
414
+
415
+ # modules are made per container
416
+ num_modules_per_assessing_container: 2,
417
+ num_modules_per_teaching_container: 3,
418
+
419
+ taxonomy_name: 'testtax',
420
+ num_taxons: 5,
421
+ num_modules_per_taxon: (3..20),
422
+ num_containers_per_taxon: (0..2),
423
+
424
+ # make this many modules|containers|taxons at a time
425
+ batch_size: 50
426
+
427
+ }.merge options
428
+
429
+ options[:partner_id] = partner_id
430
+
431
+ module_ids = nil
432
+ container_ids = nil
433
+ taxon_ids = nil
434
+
435
+ as_account :knerd do
436
+
437
+ inv_id = options[:inventory_id]
438
+ create_inventory_admin_v1 partner_id, options[:inventory_id]
439
+
440
+ containers = []
441
+ modules = []
442
+
443
+ options[:num_concepts].times do |concept_num|
444
+ concept_id = "concept_#{concept_num}"
445
+
446
+ # for each concept, setup the assessing and teaching containers
447
+ options[:num_assessing_containers_per_concept].times do |container_num|
448
+ container_id = "#{concept_id}_assess_cont_#{container_num}"
449
+
450
+ container_mods = []
451
+ options[:num_modules_per_assessing_container].times do |module_num|
452
+ module_id = "#{container_id}_module_#{module_num}"
453
+ container_mods << test_module_object_v1({ 'module_id' => module_id,
454
+ 'module_type' => 'assessment' })
455
+ end
456
+ modules += container_mods
457
+
458
+ containers << test_container_object_v1({'container_id' => container_id,
459
+ 'container_type' => 'target',
460
+ 'modules' => container_mods.map{|m| m['module_id']} })
461
+ end
462
+
463
+ # for each concept, setup the assessing and teaching containers
464
+ options[:num_teaching_containers_per_concept].times do |container_num|
465
+ container_id = "#{concept_id}_teach_cont_#{container_num}"
466
+
467
+ container_mods = []
468
+ options[:num_modules_per_teaching_container].times do |module_num|
469
+ module_id = "#{container_id}_module_#{module_num}"
470
+ container_mods << test_module_object_v1({ 'module_id' => module_id,
471
+ 'module_type' => 'instruction' })
472
+ end
473
+ modules += container_mods
474
+
475
+ containers << test_container_object_v1({'container_id' => container_id,
476
+ 'container_type' => 'presentation',
477
+ 'modules' => container_mods.map{|m| m['module_id']} })
478
+ end
479
+
480
+ end
481
+
482
+ module_ids = modules.map{|m| m['module_id']}
483
+ container_ids = containers.map{|c| c['container_id']}
484
+
485
+ taxons = []
486
+ options[:num_taxons].times do |taxon_num|
487
+ taxon_id = "#{options[:taxonomy_name]}:#{taxon_num}_#{random_string(8)}"
488
+ mods = module_ids.shuffle[0...rand(options[:num_modules_per_taxon])]
489
+ taxons << test_taxon_object_v1({ 'taxon_id' => taxon_id,
490
+ 'modules' => mods })
491
+ end
492
+
493
+ taxon_ids = taxons.map{|t| t['taxon_id']}
494
+
495
+ # now make all the objects in an order that will work:
496
+ # - make all modules
497
+ # - make all containers, which reference modules
498
+ # - make all taxons, which reference modules and containers
499
+ modules.each_slice(options[:batch_size]) do |batch|
500
+ set_account :knerd # this protects against expiring token
501
+ create_modules_admin_v1 partner_id, inv_id, batch
502
+ end
503
+
504
+ containers.each_slice(options[:batch_size]) do |batch|
505
+ set_account :knerd # this protects against expiring token
506
+ create_containers_admin_v1 partner_id, inv_id, batch
507
+ end
508
+
509
+ taxons.each_slice(options[:batch_size]) do |batch|
510
+ set_account :knerd # this protects against expiring token
511
+ create_taxons_admin_v1 partner_id, inv_id, batch
512
+ end
513
+
514
+ end
515
+ # returning the options is good b/c
516
+ # it returns the partner_id and inventory_id in a Hash
517
+ # with some other keys too
518
+ options.merge 'module_ids' => module_ids,
519
+ 'container_ids' => container_ids,
520
+ 'taxon_ids' => taxon_ids
521
+ end