Harden secret key configuration
This commit is contained in:
@@ -1,4 +1,12 @@
|
||||
from app.config import _get_max_content_length
|
||||
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):
|
||||
@@ -13,3 +21,80 @@ def test_max_content_length_environment_variable_is_supported(monkeypatch):
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user