arkindex-base-worker 0.4.0a2__py3-none-any.whl → 0.4.0b2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,7 @@ from apistar.exceptions import ErrorResponse
7
7
  from arkindex.mock import MockApiClient
8
8
  from arkindex_worker.cache import CachedElement
9
9
  from arkindex_worker.models import Element
10
+ from arkindex_worker.utils import DEFAULT_BATCH_SIZE
10
11
  from arkindex_worker.worker import MetaType
11
12
 
12
13
  from . import BASE_API_CALLS
@@ -228,143 +229,267 @@ def test_create_metadata_cached_element(responses, mock_elements_worker_with_cac
228
229
  assert metadata_id == "12345678-1234-1234-1234-123456789123"
229
230
 
230
231
 
231
- @pytest.mark.parametrize(
232
- "metadata_list",
233
- [
234
- [{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}],
235
- [
236
- {
237
- "type": MetaType.Text,
238
- "name": "fake_name",
239
- "value": "fake_value",
240
- "entity_id": "fake_entity_id",
241
- }
242
- ],
243
- ],
244
- )
245
- def test_create_metadata_bulk(responses, mock_elements_worker, metadata_list):
232
+ @pytest.mark.parametrize("batch_size", [DEFAULT_BATCH_SIZE, 1])
233
+ def test_create_metadata_bulk(batch_size, responses, mock_elements_worker):
246
234
  element = Element({"id": "12341234-1234-1234-1234-123412341234"})
247
- responses.add(
248
- responses.POST,
249
- "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
250
- status=201,
251
- json={
252
- "worker_run_id": "56785678-5678-5678-5678-567856785678",
253
- "metadata_list": [
254
- {
255
- "id": "fake_metadata_id",
256
- "type": metadata_list[0]["type"].value,
257
- "name": metadata_list[0]["name"],
258
- "value": metadata_list[0]["value"],
259
- "dates": [],
260
- "entity_id": metadata_list[0].get("entity_id"),
261
- }
262
- ],
235
+
236
+ metadata_list = [
237
+ {"type": MetaType.Text, "name": "fake_name", "value": "fake_value"},
238
+ {
239
+ "type": MetaType.Text,
240
+ "name": "Year",
241
+ "value": "2024",
242
+ "entity_id": "entity_id",
263
243
  },
264
- )
244
+ ]
245
+ if batch_size > 1:
246
+ responses.add(
247
+ responses.POST,
248
+ "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
249
+ status=201,
250
+ json={
251
+ "worker_run_id": "56785678-5678-5678-5678-567856785678",
252
+ "metadata_list": [
253
+ {
254
+ "id": "fake_metadata_id1",
255
+ "type": metadata_list[0]["type"].value,
256
+ "name": metadata_list[0]["name"],
257
+ "value": metadata_list[0]["value"],
258
+ "dates": [],
259
+ "entity_id": None,
260
+ },
261
+ {
262
+ "id": "fake_metadata_id2",
263
+ "type": metadata_list[1]["type"].value,
264
+ "name": metadata_list[1]["name"],
265
+ "value": metadata_list[1]["value"],
266
+ "dates": [],
267
+ "entity_id": metadata_list[1]["entity_id"],
268
+ },
269
+ ],
270
+ },
271
+ )
272
+ else:
273
+ for idx, meta in enumerate(metadata_list, start=1):
274
+ responses.add(
275
+ responses.POST,
276
+ "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
277
+ status=201,
278
+ json={
279
+ "worker_run_id": "56785678-5678-5678-5678-567856785678",
280
+ "metadata_list": [
281
+ {
282
+ "id": f"fake_metadata_id{idx}",
283
+ "type": meta["type"].value,
284
+ "name": meta["name"],
285
+ "value": meta["value"],
286
+ "dates": [],
287
+ "entity_id": meta.get("entity_id"),
288
+ }
289
+ ],
290
+ },
291
+ )
265
292
 
266
293
  created_metadata_list = mock_elements_worker.create_metadata_bulk(
267
- element, metadata_list
294
+ element, metadata_list, batch_size=batch_size
268
295
  )
269
296
 
270
- assert len(responses.calls) == len(BASE_API_CALLS) + 1
271
- assert [
272
- (call.request.method, call.request.url) for call in responses.calls
273
- ] == BASE_API_CALLS + [
297
+ bulk_api_calls = [
274
298
  (
275
299
  "POST",
276
300
  "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
277
- ),
278
- ]
279
- assert json.loads(responses.calls[-1].request.body)["metadata_list"] == [
280
- {
281
- "type": metadata_list[0]["type"].value,
282
- "name": metadata_list[0]["name"],
283
- "value": metadata_list[0]["value"],
284
- "entity_id": metadata_list[0].get("entity_id"),
285
- }
301
+ )
286
302
  ]
303
+ if batch_size != DEFAULT_BATCH_SIZE:
304
+ bulk_api_calls.append(
305
+ (
306
+ "POST",
307
+ "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
308
+ )
309
+ )
310
+
311
+ assert len(responses.calls) == len(BASE_API_CALLS) + len(bulk_api_calls)
312
+ assert [
313
+ (call.request.method, call.request.url) for call in responses.calls
314
+ ] == BASE_API_CALLS + bulk_api_calls
315
+
316
+ first_meta = {
317
+ **metadata_list[0],
318
+ "type": metadata_list[0]["type"].value,
319
+ "entity_id": None,
320
+ }
321
+ second_meta = {**metadata_list[1], "type": metadata_list[1]["type"].value}
322
+ empty_payload = {
323
+ "worker_run_id": "56785678-5678-5678-5678-567856785678",
324
+ "metadata_list": [],
325
+ }
326
+
327
+ bodies = []
328
+ first_call_idx = None
329
+ if batch_size > 1:
330
+ first_call_idx = -1
331
+ bodies.append({**empty_payload, "metadata_list": [first_meta, second_meta]})
332
+ else:
333
+ first_call_idx = -2
334
+ bodies.append({**empty_payload, "metadata_list": [first_meta]})
335
+ bodies.append({**empty_payload, "metadata_list": [second_meta]})
336
+
337
+ assert [
338
+ json.loads(bulk_call.request.body)
339
+ for bulk_call in responses.calls[first_call_idx:]
340
+ ] == bodies
341
+
287
342
  assert created_metadata_list == [
288
343
  {
289
- "id": "fake_metadata_id",
344
+ "id": "fake_metadata_id1",
290
345
  "type": metadata_list[0]["type"].value,
291
346
  "name": metadata_list[0]["name"],
292
347
  "value": metadata_list[0]["value"],
293
348
  "dates": [],
294
- "entity_id": metadata_list[0].get("entity_id"),
295
- }
349
+ "entity_id": None,
350
+ },
351
+ {
352
+ "id": "fake_metadata_id2",
353
+ "type": metadata_list[1]["type"].value,
354
+ "name": metadata_list[1]["name"],
355
+ "value": metadata_list[1]["value"],
356
+ "dates": [],
357
+ "entity_id": metadata_list[1]["entity_id"],
358
+ },
296
359
  ]
297
360
 
298
361
 
299
- @pytest.mark.parametrize(
300
- "metadata_list",
301
- [
302
- [{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}],
303
- [
304
- {
305
- "type": MetaType.Text,
306
- "name": "fake_name",
307
- "value": "fake_value",
308
- "entity_id": "fake_entity_id",
309
- }
310
- ],
311
- ],
312
- )
362
+ @pytest.mark.parametrize("batch_size", [DEFAULT_BATCH_SIZE, 1])
313
363
  def test_create_metadata_bulk_cached_element(
314
- responses, mock_elements_worker_with_cache, metadata_list
364
+ batch_size, responses, mock_elements_worker_with_cache
315
365
  ):
316
366
  element = CachedElement.create(
317
367
  id="12341234-1234-1234-1234-123412341234", type="thing"
318
368
  )
319
- responses.add(
320
- responses.POST,
321
- "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
322
- status=201,
323
- json={
324
- "worker_run_id": "56785678-5678-5678-5678-567856785678",
325
- "metadata_list": [
326
- {
327
- "id": "fake_metadata_id",
328
- "type": metadata_list[0]["type"].value,
329
- "name": metadata_list[0]["name"],
330
- "value": metadata_list[0]["value"],
331
- "dates": [],
332
- "entity_id": metadata_list[0].get("entity_id"),
333
- }
334
- ],
369
+
370
+ metadata_list = [
371
+ {"type": MetaType.Text, "name": "fake_name", "value": "fake_value"},
372
+ {
373
+ "type": MetaType.Text,
374
+ "name": "Year",
375
+ "value": "2024",
376
+ "entity_id": "entity_id",
335
377
  },
336
- )
378
+ ]
379
+ if batch_size > 1:
380
+ responses.add(
381
+ responses.POST,
382
+ "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
383
+ status=201,
384
+ json={
385
+ "worker_run_id": "56785678-5678-5678-5678-567856785678",
386
+ "metadata_list": [
387
+ {
388
+ "id": "fake_metadata_id1",
389
+ "type": metadata_list[0]["type"].value,
390
+ "name": metadata_list[0]["name"],
391
+ "value": metadata_list[0]["value"],
392
+ "dates": [],
393
+ "entity_id": None,
394
+ },
395
+ {
396
+ "id": "fake_metadata_id2",
397
+ "type": metadata_list[1]["type"].value,
398
+ "name": metadata_list[1]["name"],
399
+ "value": metadata_list[1]["value"],
400
+ "dates": [],
401
+ "entity_id": metadata_list[1]["entity_id"],
402
+ },
403
+ ],
404
+ },
405
+ )
406
+ else:
407
+ for idx, meta in enumerate(metadata_list, start=1):
408
+ responses.add(
409
+ responses.POST,
410
+ "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
411
+ status=201,
412
+ json={
413
+ "worker_run_id": "56785678-5678-5678-5678-567856785678",
414
+ "metadata_list": [
415
+ {
416
+ "id": f"fake_metadata_id{idx}",
417
+ "type": meta["type"].value,
418
+ "name": meta["name"],
419
+ "value": meta["value"],
420
+ "dates": [],
421
+ "entity_id": meta.get("entity_id"),
422
+ }
423
+ ],
424
+ },
425
+ )
337
426
 
338
427
  created_metadata_list = mock_elements_worker_with_cache.create_metadata_bulk(
339
- element, metadata_list
428
+ element, metadata_list, batch_size=batch_size
340
429
  )
341
430
 
342
- assert len(responses.calls) == len(BASE_API_CALLS) + 1
343
- assert [
344
- (call.request.method, call.request.url) for call in responses.calls
345
- ] == BASE_API_CALLS + [
431
+ bulk_api_calls = [
346
432
  (
347
433
  "POST",
348
434
  "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
349
- ),
350
- ]
351
- assert json.loads(responses.calls[-1].request.body)["metadata_list"] == [
352
- {
353
- "type": metadata_list[0]["type"].value,
354
- "name": metadata_list[0]["name"],
355
- "value": metadata_list[0]["value"],
356
- "entity_id": metadata_list[0].get("entity_id"),
357
- }
435
+ )
358
436
  ]
437
+ if batch_size != DEFAULT_BATCH_SIZE:
438
+ bulk_api_calls.append(
439
+ (
440
+ "POST",
441
+ "http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
442
+ )
443
+ )
444
+
445
+ assert len(responses.calls) == len(BASE_API_CALLS) + len(bulk_api_calls)
446
+ assert [
447
+ (call.request.method, call.request.url) for call in responses.calls
448
+ ] == BASE_API_CALLS + bulk_api_calls
449
+
450
+ first_meta = {
451
+ **metadata_list[0],
452
+ "type": metadata_list[0]["type"].value,
453
+ "entity_id": None,
454
+ }
455
+ second_meta = {**metadata_list[1], "type": metadata_list[1]["type"].value}
456
+ empty_payload = {
457
+ "worker_run_id": "56785678-5678-5678-5678-567856785678",
458
+ "metadata_list": [],
459
+ }
460
+
461
+ bodies = []
462
+ first_call_idx = None
463
+ if batch_size > 1:
464
+ first_call_idx = -1
465
+ bodies.append({**empty_payload, "metadata_list": [first_meta, second_meta]})
466
+ else:
467
+ first_call_idx = -2
468
+ bodies.append({**empty_payload, "metadata_list": [first_meta]})
469
+ bodies.append({**empty_payload, "metadata_list": [second_meta]})
470
+
471
+ assert [
472
+ json.loads(bulk_call.request.body)
473
+ for bulk_call in responses.calls[first_call_idx:]
474
+ ] == bodies
475
+
359
476
  assert created_metadata_list == [
360
477
  {
361
- "id": "fake_metadata_id",
478
+ "id": "fake_metadata_id1",
362
479
  "type": metadata_list[0]["type"].value,
363
480
  "name": metadata_list[0]["name"],
364
481
  "value": metadata_list[0]["value"],
365
482
  "dates": [],
366
- "entity_id": metadata_list[0].get("entity_id"),
367
- }
483
+ "entity_id": None,
484
+ },
485
+ {
486
+ "id": "fake_metadata_id2",
487
+ "type": metadata_list[1]["type"].value,
488
+ "name": metadata_list[1]["name"],
489
+ "value": metadata_list[1]["value"],
490
+ "dates": [],
491
+ "entity_id": metadata_list[1]["entity_id"],
492
+ },
368
493
  ]
369
494
 
370
495