don't swallow HTTP errors from create_event

tests weren't patching out create_event (which is invoked every time a
user logs in). This was getting caught by our egress proxy on jenkins.
We didn't notice because the event handler code was swallowing all
exceptions and not re-raising.

This changes that code to no longer swallow exceptions. Since we did
that, we also need to update all the tests that test log-in to mock
the call
This commit is contained in:
Leo Hemsted
2018-05-02 10:27:01 +01:00
parent 714b9289b4
commit e8ef6fa174
7 changed files with 40 additions and 15 deletions

View File

@@ -1,3 +1,5 @@
from flask import request
from app import events_api_client
@@ -6,17 +8,15 @@ def on_user_logged_in(sender, user):
def _send_event(sender, **kwargs):
from flask import request
try:
event_data = _construct_event_data(request)
if kwargs.get('user'):
event_data['user_id'] = kwargs.get('user').id
if not kwargs.get('event_type'):
return
events_api_client.create_event(kwargs['event_type'], event_data)
except Exception as e:
sender.logger.error('Error creating event')
sender.logger.error(e)
if not kwargs.get('event_type'):
return
event_data = _construct_event_data(request)
if kwargs.get('user'):
event_data['user_id'] = kwargs.get('user').id
events_api_client.create_event(kwargs['event_type'], event_data)
def _construct_event_data(request):

View File

@@ -1,3 +1,4 @@
from unittest.mock import patch
import pytest
import uuid
@@ -18,12 +19,13 @@ class TestClient(FlaskClient):
session['user_id'] = user.id
if mocker:
mocker.patch('app.user_api_client.get_user', return_value=user)
mocker.patch('app.events_api_client.create_event')
if mocker and service:
with self.session_transaction() as session:
session['service_id'] = service['id']
mocker.patch('app.service_api_client.get_service', return_value={'data': service})
login_user(user)
with patch('app.events_api_client.create_event'):
login_user(user)
def logout(self, user):
self.get(url_for("main.logout"))

View File

@@ -373,6 +373,7 @@ def test_new_invited_user_verifies_and_added_to_service(
mock_get_users_by_service,
mock_get_detailed_service,
mock_get_usage,
mock_create_event,
mocker,
):
# visit accept token page

View File

@@ -239,6 +239,7 @@ def test_register_from_email_auth_invite(
mock_send_verify_email,
mock_send_verify_code,
mock_accept_invite,
mock_create_event,
):
sample_invite['auth_type'] = 'email_auth'
with client.session_transaction() as session:
@@ -287,6 +288,7 @@ def test_can_register_email_auth_without_phone_number(
mock_send_verify_email,
mock_send_verify_code,
mock_accept_invite,
mock_create_event,
):
sample_invite['auth_type'] = 'email_auth'
with client.session_transaction() as session:

View File

@@ -26,6 +26,7 @@ def test_should_login_user_and_should_redirect_to_next_url(
mock_get_user,
mock_get_user_by_email,
mock_check_verify_code,
mock_create_event,
):
with client.session_transaction() as session:
session['user_details'] = {
@@ -48,6 +49,7 @@ def test_should_login_user_and_not_redirect_to_external_url(
mock_get_user_by_email,
mock_check_verify_code,
mock_get_services_with_one_service,
mock_create_event,
):
with client.session_transaction() as session:
session['user_details'] = {
@@ -65,6 +67,7 @@ def test_should_login_user_and_redirect_to_show_accounts(
mock_get_user,
mock_get_user_by_email,
mock_check_verify_code,
mock_create_event,
):
with client.session_transaction() as session:
session['user_details'] = {
@@ -100,6 +103,7 @@ def test_should_login_user_when_multiple_valid_codes_exist(
mock_get_user_by_email,
mock_check_verify_code,
mock_get_services_with_one_service,
mock_create_event,
):
with client.session_transaction() as session:
session['user_details'] = {
@@ -117,6 +121,7 @@ def test_two_factor_should_set_password_when_new_password_exists_in_session(
mock_check_verify_code,
mock_get_services_with_one_service,
mock_update_user_password,
mock_create_event,
):
with client.session_transaction() as session:
session['user_details'] = {
@@ -166,6 +171,7 @@ def test_two_factor_should_activate_pending_user(
mocker,
api_user_pending,
mock_check_verify_code,
mock_create_event,
mock_activate_user,
):
mocker.patch('app.user_api_client.get_user', return_value=api_user_pending)
@@ -186,7 +192,8 @@ def test_valid_two_factor_email_link_logs_in_user(
valid_token,
mock_get_user,
mock_get_services_with_one_service,
mocker
mocker,
mock_create_event,
):
mocker.patch('app.user_api_client.check_verify_code', return_value=(True, ''))

View File

@@ -32,7 +32,8 @@ def test_should_redirect_to_add_service_when_sms_code_is_correct(
mocker,
mock_update_user_attribute,
mock_check_verify_code,
fake_uuid
mock_create_event,
fake_uuid,
):
api_user_active.current_session_id = str(uuid.UUID(int=1))
mocker.patch('app.user_api_client.get_user', return_value=api_user_active)
@@ -60,6 +61,7 @@ def test_should_activate_user_after_verify(
api_user_pending,
mock_send_verify_code,
mock_check_verify_code,
mock_create_event,
mock_activate_user,
):
mocker.patch('app.user_api_client.get_user', return_value=api_user_pending)

View File

@@ -2923,3 +2923,14 @@ def mock_get_organisations_and_services_for_user(mocker, organisation_one, api_u
'app.user_api_client.get_organisations_and_services_for_user',
side_effect=_get_orgs_and_services
)
@pytest.fixture
def mock_create_event(mocker):
"""
This should be used whenever your code is calling `flask_login.login_user`
"""
def _add_event(event_type, event_data):
return
return mocker.patch('app.events_api_client.create_event', side_effect=_add_event)