From 3b06bbbcec2c6c98e659d8548597e9b40d111d8b Mon Sep 17 00:00:00 2001 From: Saurabh Kumar Bajpai Date: Mon, 22 Jun 2026 11:41:47 +0530 Subject: [PATCH] feat: add startup settings warnings --- backend/backend/asgi.py | 4 ++++ backend/backend/startup.py | 34 ++++++++++++++++++++++++++++++++++ backend/backend/tests.py | 36 ++++++++++++++++++++++++++++++++++++ backend/backend/wsgi.py | 4 ++++ 4 files changed, 78 insertions(+) create mode 100644 backend/backend/startup.py create mode 100644 backend/backend/tests.py diff --git a/backend/backend/asgi.py b/backend/backend/asgi.py index 06ebebd..d331d03 100644 --- a/backend/backend/asgi.py +++ b/backend/backend/asgi.py @@ -3,3 +3,7 @@ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') application = get_asgi_application() + +from .startup import warn_missing_critical_settings + +warn_missing_critical_settings() diff --git a/backend/backend/startup.py b/backend/backend/startup.py new file mode 100644 index 0000000..f53abbe --- /dev/null +++ b/backend/backend/startup.py @@ -0,0 +1,34 @@ +"""Startup checks for critical deployment settings.""" + +import sys + +from django.conf import settings + +CRITICAL_STARTUP_SETTINGS = ( + 'GEMINI_API_KEY', + 'GOOGLE_CLIENT_ID', + 'GOOGLE_CLIENT_SECRET', +) + + +def warn_missing_critical_settings(stream=None): + """ + Print a bold-style warning for missing startup settings and return them. + """ + missing = [ + name + for name in CRITICAL_STARTUP_SETTINGS + if not str(getattr(settings, name, '') or '').strip() + ] + + if not missing: + return [] + + output = stream or sys.stdout + print( + '*** WARNING: Missing LeadOrbit startup settings: ' + f"{', '.join(missing)} ***", + file=output, + flush=True, + ) + return missing diff --git a/backend/backend/tests.py b/backend/backend/tests.py new file mode 100644 index 0000000..973b428 --- /dev/null +++ b/backend/backend/tests.py @@ -0,0 +1,36 @@ +from io import StringIO + +from django.test import SimpleTestCase, override_settings + +from .startup import warn_missing_critical_settings + + +class StartupSettingsValidationTests(SimpleTestCase): + @override_settings( + GEMINI_API_KEY='', + GOOGLE_CLIENT_ID='', + GOOGLE_CLIENT_SECRET='', + ) + def test_warns_when_critical_settings_are_missing(self): + buffer = StringIO() + + missing = warn_missing_critical_settings(stream=buffer) + + self.assertEqual( + missing, + ['GEMINI_API_KEY', 'GOOGLE_CLIENT_ID', 'GOOGLE_CLIENT_SECRET'], + ) + self.assertIn('Missing LeadOrbit startup settings', buffer.getvalue()) + + @override_settings( + GEMINI_API_KEY='gemini-key', + GOOGLE_CLIENT_ID='client-id', + GOOGLE_CLIENT_SECRET='client-secret', + ) + def test_returns_quietly_when_all_settings_exist(self): + buffer = StringIO() + + missing = warn_missing_critical_settings(stream=buffer) + + self.assertEqual(missing, []) + self.assertEqual(buffer.getvalue(), '') diff --git a/backend/backend/wsgi.py b/backend/backend/wsgi.py index 6cc3f3c..b682e04 100644 --- a/backend/backend/wsgi.py +++ b/backend/backend/wsgi.py @@ -3,3 +3,7 @@ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') application = get_wsgi_application() + +from .startup import warn_missing_critical_settings + +warn_missing_critical_settings()