Only one writeable campaign version at a time

This commit is contained in:
2026-06-13 22:08:07 +02:00
parent ffbddfc773
commit 0bb72541af
6 changed files with 177 additions and 8 deletions

View File

@@ -221,6 +221,86 @@ class ApiSmokeTests(unittest.TestCase):
)
self.assertEqual(refused_unlock.status_code, 409, refused_unlock.text)
def test_only_one_campaign_version_is_writable(self) -> None:
headers, _ = self._login()
created = self.client.post(
"/api/v1/campaigns/new",
headers=headers,
json={"external_id": "single-working-version", "name": "Single working version"},
)
self.assertEqual(created.status_code, 200, created.text)
campaign_id = created.json()["campaign"]["id"]
first_version_id = created.json()["version"]["id"]
parallel = self.client.post(
f"/api/v1/campaigns/{campaign_id}/versions/{first_version_id}/fork",
headers=headers,
json={},
)
self.assertEqual(parallel.status_code, 409, parallel.text)
self.assertIn("active working version", parallel.text)
permanent = self.client.post(
f"/api/v1/campaigns/{campaign_id}/versions/{first_version_id}/lock-permanently",
headers=headers,
)
self.assertEqual(permanent.status_code, 200, permanent.text)
copied = self.client.post(
f"/api/v1/campaigns/{campaign_id}/versions/{first_version_id}/fork",
headers=headers,
json={},
)
self.assertEqual(copied.status_code, 200, copied.text)
second_version_id = copied.json()["version"]["id"]
self.assertNotEqual(second_version_id, first_version_id)
self.assertEqual(copied.json()["campaign"]["current_version_id"], second_version_id)
historical_update = self.client.put(
f"/api/v1/campaigns/{campaign_id}/versions/{first_version_id}",
headers=headers,
json={"current_step": "fields"},
)
self.assertEqual(historical_update.status_code, 409, historical_update.text)
self.assertIn("Historical campaign versions are read-only", historical_update.text)
second_update = self.client.put(
f"/api/v1/campaigns/{campaign_id}/versions/{second_version_id}",
headers=headers,
json={"current_step": "fields"},
)
self.assertEqual(second_update.status_code, 200, second_update.text)
second_parallel = self.client.post(
f"/api/v1/campaigns/{campaign_id}/versions/{first_version_id}/fork",
headers=headers,
json={},
)
self.assertEqual(second_parallel.status_code, 409, second_parallel.text)
second_permanent = self.client.post(
f"/api/v1/campaigns/{campaign_id}/versions/{second_version_id}/lock-permanently",
headers=headers,
)
self.assertEqual(second_permanent.status_code, 200, second_permanent.text)
historical_branch = self.client.post(
f"/api/v1/campaigns/{campaign_id}/versions/{first_version_id}/fork",
headers=headers,
json={},
)
self.assertEqual(historical_branch.status_code, 409, historical_branch.text)
self.assertIn("cannot become a new branch", historical_branch.text)
third = self.client.post(
f"/api/v1/campaigns/{campaign_id}/versions/{second_version_id}/fork",
headers=headers,
json={},
)
self.assertEqual(third.status_code, 200, third.text)
self.assertEqual(third.json()["version"]["version_number"], 3)
def test_campaign_create_validate_build_and_mock_send(self) -> None:
headers, _ = self._login()
campaign_json = {