test_config.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from __future__ import annotations
  2. from pathlib import Path
  3. import pytest
  4. from dms.config import (
  5. DEFAULT_STORAGE_ROOT,
  6. DEFAULT_UI_DICTIONARY_CONFIG_PATH,
  7. load_dms_config,
  8. )
  9. def test_default_config_uses_dm_dialect_read_committed(monkeypatch):
  10. for name in (
  11. "DMS_DATABASE_URL",
  12. "DMS_STORAGE_ROOT",
  13. "DMS_MAX_UPLOAD_SIZE",
  14. "DMS_BATCH_MAX_FILES",
  15. "DMS_BUSINESS_TIMEZONE",
  16. "DMS_JWT_SECRET",
  17. "DMS_UI_DICTIONARY_CONFIG_PATH",
  18. ):
  19. monkeypatch.delenv(name, raising=False)
  20. config = load_dms_config()
  21. assert config["SQLALCHEMY_DATABASE_URI"].startswith("dm+dmPython://")
  22. assert config["SQLALCHEMY_ENGINE_OPTIONS"]["isolation_level"] == "READ COMMITTED"
  23. # init_command 为 pymysql 专属参数,达梦默认链接不下发
  24. assert config["SQLALCHEMY_ENGINE_OPTIONS"]["connect_args"] == {}
  25. assert config["DMS_STORAGE_ROOT"] == str(DEFAULT_STORAGE_ROOT.resolve())
  26. assert config["MAX_CONTENT_LENGTH"] == config["DMS_MAX_UPLOAD_SIZE"]
  27. assert config["DMS_BATCH_MAX_FILES"] == 50
  28. assert config["DMS_BUSINESS_TIMEZONE"] == "Asia/Shanghai"
  29. assert config["DMS_JWT_SECRET"] == ""
  30. assert config["DMS_UI_DICTIONARY_CONFIG_PATH"] == str(
  31. DEFAULT_UI_DICTIONARY_CONFIG_PATH.resolve()
  32. )
  33. def test_mysql_url_still_applies_pymysql_session_init(monkeypatch):
  34. """回切 MySQL 链接时仍下发 SET time_zone 会话初始化(向后兼容)。"""
  35. monkeypatch.delenv("DMS_DATABASE_URL", raising=False)
  36. monkeypatch.setenv(
  37. "DMS_DATABASE_URL",
  38. "mysql+pymysql://example:example@db.invalid:3306/dms?charset=utf8mb4",
  39. )
  40. config = load_dms_config()
  41. assert config["SQLALCHEMY_ENGINE_OPTIONS"]["connect_args"] == {
  42. "init_command": "SET time_zone = '+00:00'"
  43. }
  44. def test_environment_overrides_are_loaded(monkeypatch, tmp_path: Path):
  45. monkeypatch.setenv(
  46. "DMS_DATABASE_URL",
  47. "mysql+pymysql://example:example@db.invalid:3306/dms?charset=utf8mb4",
  48. )
  49. monkeypatch.setenv("DMS_STORAGE_ROOT", str(tmp_path))
  50. monkeypatch.setenv("DMS_MAX_UPLOAD_SIZE", "2048")
  51. monkeypatch.setenv("DMS_BATCH_MAX_FILES", "7")
  52. monkeypatch.setenv("DMS_BUSINESS_TIMEZONE", "UTC")
  53. monkeypatch.setenv("DMS_JWT_SECRET", "test-only")
  54. dictionary_path = tmp_path / "external-ui-dictionaries.json"
  55. monkeypatch.setenv(
  56. "DMS_UI_DICTIONARY_CONFIG_PATH", str(dictionary_path)
  57. )
  58. config = load_dms_config()
  59. assert config["DMS_STORAGE_ROOT"] == str(tmp_path.resolve())
  60. assert config["DMS_MAX_UPLOAD_SIZE"] == 2048
  61. assert config["DMS_BATCH_MAX_FILES"] == 7
  62. assert config["DMS_BUSINESS_TIMEZONE"] == "UTC"
  63. assert config["DMS_JWT_SECRET"] == "test-only"
  64. assert config["DMS_UI_DICTIONARY_CONFIG_PATH"] == str(
  65. dictionary_path.resolve()
  66. )
  67. @pytest.mark.parametrize(
  68. ("name", "value"),
  69. [
  70. ("DMS_MAX_UPLOAD_SIZE", "0"),
  71. ("DMS_MAX_UPLOAD_SIZE", "not-an-int"),
  72. ("DMS_BATCH_MAX_FILES", "-1"),
  73. ],
  74. )
  75. def test_invalid_positive_integer_config_is_rejected(monkeypatch, name, value):
  76. monkeypatch.setenv(name, value)
  77. with pytest.raises(ValueError):
  78. load_dms_config()