Merge branch 'master' into testing-doc

This commit is contained in:
Rebecca Law
2017-01-31 16:36:03 +00:00
13 changed files with 26 additions and 47 deletions

4
Jenkinsfile vendored
View File

@@ -101,8 +101,8 @@ try {
stage('Staging') { stage('Staging') {
if (deployToStaging == "true") { if (deployToStaging == "true") {
input 'Approve?'
milestone 40 milestone 40
input 'Approve?'
node { node {
unstash 'source' unstash 'source'
deploy 'staging' deploy 'staging'
@@ -122,8 +122,8 @@ try {
stage('Prod') { stage('Prod') {
if (deployToProduction == "true") { if (deployToProduction == "true") {
input 'Approve?'
milestone 50 milestone 50
input 'Approve?'
node { node {
unstash 'source' unstash 'source'
deploy 'production' deploy 'production'

View File

@@ -76,7 +76,6 @@ class Config(object):
r"ucds\.email", r"ucds\.email",
r"naturalengland\.org\.uk", r"naturalengland\.org\.uk",
r"hmcts\.net", r"hmcts\.net",
r"irmsecurity\.com", # temp addition for pen testers to be able to create account
] ]

View File

@@ -369,7 +369,6 @@ def recheck_messages(service_id, template_type, upload_id):
@login_required @login_required
@user_has_permissions('send_texts', 'send_emails', 'send_letters') @user_has_permissions('send_texts', 'send_emails', 'send_letters')
def start_job(service_id, upload_id): def start_job(service_id, upload_id):
upload_data = session['upload_data'] upload_data = session['upload_data']
if request.files or not upload_data.get('valid'): if request.files or not upload_data.get('valid'):
@@ -378,14 +377,6 @@ def start_job(service_id, upload_id):
session.pop('upload_data') session.pop('upload_data')
template = service_api_client.get_service_template(
service_id,
upload_data.get('template_id')
)['data']
if template['template_type'] == 'letter':
abort(403)
job_api_client.create_job( job_api_client.create_job(
upload_id, upload_id,
service_id, service_id,

View File

@@ -186,12 +186,12 @@ def service_switch_can_send_letters(service_id):
return redirect(url_for('.service_settings', service_id=service_id)) return redirect(url_for('.service_settings', service_id=service_id))
@main.route("/services/<service_id>/service-settings/deactivate", methods=['GET', 'POST']) @main.route("/services/<service_id>/service-settings/archive", methods=['GET', 'POST'])
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', admin_override=True)
def deactivate_service(service_id): def archive_service(service_id):
if request.method == 'POST': if request.method == 'POST':
service_api_client.deactivate_service(service_id) service_api_client.archive_service(service_id)
return redirect(url_for('.service_settings', service_id=service_id)) return redirect(url_for('.service_settings', service_id=service_id))
else: else:
flash('There\'s no way to reverse this! Are you sure you want to archive this service?', 'delete') flash('There\'s no way to reverse this! Are you sure you want to archive this service?', 'delete')

View File

@@ -103,8 +103,8 @@ class ServiceAPIClient(NotifyAdminAPIClient):
def update_service_with_properties(self, service_id, properties): def update_service_with_properties(self, service_id, properties):
return self.update_service(service_id, **properties) return self.update_service(service_id, **properties)
def deactivate_service(self, service_id): def archive_service(self, service_id):
return self.post('/service/{}/deactivate'.format(service_id), data=None) return self.post('/service/{}/archive'.format(service_id), data=None)
def remove_user_from_service(self, service_id, user_id): def remove_user_from_service(self, service_id, user_id):
""" """

View File

@@ -95,6 +95,7 @@
<li><a href="{{ url_for("main.trial_mode") }}">Trial mode</a></li> <li><a href="{{ url_for("main.trial_mode") }}">Trial mode</a></li>
<li><a href="{{ url_for("main.pricing") }}">Pricing</a></li> <li><a href="{{ url_for("main.pricing") }}">Pricing</a></li>
<li><a href="{{ url_for("main.delivery_and_failure") }}">Delivery and failure</a></li> <li><a href="{{ url_for("main.delivery_and_failure") }}">Delivery and failure</a></li>
<li><a href="https://www.gov.uk/performance/govuk-notify">Performance</a></li>
</ul> </ul>
</div> </div>
<div class="column-one-third"> <div class="column-one-third">

View File

@@ -6,11 +6,7 @@
{% block maincolumn_content %} {% block maincolumn_content %}
<div class="grid-row bottom-gutter"> <h2 class="heading-large">All templates used this year</h2>
<div class="column-half">
<h2 class="heading-large">Templates sent</h2>
</div>
</div>
{% include 'views/dashboard/template-statistics.html' %} {% include 'views/dashboard/template-statistics.html' %}

View File

@@ -111,7 +111,7 @@
</li> </li>
{% if current_service.active %} {% if current_service.active %}
<li class="bottom-gutter"> <li class="bottom-gutter">
<a href="{{ url_for('.deactivate_service', service_id=current_service.id) }}" class="button"> <a href="{{ url_for('.archive_service', service_id=current_service.id) }}" class="button">
Archive service Archive service
</a> </a>
</li> </li>

View File

@@ -121,7 +121,7 @@
<div class="grid-row bottom-gutter"> <div class="grid-row bottom-gutter">
<div class="column-half"> <div class="column-half">
<h3 class="visually-hidden">Services</h3> <h3 class="visually-hidden">Services</h3>
<div class="product-page-big-number">27</div> <div class="product-page-big-number">28</div>
services services
</div> </div>
<div class="column-half"> <div class="column-half">

View File

@@ -29,4 +29,4 @@ whitenoise==1.0.6 #manages static assets
# pin to minor version 3.1.x # pin to minor version 3.1.x
notifications-python-client>=3.1,<3.2 notifications-python-client>=3.1,<3.2
git+https://github.com/alphagov/notifications-utils.git@13.2.0#egg=notifications-utils==13.2.0 git+https://github.com/alphagov/notifications-utils.git@13.2.1#egg=notifications-utils==13.2.1

View File

@@ -82,7 +82,6 @@ def _gen_mock_field(x):
'test@ucds.email', 'test@ucds.email',
'test@naturalengland.org.uk', 'test@naturalengland.org.uk',
'test@hmcts.net', 'test@hmcts.net',
'test@irmsecurity.com' # remove once pen test complete
]) ])
def test_valid_list_of_white_list_email_domains(app_, email): def test_valid_list_of_white_list_email_domains(app_, email):
with app_.test_request_context(): with app_.test_request_context():

View File

@@ -409,31 +409,24 @@ def test_create_job_should_call_api(
) )
def test_cant_start_letters_job( def test_can_start_letters_job(
app_, logged_in_client,
client,
service_one,
mock_get_service,
active_user_with_permissions,
mock_create_job, mock_create_job,
mock_get_service_letter_template, mock_get_service_letter_template,
mocker,
fake_uuid fake_uuid
): ):
client.login(active_user_with_permissions, mocker, service_one) with logged_in_client.session_transaction() as session:
with client.session_transaction() as session:
session['upload_data'] = { session['upload_data'] = {
'original_file_name': 'example.csv', 'original_file_name': 'example.csv',
'template_id': fake_uuid, 'template_id': fake_uuid,
'notification_count': 123, 'notification_count': 123,
'valid': True 'valid': True
} }
response = client.post( response = logged_in_client.post(
url_for('main.start_job', service_id=fake_uuid, upload_id=fake_uuid), url_for('main.start_job', service_id=fake_uuid, upload_id=fake_uuid),
data={} data={}
) )
assert response.status_code == 403 assert response.status_code == 302
mock_create_job.assert_not_called()
@pytest.mark.parametrize( @pytest.mark.parametrize(

View File

@@ -396,7 +396,7 @@ def test_log_error_on_request_to_go_live(
'main.service_name_change', 'main.service_name_change',
'main.service_name_change_confirm', 'main.service_name_change_confirm',
'main.service_request_to_go_live', 'main.service_request_to_go_live',
'main.deactivate_service' 'main.archive_service'
]) ])
def test_route_permissions(mocker, app_, api_user_active, service_one, route): def test_route_permissions(mocker, app_, api_user_active, service_one, route):
with app_.test_request_context(): with app_.test_request_context():
@@ -419,7 +419,7 @@ def test_route_permissions(mocker, app_, api_user_active, service_one, route):
'main.service_switch_live', 'main.service_switch_live',
'main.service_switch_research_mode', 'main.service_switch_research_mode',
'main.service_switch_can_send_letters', 'main.service_switch_can_send_letters',
'main.deactivate_service', 'main.archive_service',
]) ])
def test_route_invalid_permissions(mocker, app_, api_user_active, service_one, route): def test_route_invalid_permissions(mocker, app_, api_user_active, service_one, route):
with app_.test_request_context(): with app_.test_request_context():
@@ -458,7 +458,7 @@ def test_route_for_platform_admin(mocker, app_, platform_admin_user, service_one
'main.service_switch_can_send_letters', 'main.service_switch_can_send_letters',
]) ])
def test_route_for_platform_admin_update_service(mocker, app_, platform_admin_user, service_one, route): def test_route_for_platform_admin_update_service(mocker, app_, platform_admin_user, service_one, route):
mocker.patch('app.service_api_client.deactivate_service') mocker.patch('app.service_api_client.archive_service')
with app_.test_request_context(): with app_.test_request_context():
validate_route_permission(mocker, validate_route_permission(mocker,
app_, app_,
@@ -750,22 +750,22 @@ def test_switch_service_disable_letters(client, platform_admin_user, mocker):
assert mocked_fn.call_args == call(service['id'], {"can_send_letters": False}) assert mocked_fn.call_args == call(service['id'], {"can_send_letters": False})
def test_deactivate_service_after_confirm(client, platform_admin_user, service_one, mocker): def test_archive_service_after_confirm(client, platform_admin_user, service_one, mocker):
mocked_fn = mocker.patch('app.service_api_client.post', return_value=service_one) mocked_fn = mocker.patch('app.service_api_client.post', return_value=service_one)
client.login(platform_admin_user, mocker, service_one) client.login(platform_admin_user, mocker, service_one)
response = client.post(url_for('main.deactivate_service', service_id=service_one['id'])) response = client.post(url_for('main.archive_service', service_id=service_one['id']))
assert response.status_code == 302 assert response.status_code == 302
assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True) assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True)
assert mocked_fn.call_args == call('/service/{}/deactivate'.format(service_one['id']), data=None) assert mocked_fn.call_args == call('/service/{}/archive'.format(service_one['id']), data=None)
def test_deactivate_service_prompts_user(client, platform_admin_user, service_one, mocker): def test_archive_service_prompts_user(client, platform_admin_user, service_one, mocker):
mocked_fn = mocker.patch('app.service_api_client.post') mocked_fn = mocker.patch('app.service_api_client.post')
client.login(platform_admin_user, mocker, service_one) client.login(platform_admin_user, mocker, service_one)
response = client.get(url_for('main.deactivate_service', service_id=service_one['id'])) response = client.get(url_for('main.archive_service', service_id=service_one['id']))
assert response.status_code == 200 assert response.status_code == 200
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
@@ -773,7 +773,7 @@ def test_deactivate_service_prompts_user(client, platform_admin_user, service_on
assert mocked_fn.called is False assert mocked_fn.called is False
def test_cant_deactivate_inactive_service(client, platform_admin_user, service_one, mocker): def test_cant_archive_inactive_service(client, platform_admin_user, service_one, mocker):
service_one['active'] = False service_one['active'] = False
client.login(platform_admin_user, mocker, service_one) client.login(platform_admin_user, mocker, service_one)