"""Integration tests for PATCH /transfer/job//products.""" import requests from .helpers import TIMEOUT, create_job, delete_job, url class TestSetDestinationArtists: """Tests for PATCH /transfer/job//products.""" def test_sets_destination_artists(self, qa_base_url, auth_headers, qa_project, qa_artist_id): """Returns 200 and updates destination_artist_id on product rows.""" job = create_job(qa_base_url, auth_headers, qa_project["project_id"]) try: release_id = job["products"][0]["release_id"] r = requests.patch( url(qa_base_url, f"/transfer/job/{job['project_transfer_job_id']}/products"), headers=auth_headers, json={"updates": [ {"release_id": release_id, "destination_artist_id": qa_artist_id}]}, timeout=TIMEOUT, ) assert r.status_code == 200 body = r.json() assert body["updated_count"] == 1 assert body["updated"][0]["destination_artist_id"] == qa_artist_id finally: delete_job(qa_base_url, auth_headers, job["project_transfer_job_id"]) def test_partial_batch_rolls_back(self, qa_base_url, auth_headers, qa_project, qa_artist_id): """Returns 404 and rolls back all updates when any release_id is invalid.""" job = create_job(qa_base_url, auth_headers, qa_project["project_id"]) try: valid_release_id = job["products"][0]["release_id"] r = requests.patch( url(qa_base_url, f"/transfer/job/{job['project_transfer_job_id']}/products"), headers=auth_headers, json={"updates": [ {"release_id": valid_release_id, "destination_artist_id": qa_artist_id}, {"release_id": 999999999, "destination_artist_id": qa_artist_id}, ]}, timeout=TIMEOUT, ) assert r.status_code == 404 # Confirm the valid release was not updated — rollback worked products_r = requests.get( url(qa_base_url, f"/transfer/job/{job['project_transfer_job_id']}/products"), headers=auth_headers, timeout=TIMEOUT, ) products = products_r.json() assert products[0]["destination_artist_id"] is None finally: delete_job(qa_base_url, auth_headers, job["project_transfer_job_id"]) def test_unknown_release_id_returns_404(self, qa_base_url, auth_headers, qa_project): """Returns 404 when release_id has no snapshot row for the job.""" job = create_job(qa_base_url, auth_headers, qa_project["project_id"]) try: r = requests.patch( url(qa_base_url, f"/transfer/job/{job['project_transfer_job_id']}/products"), headers=auth_headers, json={"updates": [{"release_id": 999999999, "destination_artist_id": 1}]}, timeout=TIMEOUT, ) assert r.status_code == 404 finally: delete_job(qa_base_url, auth_headers, job["project_transfer_job_id"]) def test_empty_updates_returns_400(self, qa_base_url, auth_headers, qa_project): """Returns 400 when updates list is missing.""" job = create_job(qa_base_url, auth_headers, qa_project["project_id"]) try: r = requests.patch( url(qa_base_url, f"/transfer/job/{job['project_transfer_job_id']}/products"), headers=auth_headers, json={}, timeout=TIMEOUT, ) assert r.status_code == 400 finally: delete_job(qa_base_url, auth_headers, job["project_transfer_job_id"]) def test_nonexistent_job_returns_404(self, qa_base_url, auth_headers): """Returns 404 for a non-existent job.""" r = requests.patch( url(qa_base_url, "/transfer/job/999999999/products"), headers=auth_headers, json={"updates": [{"release_id": 1, "destination_artist_id": 1}]}, timeout=TIMEOUT, ) assert r.status_code == 404