Files
2024-02-15 17:01:50 +00:00

266 lines
9.9 KiB
Python

import types
import pytest
from sentry.runner.initializer import ConfigurationError, apply_legacy_settings, bootstrap_options
from sentry.utils.warnings import DeprecatedSettingWarning
@pytest.fixture
def settings():
return types.SimpleNamespace(
TIME_ZONE="UTC",
ALLOWED_HOSTS=[],
SENTRY_FEATURES={},
SENTRY_OPTIONS={},
SENTRY_DEFAULT_OPTIONS={},
SENTRY_EMAIL_BACKEND_ALIASES={"dummy": "alias-for-dummy"},
)
@pytest.fixture
def config_yml(tmpdir):
return tmpdir.join("config.yml")
def _assert_settings_warnings(warninfo, expected):
actual = {(w.message.setting, w.message.replacement) for w in warninfo}
assert actual == expected
def test_bootstrap_options_simple(settings, config_yml):
"Config options are specified in both places, but config.yml should prevail"
settings.SECRET_KEY = "xxx"
settings.EMAIL_BACKEND = "xxx"
settings.EMAIL_HOST = "xxx"
settings.EMAIL_PORT = 6969
settings.EMAIL_HOST_USER = "xxx"
settings.EMAIL_HOST_PASSWORD = "xxx"
settings.EMAIL_USE_TLS = False
settings.EMAIL_USE_SSL = False
settings.SERVER_EMAIL = "xxx"
settings.EMAIL_SUBJECT_PREFIX = "xxx"
settings.SENTRY_OPTIONS = {"something.else": True}
config_yml.write(
"""\
foo.bar: my-foo-bar
system.secret-key: my-system-secret-key
mail.backend: my-mail-backend
mail.host: my-mail-host
mail.port: 123
mail.username: my-mail-username
mail.password: my-mail-password
mail.use-tls: true
mail.use-ssl: false
mail.from: my-mail-from
mail.subject-prefix: my-mail-subject-prefix
"""
)
bootstrap_options(settings, str(config_yml))
assert settings.SENTRY_OPTIONS == {
"something.else": True,
"foo.bar": "my-foo-bar",
"system.secret-key": "my-system-secret-key",
"mail.backend": "my-mail-backend",
"mail.host": "my-mail-host",
"mail.port": 123,
"mail.username": "my-mail-username",
"mail.password": "my-mail-password",
"mail.use-tls": True,
"mail.use-ssl": False,
"mail.from": "my-mail-from",
"mail.subject-prefix": "my-mail-subject-prefix",
}
assert settings.SECRET_KEY == "my-system-secret-key"
assert settings.EMAIL_BACKEND == "my-mail-backend"
assert settings.EMAIL_HOST == "my-mail-host"
assert settings.EMAIL_PORT == 123
assert settings.EMAIL_HOST_USER == "my-mail-username"
assert settings.EMAIL_HOST_PASSWORD == "my-mail-password"
assert settings.EMAIL_USE_TLS is True
assert settings.EMAIL_USE_SSL is False
assert settings.SERVER_EMAIL == "my-mail-from"
assert settings.EMAIL_SUBJECT_PREFIX == "my-mail-subject-prefix"
def test_bootstrap_options_malformed_yml(settings, config_yml):
config_yml.write("1")
with pytest.raises(ConfigurationError):
bootstrap_options(settings, str(config_yml))
config_yml.write("{{{")
with pytest.raises(ConfigurationError):
bootstrap_options(settings, str(config_yml))
def test_bootstrap_options_no_config(settings):
"No config file should gracefully extract values out of settings"
settings.SECRET_KEY = "my-system-secret-key"
settings.EMAIL_BACKEND = "my-mail-backend"
settings.EMAIL_HOST = "my-mail-host"
settings.EMAIL_PORT = 123
settings.EMAIL_HOST_USER = "my-mail-username"
settings.EMAIL_HOST_PASSWORD = "my-mail-password"
settings.EMAIL_USE_TLS = True
settings.EMAIL_USE_SSL = False
settings.SERVER_EMAIL = "my-mail-from"
settings.EMAIL_SUBJECT_PREFIX = "my-mail-subject-prefix"
settings.FOO_BAR = "lol"
with pytest.warns(DeprecatedSettingWarning) as warninfo:
bootstrap_options(settings)
_assert_settings_warnings(
warninfo,
{
("EMAIL_BACKEND", "SENTRY_OPTIONS['mail.backend']"),
("EMAIL_HOST", "SENTRY_OPTIONS['mail.host']"),
("EMAIL_HOST_PASSWORD", "SENTRY_OPTIONS['mail.password']"),
("EMAIL_HOST_USER", "SENTRY_OPTIONS['mail.username']"),
("EMAIL_PORT", "SENTRY_OPTIONS['mail.port']"),
("EMAIL_SUBJECT_PREFIX", "SENTRY_OPTIONS['mail.subject-prefix']"),
("EMAIL_USE_SSL", "SENTRY_OPTIONS['mail.use-ssl']"),
("EMAIL_USE_TLS", "SENTRY_OPTIONS['mail.use-tls']"),
("SECRET_KEY", "SENTRY_OPTIONS['system.secret-key']"),
("SERVER_EMAIL", "SENTRY_OPTIONS['mail.from']"),
},
)
assert settings.SENTRY_OPTIONS == {
"system.secret-key": "my-system-secret-key",
"mail.backend": "my-mail-backend",
"mail.host": "my-mail-host",
"mail.port": 123,
"mail.username": "my-mail-username",
"mail.password": "my-mail-password",
"mail.use-tls": True,
"mail.use-ssl": False,
"mail.from": "my-mail-from",
"mail.subject-prefix": "my-mail-subject-prefix",
}
def test_bootstrap_options_no_config_only_sentry_options(settings):
"SENTRY_OPTIONS is only declared, but should be promoted into settings"
settings.SENTRY_OPTIONS = {
"system.secret-key": "my-system-secret-key",
"mail.backend": "my-mail-backend",
"mail.host": "my-mail-host",
"mail.port": 123,
"mail.username": "my-mail-username",
"mail.password": "my-mail-password",
"mail.use-tls": True,
"mail.use-ssl": False,
"mail.from": "my-mail-from",
"mail.subject-prefix": "my-mail-subject-prefix",
}
bootstrap_options(settings)
assert settings.SECRET_KEY == "my-system-secret-key"
assert settings.EMAIL_BACKEND == "my-mail-backend"
assert settings.EMAIL_HOST == "my-mail-host"
assert settings.EMAIL_PORT == 123
assert settings.EMAIL_HOST_USER == "my-mail-username"
assert settings.EMAIL_HOST_PASSWORD == "my-mail-password"
assert settings.EMAIL_USE_TLS is True
assert settings.EMAIL_USE_SSL is False
assert settings.SERVER_EMAIL == "my-mail-from"
assert settings.EMAIL_SUBJECT_PREFIX == "my-mail-subject-prefix"
def test_bootstrap_options_mail_aliases(settings):
settings.SENTRY_OPTIONS = {"mail.backend": "dummy"}
bootstrap_options(settings)
assert settings.EMAIL_BACKEND == "alias-for-dummy"
def test_bootstrap_options_missing_file(settings):
bootstrap_options(settings, "this-file-does-not-exist-xxxxxxxxxxxxxx.yml")
assert settings.SENTRY_OPTIONS == {}
def test_bootstrap_options_empty_file(settings, config_yml):
config_yml.write("")
bootstrap_options(settings, str(config_yml))
assert settings.SENTRY_OPTIONS == {}
def test_legacy_url_prefix_warning(settings, config_yml):
config_yml.write(
"""\
SENTRY_URL_PREFIX: http://sentry.example.com
"""
)
with pytest.warns(DeprecatedSettingWarning) as warninfo:
bootstrap_options(settings, str(config_yml))
assert settings.SENTRY_OPTIONS["system.url-prefix"] == "http://sentry.example.com"
assert settings.SENTRY_OPTIONS["SENTRY_URL_PREFIX"] == "http://sentry.example.com"
_assert_settings_warnings(
warninfo, {("SENTRY_URL_PREFIX", "SENTRY_OPTIONS['system.url-prefix']")}
)
def test_apply_legacy_settings(settings):
settings.ALLOWED_HOSTS = []
settings.SENTRY_USE_QUEUE = True
settings.SENTRY_ALLOW_REGISTRATION = True
settings.SENTRY_ADMIN_EMAIL = "admin-email"
settings.SENTRY_SYSTEM_MAX_EVENTS_PER_MINUTE = 10
settings.SENTRY_REDIS_OPTIONS = {"foo": "bar"}
settings.SENTRY_ENABLE_EMAIL_REPLIES = True
settings.SENTRY_SMTP_HOSTNAME = "reply-hostname"
settings.MAILGUN_API_KEY = "mailgun-api-key"
settings.SENTRY_OPTIONS = {"system.secret-key": "secret-key", "mail.from": "mail-from"}
settings.SENTRY_FILESTORE = "some-filestore"
settings.SENTRY_FILESTORE_OPTIONS = {"filestore-foo": "filestore-bar"}
settings.SENTRY_FILESTORE_RELOCATION = {"relocation-baz": "relocation-qux"}
with pytest.warns(DeprecatedSettingWarning) as warninfo:
apply_legacy_settings(settings)
assert settings.CELERY_ALWAYS_EAGER is False
assert settings.SENTRY_FEATURES["auth:register"] is True
assert settings.SENTRY_OPTIONS == {
"system.admin-email": "admin-email",
"system.rate-limit": 10,
"system.secret-key": "secret-key",
"redis.clusters": {"default": {"foo": "bar"}},
"mail.from": "mail-from",
"mail.enable-replies": True,
"mail.reply-hostname": "reply-hostname",
"mail.mailgun-api-key": "mailgun-api-key",
"filestore.backend": "some-filestore",
"filestore.options": {"filestore-foo": "filestore-bar"},
"filestore.relocation": {"relocation-baz": "relocation-qux"},
}
assert settings.DEFAULT_FROM_EMAIL == "mail-from"
assert settings.ALLOWED_HOSTS == ["*"]
_assert_settings_warnings(
warninfo,
{
("MAILGUN_API_KEY", "SENTRY_OPTIONS['mail.mailgun-api-key']"),
("SENTRY_ADMIN_EMAIL", "SENTRY_OPTIONS['system.admin-email']"),
("SENTRY_ALLOW_REGISTRATION", 'SENTRY_FEATURES["auth:register"]'),
("SENTRY_ENABLE_EMAIL_REPLIES", "SENTRY_OPTIONS['mail.enable-replies']"),
("SENTRY_FILESTORE", "SENTRY_OPTIONS['filestore.backend']"),
("SENTRY_FILESTORE_OPTIONS", "SENTRY_OPTIONS['filestore.options']"),
("SENTRY_FILESTORE_RELOCATION", "SENTRY_OPTIONS['filestore.relocation']"),
("SENTRY_REDIS_OPTIONS", 'SENTRY_OPTIONS["redis.clusters"]'),
("SENTRY_SMTP_HOSTNAME", "SENTRY_OPTIONS['mail.reply-hostname']"),
("SENTRY_SYSTEM_MAX_EVENTS_PER_MINUTE", "SENTRY_OPTIONS['system.rate-limit']"),
("SENTRY_USE_QUEUE", "CELERY_ALWAYS_EAGER"),
},
)
def test_initialize_app(settings):
"Just a sanity check of the full initialization process"
settings.SENTRY_OPTIONS = {"system.secret-key": "secret-key"}
bootstrap_options(settings)
apply_legacy_settings(settings)
def test_require_secret_key(settings):
assert "system.secret-key" not in settings.SENTRY_OPTIONS
with pytest.raises(ConfigurationError):
apply_legacy_settings(settings)