@pytest.mark.usefixtures("data_catalog", "reference_data")
def test_merge_draft(admin_client, dataset_a_json, dataset_maximal_json, dataset_signal_handlers):
res = admin_client.post("/v3/datasets", dataset_a_json, content_type="application/json")
assert res.status_code == 201
assert res.data["state"] == "published"
dataset_id = res.data["id"]
res = admin_client.post(
f"/v3/datasets/{dataset_id}/create-draft", dataset_a_json, content_type="application/json"
)
assert res.status_code == 201
draft_id = res.data["id"]
dataset_maximal_json.pop("metadata_owner")
res = admin_client.patch(
f"/v3/datasets/{draft_id}?include_nulls=true",
dataset_maximal_json,
content_type="application/json",
)
assert res.status_code == 200
draft_data = deepcopy(res.json())
# Merge draft
dataset_signal_handlers.reset()
res = admin_client.post(
f"/v3/datasets/{draft_id}/publish?include_nulls=true", content_type="application/json"
)
assert res.status_code == 200
merge_data = res.json() # response should be the updated original dataset
dataset_signal_handlers.assert_call_counts(created=0, updated=1)
assert str(dataset_signal_handlers.updated.call_args.kwargs["data"].id) == dataset_id
# Dataset has been updated
res = admin_client.get(
f"/v3/datasets/{dataset_id}?include_nulls=true", content_type="application/json"
)
assert res.status_code == 200
published_data = deepcopy(res.json())
assert published_data == merge_data
# Remove fields that should be different for draft and merged version
for field in [
"id",
"state",
"published_revision",
"draft_revision",
"draft_of",
"next_draft",
"created",
"dataset_versions",
]:
draft_data.pop(field)
published_data.pop(field)
assert draft_data.pop("persistent_identifier") != published_data.pop("persistent_identifier")
# Check that data from draft has been moved to published version
assert_nested_subdict(draft_data, published_data)
# Draft has been removed
res = admin_client.get(f"/v3/datasets/{draft_id}", content_type="application/json")
assert res.status_code == 404