mirror of
https://github.com/zulip/zulip.git
synced 2025-11-02 13:03:29 +00:00
Having exactly 17 or 18 middlewares, on Python 3.11.0 and above,
causes python to segfault when running tests with coverage; see
https://github.com/python/cpython/issues/106092
Work around this by adding one or two no-op middlewares if we would
hit those unlucky numbers. We only add them in testing, since
coverage is a requirement to trigger it, and there is no reason to
burden production with additional wrapping.
(cherry picked from commit cf0b803d50)
289 lines
9.1 KiB
Python
289 lines
9.1 KiB
Python
import os
|
|
from typing import Dict, List, Optional, Tuple
|
|
|
|
import ldap
|
|
from django_auth_ldap.config import LDAPSearch
|
|
|
|
from zerver.lib.db import TimeTrackingConnection, TimeTrackingCursor
|
|
from zproject.settings_types import OIDCIdPConfigDict, SAMLIdPConfigDict, SCIMConfigDict
|
|
|
|
from .config import DEPLOY_ROOT, get_from_file_if_exists
|
|
from .settings import (
|
|
AUTHENTICATION_BACKENDS,
|
|
CACHES,
|
|
DATABASES,
|
|
EXTERNAL_HOST,
|
|
LOCAL_DATABASE_PASSWORD,
|
|
LOGGING,
|
|
MIDDLEWARE,
|
|
)
|
|
|
|
FULL_STACK_ZULIP_TEST = "FULL_STACK_ZULIP_TEST" in os.environ
|
|
PUPPETEER_TESTS = "PUPPETEER_TESTS" in os.environ
|
|
|
|
|
|
FAKE_EMAIL_DOMAIN = "zulip.testserver"
|
|
|
|
# Clear out the REALM_HOSTS set in dev_settings.py
|
|
REALM_HOSTS: Dict[str, str] = {}
|
|
|
|
DATABASES["default"] = {
|
|
"NAME": os.getenv("ZULIP_DB_NAME", "zulip_test"),
|
|
"USER": "zulip_test",
|
|
"PASSWORD": LOCAL_DATABASE_PASSWORD,
|
|
"HOST": "localhost",
|
|
"SCHEMA": "zulip",
|
|
"ENGINE": "django.db.backends.postgresql",
|
|
"TEST_NAME": "django_zulip_tests",
|
|
"OPTIONS": {
|
|
"connection_factory": TimeTrackingConnection,
|
|
"cursor_factory": TimeTrackingCursor,
|
|
},
|
|
}
|
|
|
|
|
|
if FULL_STACK_ZULIP_TEST:
|
|
TORNADO_PORTS = [9983]
|
|
else:
|
|
# Backend tests don't use tornado
|
|
USING_TORNADO = False
|
|
CAMO_URI = "https://external-content.zulipcdn.net/external_content/"
|
|
CAMO_KEY = "dummy"
|
|
|
|
if PUPPETEER_TESTS:
|
|
# Disable search pills prototype for production use
|
|
SEARCH_PILLS_ENABLED = False
|
|
|
|
if "RUNNING_OPENAPI_CURL_TEST" in os.environ:
|
|
RUNNING_OPENAPI_CURL_TEST = True
|
|
|
|
if "GENERATE_STRIPE_FIXTURES" in os.environ:
|
|
GENERATE_STRIPE_FIXTURES = True
|
|
|
|
if "BAN_CONSOLE_OUTPUT" in os.environ:
|
|
BAN_CONSOLE_OUTPUT = True
|
|
|
|
# Decrease the get_updates timeout to 1 second.
|
|
# This allows frontend tests to proceed quickly to the next test step.
|
|
EVENT_QUEUE_LONGPOLL_TIMEOUT_SECONDS = 1
|
|
|
|
# Stores the messages in `django.core.mail.outbox` rather than sending them.
|
|
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
|
|
|
|
# The test suite uses EmailAuthBackend
|
|
AUTHENTICATION_BACKENDS += ("zproject.backends.EmailAuthBackend",)
|
|
|
|
# Configure Google OAuth2
|
|
GOOGLE_OAUTH2_CLIENT_ID = "test_client_id"
|
|
|
|
# Makes testing LDAP backend require less mocking
|
|
AUTH_LDAP_ALWAYS_UPDATE_USER = False
|
|
AUTH_LDAP_USER_SEARCH = LDAPSearch(
|
|
"ou=users,dc=zulip,dc=com", ldap.SCOPE_ONELEVEL, "(uid=%(user)s)"
|
|
)
|
|
AUTH_LDAP_USERNAME_ATTR = "uid"
|
|
AUTH_LDAP_REVERSE_EMAIL_SEARCH = LDAPSearch(
|
|
"ou=users,dc=zulip,dc=com", ldap.SCOPE_ONELEVEL, "(mail=%(email)s)"
|
|
)
|
|
|
|
TEST_SUITE = True
|
|
RATE_LIMITING = False
|
|
RATE_LIMITING_AUTHENTICATE = False
|
|
# Don't use RabbitMQ from the test suite -- the user_profile_ids for
|
|
# any generated queue elements won't match those being used by the
|
|
# real app.
|
|
USING_RABBITMQ = False
|
|
|
|
CACHES["database"] = {
|
|
"BACKEND": "django.core.cache.backends.dummy.DummyCache",
|
|
"LOCATION": "zulip-database-test-cache",
|
|
"TIMEOUT": 3600,
|
|
"CONN_MAX_AGE": 600,
|
|
"OPTIONS": {
|
|
"MAX_ENTRIES": 100000,
|
|
},
|
|
}
|
|
|
|
# Disable caching on sessions to make query counts consistent
|
|
SESSION_ENGINE = "django.contrib.sessions.backends.db"
|
|
|
|
# Use production config from Webpack in tests
|
|
if PUPPETEER_TESTS:
|
|
WEBPACK_STATS_FILE = os.path.join(DEPLOY_ROOT, "webpack-stats-production.json")
|
|
else:
|
|
WEBPACK_STATS_FILE = os.path.join(DEPLOY_ROOT, "var", "webpack-stats-test.json")
|
|
WEBPACK_BUNDLES = "webpack-bundles/"
|
|
|
|
if not PUPPETEER_TESTS:
|
|
# Use local memory cache for backend tests.
|
|
CACHES["default"] = {
|
|
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
|
|
}
|
|
|
|
# This logger is used only for automated tests validating the
|
|
# error-handling behavior of the zulip_admins handler.
|
|
LOGGING["loggers"]["zulip.test_zulip_admins_handler"] = {
|
|
"handlers": ["zulip_admins"],
|
|
"propagate": False,
|
|
}
|
|
|
|
# Here we set various loggers to be less noisy for unit tests.
|
|
def set_loglevel(logger_name: str, level: str) -> None:
|
|
LOGGING["loggers"].setdefault(logger_name, {})["level"] = level
|
|
|
|
set_loglevel("zulip.requests", "CRITICAL")
|
|
set_loglevel("zulip.management", "CRITICAL")
|
|
set_loglevel("zulip.auth", "WARNING")
|
|
set_loglevel("django.request", "ERROR")
|
|
set_loglevel("django_auth_ldap", "WARNING")
|
|
set_loglevel("fakeldap", "ERROR")
|
|
set_loglevel("zulip.send_email", "ERROR")
|
|
set_loglevel("zerver.lib.push_notifications", "WARNING")
|
|
set_loglevel("zerver.lib.digest", "ERROR")
|
|
set_loglevel("zerver.lib.email_mirror", "ERROR")
|
|
set_loglevel("zerver.worker.queue_processors", "WARNING")
|
|
set_loglevel("stripe", "WARNING")
|
|
|
|
# Enable file:/// hyperlink support by default in tests
|
|
ENABLE_FILE_LINKS = True
|
|
|
|
# This is set dynamically in `zerver/lib/test_runner.py`.
|
|
# Allow setting LOCAL_UPLOADS_DIR in the environment so that the
|
|
# frontend/API tests in test_server.py can control this.
|
|
if "LOCAL_UPLOADS_DIR" in os.environ:
|
|
LOCAL_UPLOADS_DIR = os.getenv("LOCAL_UPLOADS_DIR")
|
|
assert LOCAL_UPLOADS_DIR is not None
|
|
LOCAL_AVATARS_DIR = os.path.join(LOCAL_UPLOADS_DIR, "avatars")
|
|
LOCAL_FILES_DIR = os.path.join(LOCAL_UPLOADS_DIR, "files")
|
|
# Otherwise, we use the default value from dev_settings.py
|
|
|
|
S3_KEY = "test-key"
|
|
S3_SECRET_KEY = "test-secret-key"
|
|
S3_AUTH_UPLOADS_BUCKET = "test-authed-bucket"
|
|
S3_AVATAR_BUCKET = "test-avatar-bucket"
|
|
|
|
INLINE_URL_EMBED_PREVIEW = False
|
|
|
|
HOME_NOT_LOGGED_IN = "/login/"
|
|
LOGIN_URL = "/accounts/login/"
|
|
|
|
# By default will not send emails when login occurs.
|
|
# Explicitly set this to True within tests that must have this on.
|
|
SEND_LOGIN_EMAILS = False
|
|
|
|
GOOGLE_OAUTH2_CLIENT_ID = "id"
|
|
GOOGLE_OAUTH2_CLIENT_SECRET = "secret"
|
|
|
|
SOCIAL_AUTH_GITHUB_KEY = "key"
|
|
SOCIAL_AUTH_GITHUB_SECRET = "secret"
|
|
SOCIAL_AUTH_GITLAB_KEY = "key"
|
|
SOCIAL_AUTH_GITLAB_SECRET = "secret"
|
|
SOCIAL_AUTH_GOOGLE_KEY = "key"
|
|
SOCIAL_AUTH_GOOGLE_SECRET = "secret"
|
|
SOCIAL_AUTH_SUBDOMAIN = "auth"
|
|
SOCIAL_AUTH_APPLE_SERVICES_ID = "com.zulip.chat"
|
|
SOCIAL_AUTH_APPLE_APP_ID = "com.zulip.bundle.id"
|
|
SOCIAL_AUTH_APPLE_CLIENT = "com.zulip.chat"
|
|
SOCIAL_AUTH_APPLE_AUDIENCE = [SOCIAL_AUTH_APPLE_APP_ID, SOCIAL_AUTH_APPLE_SERVICES_ID]
|
|
SOCIAL_AUTH_APPLE_KEY = "KEYISKEY"
|
|
SOCIAL_AUTH_APPLE_TEAM = "TEAMSTRING"
|
|
SOCIAL_AUTH_APPLE_SECRET = get_from_file_if_exists("zerver/tests/fixtures/apple/private_key.pem")
|
|
|
|
|
|
SOCIAL_AUTH_OIDC_ENABLED_IDPS: Dict[str, OIDCIdPConfigDict] = {
|
|
"testoidc": {
|
|
"display_name": "Test OIDC",
|
|
"oidc_url": "https://example.com/api/openid",
|
|
"display_icon": None,
|
|
"client_id": "key",
|
|
"secret": "secret",
|
|
}
|
|
}
|
|
SOCIAL_AUTH_OIDC_FULL_NAME_VALIDATED = True
|
|
|
|
|
|
VIDEO_ZOOM_CLIENT_ID = "client_id"
|
|
VIDEO_ZOOM_CLIENT_SECRET = "client_secret"
|
|
|
|
BIG_BLUE_BUTTON_SECRET = "123"
|
|
BIG_BLUE_BUTTON_URL = "https://bbb.example.com/bigbluebutton/"
|
|
|
|
# By default two factor authentication is disabled in tests.
|
|
# Explicitly set this to True within tests that must have this on.
|
|
TWO_FACTOR_AUTHENTICATION_ENABLED = False
|
|
PUSH_NOTIFICATION_BOUNCER_URL: Optional[str] = None
|
|
|
|
THUMBNAIL_IMAGES = True
|
|
|
|
# Logging the emails while running the tests adds them
|
|
# to /emails page.
|
|
DEVELOPMENT_LOG_EMAILS = False
|
|
|
|
SOCIAL_AUTH_SAML_SP_ENTITY_ID = "http://" + EXTERNAL_HOST
|
|
SOCIAL_AUTH_SAML_SP_PUBLIC_CERT = get_from_file_if_exists("zerver/tests/fixtures/saml/zulip.crt")
|
|
SOCIAL_AUTH_SAML_SP_PRIVATE_KEY = get_from_file_if_exists("zerver/tests/fixtures/saml/zulip.key")
|
|
|
|
SOCIAL_AUTH_SAML_ORG_INFO = {
|
|
"en-US": {
|
|
"name": "example",
|
|
"displayname": "Example Inc.",
|
|
"url": "{}{}".format("http://", EXTERNAL_HOST),
|
|
},
|
|
}
|
|
|
|
SOCIAL_AUTH_SAML_TECHNICAL_CONTACT = {
|
|
"givenName": "Tech Gal",
|
|
"emailAddress": "technical@example.com",
|
|
}
|
|
|
|
SOCIAL_AUTH_SAML_SUPPORT_CONTACT = {
|
|
"givenName": "Support Guy",
|
|
"emailAddress": "support@example.com",
|
|
}
|
|
|
|
SOCIAL_AUTH_SAML_ENABLED_IDPS: Dict[str, SAMLIdPConfigDict] = {
|
|
"test_idp": {
|
|
"entity_id": "https://idp.testshib.org/idp/shibboleth",
|
|
"url": "https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO",
|
|
"slo_url": "https://idp.testshib.org/idp/profile/SAML2/Redirect/Logout",
|
|
"sp_initiated_logout_enabled": True,
|
|
"x509cert": get_from_file_if_exists("zerver/tests/fixtures/saml/idp.crt"),
|
|
"attr_user_permanent_id": "email",
|
|
"attr_first_name": "first_name",
|
|
"attr_last_name": "last_name",
|
|
"attr_username": "email",
|
|
"attr_email": "email",
|
|
"display_name": "Test IdP",
|
|
},
|
|
}
|
|
|
|
RATE_LIMITING_RULES: Dict[str, List[Tuple[int, int]]] = {
|
|
"api_by_user": [],
|
|
"api_by_ip": [],
|
|
"api_by_remote_server": [],
|
|
"authenticate_by_username": [],
|
|
"sends_email_by_ip": [],
|
|
"email_change_by_user": [],
|
|
"password_reset_form_by_email": [],
|
|
}
|
|
|
|
FREE_TRIAL_DAYS: Optional[int] = None
|
|
|
|
SCIM_CONFIG: Dict[str, SCIMConfigDict] = {
|
|
"zulip": {
|
|
"bearer_token": "token1234",
|
|
"scim_client_name": "test-scim-client",
|
|
"name_formatted_included": True,
|
|
}
|
|
}
|
|
|
|
|
|
while len(MIDDLEWARE) < 19:
|
|
# The following middleware serves to skip having exactly 17 or 18
|
|
# middlewares, which can segfault Python 3.11 when running with
|
|
# coverage enabled; see
|
|
# https://github.com/python/cpython/issues/106092
|
|
MIDDLEWARE += [
|
|
"zerver.middleware.ZulipNoopMiddleware",
|
|
]
|