import pytest from app import create_app from app.config import ( DEVELOPMENT_SECRET_KEY, _get_max_content_length, _get_secret_key, validate_secret_key, ) def test_max_upload_size_mb_environment_variable(monkeypatch): monkeypatch.setenv("MAX_UPLOAD_SIZE_MB", "42") monkeypatch.delenv("MAX_CONTENT_LENGTH", raising=False) assert _get_max_content_length() == 42 * 1024 * 1024 def test_max_content_length_environment_variable_is_supported(monkeypatch): monkeypatch.delenv("MAX_UPLOAD_SIZE_MB", raising=False) monkeypatch.setenv("MAX_CONTENT_LENGTH", "2048") assert _get_max_content_length() == 2048 def test_secret_key_uses_development_fallback(monkeypatch): monkeypatch.setenv("APP_ENV", "development") monkeypatch.delenv("FLASK_ENV", raising=False) monkeypatch.delenv("SECRET_KEY", raising=False) assert _get_secret_key() == DEVELOPMENT_SECRET_KEY def test_secret_key_is_required_outside_development(monkeypatch): monkeypatch.setenv("APP_ENV", "production") monkeypatch.delenv("FLASK_ENV", raising=False) monkeypatch.delenv("SECRET_KEY", raising=False) assert _get_secret_key() == "" def test_validate_secret_key_rejects_unsafe_value_outside_development(monkeypatch): monkeypatch.setenv("APP_ENV", "production") monkeypatch.delenv("FLASK_ENV", raising=False) with pytest.raises(RuntimeError, match="SECRET_KEY is missing or unsafe"): validate_secret_key("change-me") def test_create_app_allows_development_without_explicit_secret_key(tmp_path, monkeypatch): monkeypatch.setenv("APP_ENV", "development") monkeypatch.delenv("FLASK_ENV", raising=False) monkeypatch.delenv("SECRET_KEY", raising=False) class DevelopmentConfig: SECRET_KEY = DEVELOPMENT_SECRET_KEY MAX_CONTENT_LENGTH = 1024 PREVIEW_RECORD_LIMIT = 5 OUTPUT_DIRECTORY = tmp_path / "dev-outputs" OUTPUT_RETENTION_HOURS = 24 CLEANUP_ON_STARTUP = False CLEANUP_AFTER_DOWNLOAD = False app = create_app(DevelopmentConfig) assert app.config["SECRET_KEY"] == DEVELOPMENT_SECRET_KEY def test_create_app_rejects_unsafe_secret_key_outside_development(tmp_path, monkeypatch): monkeypatch.setenv("APP_ENV", "production") monkeypatch.delenv("FLASK_ENV", raising=False) class ProductionConfig: SECRET_KEY = "change-me" MAX_CONTENT_LENGTH = 1024 PREVIEW_RECORD_LIMIT = 5 OUTPUT_DIRECTORY = tmp_path / "prod-outputs" OUTPUT_RETENTION_HOURS = 24 CLEANUP_ON_STARTUP = False CLEANUP_AFTER_DOWNLOAD = False with pytest.raises(RuntimeError, match="SECRET_KEY is missing or unsafe"): create_app(ProductionConfig) def test_create_app_rejects_missing_secret_key_outside_development(tmp_path, monkeypatch): monkeypatch.setenv("APP_ENV", "production") monkeypatch.delenv("FLASK_ENV", raising=False) class ProductionConfig: SECRET_KEY = "" MAX_CONTENT_LENGTH = 1024 PREVIEW_RECORD_LIMIT = 5 OUTPUT_DIRECTORY = tmp_path / "prod-outputs-missing-key" OUTPUT_RETENTION_HOURS = 24 CLEANUP_ON_STARTUP = False CLEANUP_AFTER_DOWNLOAD = False with pytest.raises(RuntimeError, match="SECRET_KEY is missing or unsafe"): create_app(ProductionConfig)