Skip to content

Commit 0f45da7

Browse files
author
Edward Keeble
committed
Add tests to confirm that upsert method results in success when posting the same items twice
1 parent 933d700 commit 0f45da7

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

stac_fastapi/pgstac/transactions.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,11 @@ async def bulk_item_insert(self, items: Items, request: Request, **kwargs) -> st
185185

186186
async with request.app.state.get_connection(request, "w") as conn:
187187
if items.method == BulkTransactionMethod.INSERT:
188+
method_verb = "added"
188189
await dbfunc(conn, "create_items", items_to_insert)
189190
elif items.method == BulkTransactionMethod.UPSERT:
191+
method_verb = "upserted"
190192
await dbfunc(conn, "upsert_items", items_to_insert)
191193

192-
return_msg = f"Successfully added {len(items_to_insert)} items."
194+
return_msg = f"Successfully {method_verb} {len(items_to_insert)} items."
193195
return return_msg

tests/clients/test_postgres.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,76 @@ async def test_create_bulk_items(
326326
assert resp.status_code == 200
327327

328328

329+
async def test_create_bulk_items_already_exist_insert(
330+
app_client, load_test_data: Callable, load_test_collection
331+
):
332+
coll = load_test_collection
333+
item = load_test_data("test_item.json")
334+
335+
items = {}
336+
for _ in range(2):
337+
_item = deepcopy(item)
338+
_item["id"] = str(uuid.uuid4())
339+
items[_item["id"]] = _item
340+
341+
payload = {"items": items, "method": "insert"}
342+
343+
resp = await app_client.post(
344+
f"/collections/{coll.id}/bulk_items",
345+
json=payload,
346+
)
347+
assert resp.status_code == 200
348+
assert resp.text == '"Successfully added 2 items."'
349+
350+
for item_id in items.keys():
351+
resp = await app_client.get(f"/collections/{coll.id}/items/{item_id}")
352+
assert resp.status_code == 200
353+
354+
# Try creating the same items again.
355+
# This should fail with the default insert behavior.
356+
resp = await app_client.post(
357+
f"/collections/{coll.id}/bulk_items",
358+
json=payload,
359+
)
360+
assert resp.status_code == 409
361+
362+
363+
async def test_create_bulk_items_already_exist_upsert(
364+
app_client, load_test_data: Callable, load_test_collection
365+
):
366+
coll = load_test_collection
367+
item = load_test_data("test_item.json")
368+
369+
items = {}
370+
for _ in range(2):
371+
_item = deepcopy(item)
372+
_item["id"] = str(uuid.uuid4())
373+
items[_item["id"]] = _item
374+
375+
payload = {"items": items, "method": "insert"}
376+
377+
resp = await app_client.post(
378+
f"/collections/{coll.id}/bulk_items",
379+
json=payload,
380+
)
381+
assert resp.status_code == 200
382+
assert resp.text == '"Successfully added 2 items."'
383+
384+
for item_id in items.keys():
385+
resp = await app_client.get(f"/collections/{coll.id}/items/{item_id}")
386+
assert resp.status_code == 200
387+
388+
# Try creating the same items again, but using upsert.
389+
# This should succeed.
390+
payload["method"] = "upsert"
391+
resp = await app_client.post(
392+
f"/collections/{coll.id}/bulk_items",
393+
json=payload,
394+
)
395+
assert resp.status_code == 200
396+
assert resp.text == '"Successfully upserted 2 items."'
397+
398+
329399
# TODO since right now puts implement upsert
330400
# test_create_collection_already_exists
331401
# test create_item_already_exists

0 commit comments

Comments
 (0)