From 8f3ba46b279f261cd5c7f4b5b3529524cb09d34a Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Mon, 12 Dec 2016 14:11:34 +0000 Subject: [PATCH] Preserve message in session if we go out of hours MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a real edge case, but it seems worth handling. How you’d get to this case: - it’s 5:29pm and you start to describe the problem you’re having - it’s 5:31pm and you click ‘submit’ - you’re redirected to the triage page because we’re now out of hours - you click ‘this is a serious problem’ What would be bad thing to happen: - you’re back on the message page and all the stuff you’ve written is gone What would be a good thing to happen: - we save the message in a session so that you can check it again before sending it --- app/main/views/feedback.py | 6 +++++- tests/app/main/views/test_feedback.py | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/app/main/views/feedback.py b/app/main/views/feedback.py index 49c5d419a..d7a5ce94d 100644 --- a/app/main/views/feedback.py +++ b/app/main/views/feedback.py @@ -1,6 +1,6 @@ import requests import pytz -from flask import render_template, url_for, redirect, flash, current_app, abort, request +from flask import render_template, url_for, redirect, flash, current_app, abort, request, session from flask_login import current_user from app import convert_to_boolean, current_service, service_api_client from app.main import main @@ -41,6 +41,9 @@ def feedback(ticket_type): abort(404) form = Support() + if not form.feedback.data: + form.feedback.data = session.pop('feedback_message', '') + severe = request.args.get('severe') urgent = any(( @@ -54,6 +57,7 @@ def feedback(ticket_type): )) if needs_triage(ticket_type, severe): + session['feedback_message'] = form.feedback.data return redirect(url_for('.triage')) if needs_escalation(ticket_type, severe): diff --git a/tests/app/main/views/test_feedback.py b/tests/app/main/views/test_feedback.py index 46aa23cd4..62cf241d2 100644 --- a/tests/app/main/views/test_feedback.py +++ b/tests/app/main/views/test_feedback.py @@ -254,6 +254,33 @@ def test_redirects_to_triage( assert response.location == expected_redirect(_external=True) +def test_doesnt_lose_message_if_post_across_closing( + logged_in_client, + mocker, +): + + mocker.patch('app.main.views.feedback.has_live_services', return_value=True) + mocker.patch('app.main.views.feedback.in_business_hours', return_value=False) + + response = logged_in_client.post( + url_for('main.feedback', ticket_type='problem'), + data={'feedback': 'foo'}, + ) + with logged_in_client.session_transaction() as session: + assert session['feedback_message'] == 'foo' + assert response.status_code == 302 + assert response.location == url_for('.triage', _external=True) + + response = logged_in_client.get( + url_for('main.feedback', ticket_type='problem', severe=True) + ) + assert response.status_code == 200 + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + with logged_in_client.session_transaction() as session: + assert page.find('textarea', {'name': 'feedback'}).text == 'foo' + assert 'feedback_message' not in session + + @pytest.mark.parametrize('get_services_mock, expected_return_value', [ (mock_get_services, True), (mock_get_services_with_no_services, False),