Address PR feedback

This commit is contained in:
Seamus Johnston 2022-09-30 14:14:43 -05:00
parent b5ea6c8e39
commit 828051854e
No known key found for this signature in database
GPG key ID: 2F21225985069105
4 changed files with 26 additions and 28 deletions

View file

@ -28,7 +28,7 @@ Secrets (for example, if you'd like to have a working Login.gov authentication)
DJANGO_SECRET_LOGIN_KEY="<...>" 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 ## Viewing Logs

View file

@ -1,6 +1,7 @@
import os import os
import logging import logging
from contextlib import contextmanager
def get_handlers(): def get_handlers():
"""Obtain pointers to all StreamHandlers.""" """Obtain pointers to all StreamHandlers."""
@ -20,17 +21,16 @@ def get_handlers():
return 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 This is helpful on tests which trigger console messages
(such as errors) which are normal and expected. (such as errors) which are normal and expected.
It can easily be removed to debug a failing test. It can easily be removed to debug a failing test.
""" """
def wrapper(*args, **kwargs):
restore = {} restore = {}
handlers = get_handlers() handlers = get_handlers()
devnull = open(os.devnull, "w") devnull = open(os.devnull, "w")
@ -39,12 +39,11 @@ def dont_print_garbage(f):
for handler in handlers.values(): for handler in handlers.values():
prior = handler.setStream(devnull) prior = handler.setStream(devnull)
restore[handler.name] = prior restore[handler.name] = prior
try:
# run the test # run the test
result = f(*args, **kwargs) yield
finally:
# restore the streams # restore the streams
for handler in handlers.values(): for handler in handlers.values():
handler.setStream(restore[handler.name]) handler.setStream(restore[handler.name])
return result
return wrapper

View file

@ -4,7 +4,7 @@ from django.http import HttpResponse
from django.test import Client, TestCase from django.test import Client, TestCase
from django.urls import reverse from django.urls import reverse
from .common import dont_print_garbage from .common import less_console_noise
@patch("djangooidc.views.CLIENT", autospec=True) @patch("djangooidc.views.CLIENT", autospec=True)
@ -40,18 +40,17 @@ class ViewsTest(TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertContains(response, "Hi") self.assertContains(response, "Hi")
@dont_print_garbage
def test_openid_raises(self, mock_client): def test_openid_raises(self, mock_client):
# mock # mock
mock_client.create_authn_request.side_effect = Exception("Test") mock_client.create_authn_request.side_effect = Exception("Test")
# test # test
with less_console_noise():
response = self.client.get(reverse("openid")) response = self.client.get(reverse("openid"))
# assert # assert
self.assertEqual(response.status_code, 500) self.assertEqual(response.status_code, 500)
self.assertTemplateUsed(response, "500.html") self.assertTemplateUsed(response, "500.html")
self.assertIn("Server Error", response.content.decode("utf-8")) self.assertIn("Server Error", response.content.decode("utf-8"))
@dont_print_garbage
def test_login_callback_reads_next(self, mock_client): def test_login_callback_reads_next(self, mock_client):
# setup # setup
session = self.client.session session = self.client.session
@ -60,25 +59,25 @@ class ViewsTest(TestCase):
# mock # mock
mock_client.callback.side_effect = self.user_info mock_client.callback.side_effect = self.user_info
# test # test
with less_console_noise():
response = self.client.get(reverse("openid_login_callback")) response = self.client.get(reverse("openid_login_callback"))
# assert # assert
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertEqual(response.url, reverse("logout")) self.assertEqual(response.url, reverse("logout"))
@patch("djangooidc.views.authenticate") @patch("djangooidc.views.authenticate")
@dont_print_garbage
def test_login_callback_raises(self, mock_auth, mock_client): def test_login_callback_raises(self, mock_auth, mock_client):
# mock # mock
mock_client.callback.side_effect = self.user_info mock_client.callback.side_effect = self.user_info
mock_auth.return_value = None mock_auth.return_value = None
# test # test
with less_console_noise():
response = self.client.get(reverse("openid_login_callback")) response = self.client.get(reverse("openid_login_callback"))
# assert # assert
self.assertEqual(response.status_code, 401) self.assertEqual(response.status_code, 401)
self.assertTemplateUsed(response, "401.html") self.assertTemplateUsed(response, "401.html")
self.assertIn("Unauthorized", response.content.decode("utf-8")) self.assertIn("Unauthorized", response.content.decode("utf-8"))
@dont_print_garbage
def test_logout_redirect_url(self, mock_client): def test_logout_redirect_url(self, mock_client):
# setup # setup
session = self.client.session session = self.client.session
@ -94,6 +93,7 @@ class ViewsTest(TestCase):
"end_session_endpoint": "http://example.com/log_me_out" "end_session_endpoint": "http://example.com/log_me_out"
} }
# test # test
with less_console_noise():
response = self.client.get(reverse("logout")) response = self.client.get(reverse("logout"))
# assert # assert
expected = ( expected = (
@ -105,10 +105,10 @@ class ViewsTest(TestCase):
self.assertEqual(actual, expected) self.assertEqual(actual, expected)
@patch("djangooidc.views.auth_logout") @patch("djangooidc.views.auth_logout")
@dont_print_garbage
def test_logout_always_logs_out(self, mock_logout, _): def test_logout_always_logs_out(self, mock_logout, _):
# Without additional mocking, logout will always fail. # Without additional mocking, logout will always fail.
# Here we test that auth_logout is called regardless # Here we test that auth_logout is called regardless
with less_console_noise():
self.client.get(reverse("logout")) self.client.get(reverse("logout"))
self.assertTrue(mock_logout.called) self.assertTrue(mock_logout.called)

View file

@ -50,7 +50,6 @@ env_base_url = env.str("DJANGO_BASE_URL")
secret_login_key = b64decode(secret("DJANGO_SECRET_LOGIN_KEY", "")) secret_login_key = b64decode(secret("DJANGO_SECRET_LOGIN_KEY", ""))
secret_key = secret("DJANGO_SECRET_KEY") secret_key = secret("DJANGO_SECRET_KEY")
cli_testing_mode = True if "test" in sys_argv else False
# region: Basic Django Config-----------------------------------------------### # region: Basic Django Config-----------------------------------------------###