From 7067429b8aff904b4528abc15bcde554e1bac015 Mon Sep 17 00:00:00 2001 From: Saurabh Kumar Bajpai Date: Mon, 22 Jun 2026 11:03:47 +0530 Subject: [PATCH] feat: warn on missing startup env vars --- backend/backend/asgi.py | 2 ++ backend/backend/startup.py | 20 ++++++++++++++++++++ backend/backend/wsgi.py | 2 ++ backend/users/tests.py | 17 +++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 backend/backend/startup.py diff --git a/backend/backend/asgi.py b/backend/backend/asgi.py index 06ebebd..6c26afb 100644 --- a/backend/backend/asgi.py +++ b/backend/backend/asgi.py @@ -1,5 +1,7 @@ import os from django.core.asgi import get_asgi_application +from .startup import warn_missing_startup_env_vars os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') application = get_asgi_application() +warn_missing_startup_env_vars() diff --git a/backend/backend/startup.py b/backend/backend/startup.py new file mode 100644 index 0000000..4abba06 --- /dev/null +++ b/backend/backend/startup.py @@ -0,0 +1,20 @@ +from django.conf import settings + +_WARNED = False + + +def warn_missing_startup_env_vars(): + global _WARNED + if _WARNED: + return + + required = ('GEMINI_API_KEY', 'GOOGLE_CLIENT_ID', 'GOOGLE_CLIENT_SECRET') + missing = [name for name in required if not str(getattr(settings, name, '') or '').strip()] + if not missing: + return + + _WARNED = True + print( + f"\033[1m[LeadOrbit startup warning]\033[0m Missing environment variables: {', '.join(missing)}", + flush=True, + ) diff --git a/backend/backend/wsgi.py b/backend/backend/wsgi.py index 6cc3f3c..f80ea40 100644 --- a/backend/backend/wsgi.py +++ b/backend/backend/wsgi.py @@ -1,5 +1,7 @@ import os from django.core.wsgi import get_wsgi_application +from .startup import warn_missing_startup_env_vars os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') application = get_wsgi_application() +warn_missing_startup_env_vars() diff --git a/backend/users/tests.py b/backend/users/tests.py index 2c73fd9..3a6b013 100644 --- a/backend/users/tests.py +++ b/backend/users/tests.py @@ -1,3 +1,6 @@ +from unittest.mock import patch + +from django.test import SimpleTestCase, override_settings from rest_framework import status from rest_framework.test import APITestCase @@ -104,3 +107,17 @@ def test_member_cannot_delete_organization(self): self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertTrue(Organization.objects.filter(id=self.organization.id).exists()) self.assertTrue(User.objects.filter(id=self.user.id).exists()) + + +@override_settings(GEMINI_API_KEY='', GOOGLE_CLIENT_ID='', GOOGLE_CLIENT_SECRET='') +class StartupValidationTests(SimpleTestCase): + @patch('builtins.print') + def test_warn_missing_startup_env_vars_prints_bold_warning(self, mock_print): + from backend.startup import warn_missing_startup_env_vars + + warn_missing_startup_env_vars() + + mock_print.assert_called_once() + warning_message = mock_print.call_args.args[0] + self.assertIn('[LeadOrbit startup warning]', warning_message) + self.assertIn('Missing environment variables: GEMINI_API_KEY, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET', warning_message)