test_config.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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_mysql_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("mysql+pymysql://")
  22. assert config["SQLALCHEMY_ENGINE_OPTIONS"]["isolation_level"] == "READ COMMITTED"
  23. assert config["SQLALCHEMY_ENGINE_OPTIONS"]["connect_args"] == {
  24. "init_command": "SET time_zone = '+00:00'"
  25. }
  26. assert config["DMS_STORAGE_ROOT"] == str(DEFAULT_STORAGE_ROOT.resolve())
  27. assert config["MAX_CONTENT_LENGTH"] == config["DMS_MAX_UPLOAD_SIZE"]
  28. assert config["DMS_BATCH_MAX_FILES"] == 50
  29. assert config["DMS_BUSINESS_TIMEZONE"] == "Asia/Shanghai"
  30. assert config["DMS_JWT_SECRET"] == ""
  31. assert config["DMS_UI_DICTIONARY_CONFIG_PATH"] == str(
  32. DEFAULT_UI_DICTIONARY_CONFIG_PATH.resolve()
  33. )
  34. def test_environment_overrides_are_loaded(monkeypatch, tmp_path: Path):
  35. monkeypatch.setenv(
  36. "DMS_DATABASE_URL",
  37. "mysql+pymysql://example:example@db.invalid:3306/dms?charset=utf8mb4",
  38. )
  39. monkeypatch.setenv("DMS_STORAGE_ROOT", str(tmp_path))
  40. monkeypatch.setenv("DMS_MAX_UPLOAD_SIZE", "2048")
  41. monkeypatch.setenv("DMS_BATCH_MAX_FILES", "7")
  42. monkeypatch.setenv("DMS_BUSINESS_TIMEZONE", "UTC")
  43. monkeypatch.setenv("DMS_JWT_SECRET", "test-only")
  44. dictionary_path = tmp_path / "external-ui-dictionaries.json"
  45. monkeypatch.setenv(
  46. "DMS_UI_DICTIONARY_CONFIG_PATH", str(dictionary_path)
  47. )
  48. config = load_dms_config()
  49. assert config["DMS_STORAGE_ROOT"] == str(tmp_path.resolve())
  50. assert config["DMS_MAX_UPLOAD_SIZE"] == 2048
  51. assert config["DMS_BATCH_MAX_FILES"] == 7
  52. assert config["DMS_BUSINESS_TIMEZONE"] == "UTC"
  53. assert config["DMS_JWT_SECRET"] == "test-only"
  54. assert config["DMS_UI_DICTIONARY_CONFIG_PATH"] == str(
  55. dictionary_path.resolve()
  56. )
  57. @pytest.mark.parametrize(
  58. ("name", "value"),
  59. [
  60. ("DMS_MAX_UPLOAD_SIZE", "0"),
  61. ("DMS_MAX_UPLOAD_SIZE", "not-an-int"),
  62. ("DMS_BATCH_MAX_FILES", "-1"),
  63. ],
  64. )
  65. def test_invalid_positive_integer_config_is_rejected(monkeypatch, name, value):
  66. monkeypatch.setenv(name, value)
  67. with pytest.raises(ValueError):
  68. load_dms_config()