test_mysql_integration.py 1.8 KB

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