def test_simple_polygons(fake_uuid): broadcast_message = BroadcastMessage( broadcast_message_json( id_=fake_uuid, service_id=fake_uuid, template_id=fake_uuid, status='draft', created_by_id=fake_uuid, areas=[ # Hackney Central 'wd20-E05009372', # Hackney Wick 'wd20-E05009374', ], )) assert [ [ len(polygon) for polygon in broadcast_message.polygons.as_coordinate_pairs_lat_long ], [ len(polygon) for polygon in broadcast_message.simple_polygons.as_coordinate_pairs_lat_long ], ] == [ # One polygon for each area [27, 31], # Because the areas are close to each other, the simplification # and unioning process results in a single polygon with fewer # total coordinates [55], ]
def test_cant_reject_broadcast_in_wrong_state( mocker, client_request, service_one, mock_get_broadcast_template, fake_uuid, mock_update_broadcast_message, mock_update_broadcast_message_status, initial_status, ): mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, finishes_at='2020-02-23T23:23:23.000000', status=initial_status, ), ) service_one['permissions'] += ['broadcast'] client_request.get('.reject_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, _expected_redirect=url_for( '.view_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, _external=True, )) assert mock_update_broadcast_message.called is False assert mock_update_broadcast_message_status.called is False
def test_content_comes_from_attribute_not_template(fake_uuid): broadcast_message = BroadcastMessage(broadcast_message_json( id_=fake_uuid, service_id=fake_uuid, template_id=fake_uuid, status='draft', created_by_id=fake_uuid, )) assert broadcast_message.content == 'This is a test'
def test_request_approval( mocker, client_request, service_one, mock_get_broadcast_template, fake_uuid, mock_update_broadcast_message, mock_update_broadcast_message_status, initial_status, expected_approval, trial_mode, expected_redirect, ): mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, finishes_at='2020-02-23T23:23:23.000000', status=initial_status, ), ) service_one['restricted'] = trial_mode service_one['permissions'] += ['broadcast'] client_request.post('.view_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, _expected_redirect=expected_redirect( service_id=SERVICE_ONE_ID, _external=True, )) if expected_approval: mock_update_broadcast_message.assert_called_once_with( service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, data={ 'starts_at': '2020-02-22T22:22:22', 'finishes_at': '2020-02-23T22:21:22', }, ) mock_update_broadcast_message_status.assert_called_once_with( 'broadcasting', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, ) else: assert mock_update_broadcast_message.called is False assert mock_update_broadcast_message_status.called is False
def test_view_pending_broadcast( mocker, client_request, service_one, active_user_with_permissions, mock_get_broadcast_template, fake_uuid, ): mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, finishes_at=None, status='pending-approval', ), ) mocker.patch( 'app.user_api_client.get_user', side_effect=[ active_user_with_permissions, # Current user user_json(id_=uuid.uuid4()), # User who created broadcast ]) service_one['permissions'] += ['broadcast'] page = client_request.get( '.view_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, ) assert (normalize_spaces(page.select_one('.banner').text)) == ( 'Test User wants to broadcast Example template ' 'Start broadcasting now Reject this alert') form = page.select_one('form.banner') assert form['method'] == 'post' assert 'action' not in form assert form.select_one('button[type=submit]') link = form.select_one('a.govuk-link.govuk-link--destructive') assert link.text == 'Reject this alert' assert link['href'] == url_for( '.reject_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, )
def test_cant_approve_own_broadcast( mocker, client_request, service_one, active_user_with_permissions, mock_get_broadcast_template, fake_uuid, ): service_one['restricted'] = False mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, finishes_at='2020-02-23T23:23:23.000000', status='pending-approval', ), ) mocker.patch( 'app.user_api_client.get_user', side_effect=[ active_user_with_permissions, # Current user active_user_with_permissions, # User who created broadcast (the same) ]) service_one['permissions'] += ['broadcast'] page = client_request.get( '.view_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, ) assert (normalize_spaces(page.select_one('.banner h1').text)) == ( 'Example template is waiting for approval') assert (normalize_spaces(page.select_one('.banner p').text)) == ( 'You need another member of your team to approve your alert.') assert not page.select('form') link = page.select_one('.banner a.govuk-link.govuk-link--destructive') assert link.text == 'Withdraw this alert' assert link['href'] == url_for( '.reject_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, )
def test_raises_for_missing_areas(fake_uuid): broadcast_message = BroadcastMessage(broadcast_message_json( id_=fake_uuid, service_id=fake_uuid, template_id=fake_uuid, status='draft', created_by_id=fake_uuid, areas=[ 'wd20-E05009372', 'something else', ], )) with pytest.raises(RuntimeError) as exception: broadcast_message.areas assert str(exception.value) == ( 'BroadcastMessage has 2 areas but 1 found in the library' )
def test_view_pending_broadcast( mocker, client_request, service_one, mock_get_broadcast_template, fake_uuid, ): mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, finishes_at='2020-02-23T23:23:23.000000', status='pending-approval', ), ) service_one['permissions'] += ['broadcast'] page = client_request.get( '.view_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, ) assert (normalize_spaces(page.select_one('.banner').text)) == ( 'Test User wants to broadcast this message until tomorrow at 11:23pm. ' 'Start broadcasting now Reject this broadcast') form = page.select_one('form.banner') assert form['method'] == 'post' assert 'action' not in form assert form.select_one('button[type=submit]') link = form.select_one('a.govuk-link.govuk-link--destructive') assert link.text == 'Reject this broadcast' assert link['href'] == url_for( '.reject_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, )
def test_view_only_user_cant_approve_broadcast( mocker, client_request, service_one, active_user_with_permissions, active_user_view_permissions, mock_get_broadcast_template, fake_uuid, ): mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, finishes_at='2020-02-23T23:23:23.000000', status='pending-approval', ), ) mocker.patch( 'app.user_api_client.get_user', side_effect=[ active_user_view_permissions, # Current user active_user_with_permissions, # User who created broadcast ]) service_one['permissions'] += ['broadcast'] page = client_request.get( '.view_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, ) assert (normalize_spaces(page.select_one('.banner').text)) == ( 'This alert is waiting for approval ' 'You don’t have permission to approve alerts.') assert not page.select_one('form') assert not page.select_one('.banner a')
def test_view_broadcast_message_page( mocker, client_request, service_one, active_user_with_permissions, mock_get_broadcast_template, fake_uuid, extra_fields, expected_paragraphs, ): mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, approved_by_id=fake_uuid, starts_at='2020-02-20T20:20:20.000000', **extra_fields), ) mocker.patch('app.user_api_client.get_user', side_effect=[ active_user_with_permissions, user_json(name='Alice'), user_json(name='Bob'), user_json(name='Carol'), ]) service_one['permissions'] += ['broadcast'] page = client_request.get( '.view_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, ) assert [ normalize_spaces(p.text) for p in page.select('main p.govuk-body') ] == expected_paragraphs
def test_reject_broadcast( mocker, client_request, service_one, mock_get_broadcast_template, fake_uuid, mock_update_broadcast_message, mock_update_broadcast_message_status, ): mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, finishes_at='2020-02-23T23:23:23.000000', status='pending-approval', ), ) service_one['permissions'] += ['broadcast'] client_request.get('.reject_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, _expected_redirect=url_for( '.broadcast_dashboard', service_id=SERVICE_ONE_ID, _external=True, )) assert mock_update_broadcast_message.called is False mock_update_broadcast_message_status.assert_called_once_with( 'rejected', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, )
def test_can_approve_own_broadcast_in_trial_mode( mocker, client_request, service_one, active_user_with_permissions, mock_get_broadcast_template, fake_uuid, ): mocker.patch( 'app.broadcast_message_api_client.get_broadcast_message', return_value=broadcast_message_json( id_=fake_uuid, service_id=SERVICE_ONE_ID, template_id=fake_uuid, created_by_id=fake_uuid, finishes_at='2020-02-23T23:23:23.000000', status='pending-approval', ), ) mocker.patch( 'app.user_api_client.get_user', side_effect=[ active_user_with_permissions, # Current user active_user_with_permissions, # User who created broadcast (the same) ]) service_one['permissions'] += ['broadcast'] page = client_request.get( '.view_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, ) assert (normalize_spaces(page.select_one('.banner h1').text)) == ( 'Example template is waiting for approval') assert (normalize_spaces(page.select_one('.banner p').text)) == ( 'When you use a live account you’ll need another member of ' 'your team to approve your alert.') assert (normalize_spaces( page.select_one('.banner details summary').text)) == ( 'Approve your own alert') assert (normalize_spaces(page.select_one('.banner details ').text)) == ( 'Approve your own alert ' 'Because you’re in training mode you can approve your own ' 'alerts, to see how it works. ' 'No real alerts will be broadcast to anyone’s phone. ' 'Start broadcasting now ' 'Cancel this alert') form = page.select_one('.banner details form') assert form['method'] == 'post' assert 'action' not in form assert normalize_spaces(form.select_one('button[type=submit]').text) == ( 'Start broadcasting now') link = page.select_one('.banner a.govuk-link.govuk-link--destructive') assert link.text == 'Cancel this alert' assert link['href'] == url_for( '.reject_broadcast_message', service_id=SERVICE_ONE_ID, broadcast_message_id=fake_uuid, )