diff --git a/docs/developer/README.md b/docs/developer/README.md index ad7ddd418..b04d27810 100644 --- a/docs/developer/README.md +++ b/docs/developer/README.md @@ -28,7 +28,7 @@ Secrets (for example, if you'd like to have a working Login.gov authentication) DJANGO_SECRET_LOGIN_KEY="<...>" ``` -You'll need to create the `.env` file yourself. Get the secrets from Cloud.gov by running `cf env getgov-unstable`. +You'll need to create the `.env` file yourself. Get the secrets from Cloud.gov by running `cf env getgov-unstable`. More information is available in [rotate_application_secrets.md](../operations/runbooks/rotate_application_secrets.md). ## Viewing Logs diff --git a/src/djangooidc/tests/common.py b/src/djangooidc/tests/common.py index 7b6178895..adc7903a2 100644 --- a/src/djangooidc/tests/common.py +++ b/src/djangooidc/tests/common.py @@ -1,6 +1,7 @@ import os import logging +from contextlib import contextmanager def get_handlers(): """Obtain pointers to all StreamHandlers.""" @@ -20,31 +21,29 @@ def get_handlers(): return handlers -def dont_print_garbage(f): +@contextmanager +def less_console_noise(): """ - Decorator to place on tests to silence console logging. + Context manager to use in tests to silence console logging. This is helpful on tests which trigger console messages (such as errors) which are normal and expected. It can easily be removed to debug a failing test. """ + restore = {} + handlers = get_handlers() + devnull = open(os.devnull, "w") - def wrapper(*args, **kwargs): - restore = {} - handlers = get_handlers() - devnull = open(os.devnull, "w") - - # redirect all the streams - for handler in handlers.values(): - prior = handler.setStream(devnull) - restore[handler.name] = prior + # redirect all the streams + for handler in handlers.values(): + prior = handler.setStream(devnull) + restore[handler.name] = prior + try: # run the test - result = f(*args, **kwargs) + yield + finally: # restore the streams for handler in handlers.values(): handler.setStream(restore[handler.name]) - return result - - return wrapper diff --git a/src/djangooidc/tests/test_views.py b/src/djangooidc/tests/test_views.py index 883838d18..0d28ae355 100644 --- a/src/djangooidc/tests/test_views.py +++ b/src/djangooidc/tests/test_views.py @@ -4,7 +4,7 @@ from django.http import HttpResponse from django.test import Client, TestCase from django.urls import reverse -from .common import dont_print_garbage +from .common import less_console_noise @patch("djangooidc.views.CLIENT", autospec=True) @@ -40,18 +40,17 @@ class ViewsTest(TestCase): self.assertEqual(response.status_code, 200) self.assertContains(response, "Hi") - @dont_print_garbage def test_openid_raises(self, mock_client): # mock mock_client.create_authn_request.side_effect = Exception("Test") # test - response = self.client.get(reverse("openid")) + with less_console_noise(): + response = self.client.get(reverse("openid")) # assert self.assertEqual(response.status_code, 500) self.assertTemplateUsed(response, "500.html") self.assertIn("Server Error", response.content.decode("utf-8")) - @dont_print_garbage def test_login_callback_reads_next(self, mock_client): # setup session = self.client.session @@ -60,25 +59,25 @@ class ViewsTest(TestCase): # mock mock_client.callback.side_effect = self.user_info # test - response = self.client.get(reverse("openid_login_callback")) + with less_console_noise(): + response = self.client.get(reverse("openid_login_callback")) # assert self.assertEqual(response.status_code, 302) self.assertEqual(response.url, reverse("logout")) @patch("djangooidc.views.authenticate") - @dont_print_garbage def test_login_callback_raises(self, mock_auth, mock_client): # mock mock_client.callback.side_effect = self.user_info mock_auth.return_value = None # test - response = self.client.get(reverse("openid_login_callback")) + with less_console_noise(): + response = self.client.get(reverse("openid_login_callback")) # assert self.assertEqual(response.status_code, 401) self.assertTemplateUsed(response, "401.html") self.assertIn("Unauthorized", response.content.decode("utf-8")) - @dont_print_garbage def test_logout_redirect_url(self, mock_client): # setup session = self.client.session @@ -94,7 +93,8 @@ class ViewsTest(TestCase): "end_session_endpoint": "http://example.com/log_me_out" } # test - response = self.client.get(reverse("logout")) + with less_console_noise(): + response = self.client.get(reverse("logout")) # assert expected = ( "http://example.com/log_me_out?id_token_hint=TEST&state" @@ -105,11 +105,11 @@ class ViewsTest(TestCase): self.assertEqual(actual, expected) @patch("djangooidc.views.auth_logout") - @dont_print_garbage def test_logout_always_logs_out(self, mock_logout, _): # Without additional mocking, logout will always fail. # Here we test that auth_logout is called regardless - self.client.get(reverse("logout")) + with less_console_noise(): + self.client.get(reverse("logout")) self.assertTrue(mock_logout.called) def test_logout_callback_redirects(self, _): diff --git a/src/registrar/config/settings.py b/src/registrar/config/settings.py index 552ecb587..def6f331b 100644 --- a/src/registrar/config/settings.py +++ b/src/registrar/config/settings.py @@ -50,7 +50,6 @@ env_base_url = env.str("DJANGO_BASE_URL") secret_login_key = b64decode(secret("DJANGO_SECRET_LOGIN_KEY", "")) secret_key = secret("DJANGO_SECRET_KEY") -cli_testing_mode = True if "test" in sys_argv else False # region: Basic Django Config-----------------------------------------------###