from uuid import uuid4 import pytest @pytest.mark.asyncio async def test_memberships_crud_integration(api_client): suffix = uuid4().hex[:6].upper() type_code = f"T{suffix}" region_id = f"region-{suffix}" region_code = f"RC{suffix}" group_id = f"G{suffix}" crm_group_id = f"CRM{suffix}" inn = f"77{uuid4().int % 10**8:08d}" org_type_resp = await api_client.post( "/api/v1/org-types", json={ "type_code": type_code, "type_name": f"Тип {suffix}", "description": "Тестовый тип организации", }, ) assert org_type_resp.status_code == 201, org_type_resp.text crm_region_resp = await api_client.post( "/api/v1/crm-regions", json={ "id": region_id, "region_code": region_code, "region_name": f"Регион {suffix}", "crm_system_id": f"S{suffix}", }, ) assert crm_region_resp.status_code == 201, crm_region_resp.text group_resp = await api_client.post( "/api/v1/groups", json={ "id": group_id, "crm_group_id": crm_group_id, "group_name": f"Группа {suffix}", "region_code": region_code, "is_active": True, }, ) assert group_resp.status_code == 201, group_resp.text organization_resp = await api_client.post( "/api/v1/organizations", json={ "inn": inn, "kpp": "770101001", "full_name": f"ООО Тест {suffix}", "short_name": f"Тест {suffix}", "org_type_code": type_code, "is_resident": True, }, ) assert organization_resp.status_code == 201, organization_resp.text org_id = organization_resp.json()["org_id"] membership_create_resp = await api_client.post( "/api/v1/memberships", json={ "group_id": group_id, "org_id": org_id, "is_gsk": True, "is_gsz": False, "control_type": "CTRL", "comment": "Тестовая связь", }, ) assert membership_create_resp.status_code == 201, membership_create_resp.text membership_payload = membership_create_resp.json() membership_id = membership_payload["membership_id"] assert membership_payload["inn"] == inn assert membership_payload["group_id"] == group_id assert membership_payload["crm_group_id"] == crm_group_id list_resp = await api_client.get( f"/api/v1/memberships?group_id={group_id}&inn={inn}&active_only=true" ) assert list_resp.status_code == 200, list_resp.text listed = list_resp.json() assert any(row["membership_id"] == membership_id for row in listed) get_resp = await api_client.get(f"/api/v1/memberships/{membership_id}") assert get_resp.status_code == 200, get_resp.text assert get_resp.json()["membership_id"] == membership_id update_resp = await api_client.patch( f"/api/v1/memberships/{membership_id}", json={"is_gsz": True, "comment": "Обновлено"}, ) assert update_resp.status_code == 200, update_resp.text updated_payload = update_resp.json() assert updated_payload["is_gsz"] is True delete_resp = await api_client.delete(f"/api/v1/memberships/{membership_id}") assert delete_resp.status_code == 204, delete_resp.text active_list_resp = await api_client.get( f"/api/v1/memberships?group_id={group_id}&inn={inn}&active_only=true" ) assert active_list_resp.status_code == 200, active_list_resp.text assert all(row["membership_id"] != membership_id for row in active_list_resp.json()) all_list_resp = await api_client.get( f"/api/v1/memberships?group_id={group_id}&inn={inn}&active_only=false" ) assert all_list_resp.status_code == 200, all_list_resp.text all_rows = all_list_resp.json() deactivated = next(row for row in all_rows if row["membership_id"] == membership_id) assert deactivated["membership_to"] is not None