import json import pytest from apps.users.models import Major, University pytestmark = [pytest.mark.integration, pytest.mark.django_db] @pytest.mark.parametrize("name,model", [("majors", Major), ("universities", University)]) def test_meta_public_search_and_admin_lifecycle(client, user_factory, auth_headers, name, model): staff = user_factory(is_staff=True) admin = user_factory(is_staff=True, is_superuser=True) member = user_factory() path = f"/api/meta/{name}" admin_path = f"/api/meta/admin/{name}" assert client.get(path).status_code == 200 assert client.post(admin_path, data=json.dumps({"code": "TEST_META_CX", "name": "Unique Meta Choice"}), content_type="application/json", **auth_headers(member)).status_code == 403 created = client.post(admin_path, data=json.dumps({"code": "TEST_META_CX", "name": "Unique Meta Choice"}), content_type="application/json", **auth_headers(staff)) assert created.status_code == 201, created.content item = model.objects.get(pk=created.json()["id"]) assert client.get(path, {"search": "Unique Meta Choice"}).json()["results"][0]["id"] == item.pk assert client.get(path, {"search": "missing"}).json()["count"] == 0 assert any(row["id"] == item.pk for row in client.get(admin_path, {"search": "Unique Meta Choice"}, **auth_headers(staff)).json()["results"]) duplicate = client.post(admin_path, data=json.dumps({"code": "TEST_META_CX", "name": "Duplicate"}), content_type="application/json", **auth_headers(staff)) assert duplicate.status_code == 400 updated = client.put(f"{admin_path}/{item.pk}", data=json.dumps({"code": "TEST_META_CX", "name": "Updated Unique Meta Choice", "is_active": False}), content_type="application/json", **auth_headers(staff)) assert updated.status_code == 200, updated.content item.refresh_from_db() assert item.name == "Updated Unique Meta Choice" and not item.is_active assert client.get(path, {"search": "TEST_META_CX"}).json()["results"] == [] assert client.get(admin_path, {"search": "TEST_META_CX"}, **auth_headers(staff)).json()["results"][0]["id"] == item.pk assert client.delete(f"{admin_path}/{item.pk}", **auth_headers(staff)).status_code == 403 assert client.delete(f"{admin_path}/{item.pk}", **auth_headers(admin)).status_code == 200 assert model.deleted_objects.filter(pk=item.pk).exists() assert client.post(f"{admin_path}/{item.pk}/restore", **auth_headers(admin)).status_code == 200 assert model.objects.filter(pk=item.pk).exists()