44 lines
1.9 KiB
Python
44 lines
1.9 KiB
Python
import re
|
|
from pathlib import Path
|
|
import pytest
|
|
|
|
from backend.app.core.config import Settings, validate_configuration
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
|
|
|
|
def test_production_configuration_rejects_missing_or_default_secret():
|
|
with pytest.raises(RuntimeError, match='LINKLOG_SECRET_KEY'):
|
|
validate_configuration(Settings(app_env='production', secret_key='', data_encryption_key=''))
|
|
with pytest.raises(RuntimeError, match='LINKLOG_SECRET_KEY'):
|
|
validate_configuration(Settings(app_env='production', secret_key='dev-secret-key-change-me', data_encryption_key=''))
|
|
|
|
|
|
def test_production_configuration_rejects_weak_or_missing_encryption_key():
|
|
with pytest.raises(RuntimeError, match='entropy'):
|
|
validate_configuration(Settings(app_env='production', secret_key='A' * 32, data_encryption_key=''))
|
|
with pytest.raises(RuntimeError, match='DATA_ENCRYPTION_KEY'):
|
|
validate_configuration(Settings(app_env='production', secret_key='A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6', data_encryption_key='invalid'))
|
|
|
|
|
|
def test_production_configuration_accepts_strong_secrets():
|
|
values = Settings(
|
|
app_env='production',
|
|
secret_key='A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6',
|
|
data_encryption_key='L5M4sQYVjD1N7pT2Xk8R0aBcDeFgHiJkLmNoPqRsTuV=',
|
|
)
|
|
validate_configuration(values)
|
|
|
|
|
|
def test_production_compose_configuration_matches_settings_environment_keys():
|
|
compose = (ROOT / 'docker-compose.yml').read_text()
|
|
settings = (ROOT / 'backend' / 'app' / 'core' / 'config.py').read_text()
|
|
database = (ROOT / 'backend' / 'app' / 'database.py').read_text()
|
|
|
|
compose_keys = set(re.findall(r'\b(LINKLOG_[A-Z0-9_]+):', compose))
|
|
settings_keys = set(re.findall(r"os\.getenv\('([^']+)'", settings + database))
|
|
|
|
assert {'LINKLOG_TOKEN_EXPIRY_MINUTES', 'LINKLOG_REFRESH_TOKEN_EXPIRY_DAYS'} <= compose_keys
|
|
assert compose_keys & settings_keys == compose_keys
|
|
assert 'LINKLOG_TOKEN_EXPIRY_DAYS' not in compose_keys |