test_mysql_integration.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from __future__ import annotations
  2. import os
  3. from pathlib import Path
  4. from urllib.parse import urlparse
  5. import pytest
  6. from alembic import command
  7. from alembic.config import Config
  8. from sqlalchemy import create_engine, text
  9. # alembic配置按测试文件位置解析,不依赖 pytest 启动目录。
  10. ALEMBIC_INI = Path(__file__).resolve().parents[2] / "migrations" / "alembic.ini"
  11. @pytest.mark.integration
  12. def test_mysql_q3_upgrade_downgrade_upgrade_when_test_database_is_configured(
  13. monkeypatch,
  14. ):
  15. database_url = os.environ.get("DMS_TEST_DATABASE_URL", "").strip()
  16. if not database_url:
  17. pytest.skip("未配置DMS_TEST_DATABASE_URL,未执行真实MySQL迁移")
  18. if not database_url.startswith("mysql+pymysql://"):
  19. pytest.fail("DMS_TEST_DATABASE_URL必须使用mysql+pymysql")
  20. database_name = urlparse(database_url).path.lstrip("/")
  21. if not database_name.endswith("_test"):
  22. pytest.fail("为避免误操作,MySQL测试库名称必须以_test结尾")
  23. monkeypatch.setenv("DMS_DATABASE_URL", database_url)
  24. config = Config(str(ALEMBIC_INI))
  25. command.upgrade(config, "head")
  26. # 仅清理独立测试库中的B8测试审计;迁移自身不修改历史审计。
  27. engine = create_engine(database_url)
  28. with engine.begin() as connection:
  29. connection.execute(
  30. text(
  31. "DELETE FROM sys_audit_log "
  32. "WHERE action_type = 'RESTORE_DOCUMENT'"
  33. )
  34. )
  35. # 0003明确阻止正文结果的有损降级;测试库先回到可安全降级状态。
  36. # 0019同样阻止已有提取失败记录的降级,一并清空。
  37. connection.execute(
  38. text(
  39. "UPDATE doc_document SET content_text = NULL, "
  40. "content_extract_status = 'UNSUPPORTED', "
  41. "content_extract_error = NULL, "
  42. "content_extracted_at = NULL, "
  43. "search_text = CONCAT_WS(' ', document_name, summary)"
  44. )
  45. )
  46. engine.dispose()
  47. command.downgrade(config, "0002_add_restore_audit_action")
  48. command.upgrade(config, "head")