deployment_acceptance.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import asyncio
  2. import importlib.util
  3. import json
  4. from pathlib import Path
  5. from uuid import uuid4
  6. import httpx
  7. import pytest
  8. from test_after_sales import scenario # noqa: F401
  9. from test_fulfillment import connected # noqa: F401
  10. async def test_container_business_and_database_recovery(connected): # noqa: F811
  11. async with httpx.AsyncClient(
  12. base_url="http://127.0.0.1:28000",
  13. timeout=15,
  14. trust_env=False,
  15. headers=connected["headers"]["customer"],
  16. ) as client:
  17. orders = await client.get(f"/openapi/v1/orders?store_id={connected['store']}")
  18. assert orders.status_code == 200, orders.text
  19. assert str(connected["order_id"]) in orders.text
  20. created = await client.post(
  21. "/openapi/v1/after-sales/proposals",
  22. json=connected["proposal"],
  23. headers={"Idempotency-Key": uuid4().hex},
  24. )
  25. assert created.status_code == 201, created.text
  26. proposal = await client.get(f"/openapi/v1/tickets/{created.json()['ticket_id']}")
  27. assert proposal.status_code == 200, proposal.text
  28. spec = importlib.util.spec_from_file_location("mysql_recovery", "scripts/mysql_recovery.py")
  29. recovery = importlib.util.module_from_spec(spec)
  30. spec.loader.exec_module(recovery)
  31. directory = await asyncio.to_thread(recovery.backup)
  32. report = await asyncio.to_thread(recovery.restore, directory)
  33. assert report["databases"]["zhifu"]["orders"] >= 1
  34. assert report["databases"]["zhifu"]["tickets"] >= 1
  35. assert report["databases"]["oms"]["orders"] >= 1
  36. report["container_order_read"] = orders.status_code
  37. report["container_ticket_read"] = proposal.status_code
  38. report["container_proposal_create"] = created.status_code
  39. path = directory / "zhifu.sql"
  40. original = await asyncio.to_thread(path.read_bytes)
  41. try:
  42. await asyncio.to_thread(path.write_bytes, original + b"\n")
  43. with pytest.raises(ValueError, match="SHA256"):
  44. await asyncio.to_thread(recovery.restore, directory)
  45. finally:
  46. await asyncio.to_thread(path.write_bytes, original)
  47. report["corrupted_backup_rejected"] = True
  48. await asyncio.to_thread(
  49. Path("docs/verification/deployment-recovery.json").write_text,
  50. json.dumps(report, indent=2),
  51. encoding="utf-8",
  52. )