def test_uploaded_letter_preview_does_not_show_send_button_if_service_in_trial_mode(
    mocker,
    client_request,
    fake_uuid,
):
    mocker.patch('app.main.views.uploads.service_api_client')
    mocker.patch('app.main.views.uploads.get_letter_metadata', return_value={
        'filename': 'my_letter.pdf', 'page_count': '1', 'status': 'valid', 'recipient': 'The Queen'})

    # client_request uses service_one, which is in trial mode
    page = client_request.get(
        'main.uploaded_letter_preview',
        service_id=SERVICE_ONE_ID,
        file_id=fake_uuid,
        original_filename='my_letter.pdf',
        page_count=1,
        status='valid',
        error={},
        _test_page_title=False,
    )

    assert normalize_spaces(page.find('h1').text) == 'You cannot send this letter'
    assert page.find('div', class_='letter-sent')
    assert normalize_spaces(
        page.select_one('.js-stick-at-bottom-when-scrolling p').text
    ) == (
        'Recipient: The Queen'
    )
    assert not page.find('form')
    assert len(page.select('main button[type=submit]')) == 0
def test_upload_csv_file_shows_error_banner_for_too_many_rows(
    client_request,
    mocker,
    mock_s3_upload,
    mock_get_job_doesnt_exist,
    mock_get_users_by_service,
    fake_uuid,
):
    mocker.patch('app.models.contact_list.s3upload', return_value=fake_uuid)
    mocker.patch('app.models.contact_list.s3download', return_value='\n'.join(
        ['phone number'] + (['07700900986'] * 50001)
    ))

    page = client_request.post(
        'main.upload_contact_list',
        service_id=SERVICE_ONE_ID,
        _data={'file': (BytesIO(''.encode('utf-8')), 'invalid.csv')},
        _follow_redirects=True,
    )

    assert normalize_spaces(page.select_one('.banner-dangerous').text) == (
        'Your file has too many rows '
        'Notify can store files up to 50,000 rows in size. '
        'Your file has 50,001 rows. '
        'Skip to file contents'
    )
    assert len(page.select('tbody tr')) == 50
    assert normalize_spaces(page.select_one('.table-show-more-link').text) == (
        'Only showing the first 50 rows'
    )
def test_upload_csv_file_shows_error_banner(
    client_request,
    mocker,
    mock_s3_upload,
    mock_get_job_doesnt_exist,
    mock_get_users_by_service,
    fake_uuid,
    file_contents,
    expected_error,
    expected_thead,
    expected_tbody,
):
    mock_upload = mocker.patch(
        'app.models.contact_list.s3upload',
        return_value=fake_uuid,
    )
    mock_download = mocker.patch(
        'app.models.contact_list.s3download',
        return_value=file_contents,
    )

    page = client_request.post(
        'main.upload_contact_list',
        service_id=SERVICE_ONE_ID,
        _data={'file': (BytesIO(''.encode('utf-8')), 'invalid.csv')},
        _follow_redirects=True,
    )
    mock_upload.assert_called_once_with(
        SERVICE_ONE_ID,
        {
            'data': '',
            'file_name': 'invalid.csv'
        },
        ANY,
        bucket='test-contact-list',
    )
    mock_download.assert_called_once_with(
        SERVICE_ONE_ID,
        fake_uuid,
        bucket='test-contact-list',
    )

    assert normalize_spaces(
        page.select_one('.banner-dangerous').text) == expected_error

    assert page.select_one('form')['action'] == url_for(
        'main.upload_contact_list',
        service_id=SERVICE_ONE_ID,
    )
    assert page.select_one('form input')['type'] == 'file'

    assert normalize_spaces(page.select_one('thead').text) == expected_thead
    assert normalize_spaces(page.select_one('tbody').text) == expected_tbody
Ejemplo n.º 4
0
def test_get_upload_hub_page(
    mocker,
    client_request,
    service_one,
    mock_get_uploads,
    mock_get_no_contact_lists,
):
    mocker.patch('app.job_api_client.get_jobs', return_value={'data': []})
    service_one['permissions'] += ['letter', 'upload_letters']
    page = client_request.get('main.uploads', service_id=SERVICE_ONE_ID)
    assert page.find('h1').text == 'Uploads'
    assert page.find(
        'a', text=re.compile('Upload a letter')).attrs['href'] == url_for(
            'main.upload_letter', service_id=SERVICE_ONE_ID)

    uploads = page.select('tbody tr')

    assert len(uploads) == 3

    assert normalize_spaces(
        uploads[0].text.strip()) == ('Uploaded letters '
                                     'Printing today at 5:30pm '
                                     '33 letters')
    assert uploads[0].select_one(
        'a.file-list-filename-large')['href'] == url_for(
            'main.uploaded_letters',
            service_id=SERVICE_ONE_ID,
            letter_print_day='2017-10-10',
        )

    assert normalize_spaces(
        uploads[1].text.strip()) == ('some.csv '
                                     'Sent 1 January 2016 at 11:09am '
                                     '0 sending 8 delivered 2 failed')
    assert uploads[1].select_one('a.file-list-filename-large')['href'] == (
        '/services/{}/jobs/job_id_1'.format(SERVICE_ONE_ID))

    assert normalize_spaces(
        uploads[2].text.strip()) == ('some.pdf '
                                     'Sent 1 January 2016 at 11:09am '
                                     'Firstname Lastname '
                                     '123 Example Street')
    assert normalize_spaces(str(uploads[2].select_one('.govuk-body'))) == (
        '<p class="govuk-body letter-recipient-summary"> '
        'Firstname Lastname<br/> '
        '123 Example Street<br/> '
        '</p>')
    assert uploads[2].select_one('a.file-list-filename-large')['href'] == (
        '/services/{}/notification/letter_id_1'.format(SERVICE_ONE_ID))
Ejemplo n.º 5
0
def test_get_uploads_shows_pagination(
    client_request,
    active_user_with_permissions,
    mock_get_jobs,
    mock_get_uploads,
    mock_get_no_contact_lists,
):
    page = client_request.get('main.uploads', service_id=SERVICE_ONE_ID)

    assert normalize_spaces(
        page.select_one('.next-page').text) == ('Next page '
                                                'page 2')
    assert normalize_spaces(
        page.select_one('.previous-page').text) == ('Previous page '
                                                    'page 0')
def test_get_upload_letter(client_request):
    page = client_request.get('main.upload_letter', service_id=SERVICE_ONE_ID)

    assert page.find('h1').text == 'Upload a letter'
    assert page.find('input', class_='file-upload-field')
    assert page.select('main button[type=submit]')
    assert normalize_spaces(page.find('label', class_='file-upload-button').text) == 'Choose file'
def test_upload_csv_shows_trial_mode_error(
    client_request,
    mock_get_users_by_service,
    mock_get_job_doesnt_exist,
    fake_uuid,
    mocker
):
    mocker.patch('app.models.contact_list.s3upload', return_value=fake_uuid)
    mocker.patch('app.models.contact_list.s3download', return_value=(
        'phone number\n'
        '07900900321'  # Not in team
    ))

    page = client_request.get(
        'main.check_contact_list',
        service_id=SERVICE_ONE_ID,
        upload_id=fake_uuid,
        _test_page_title=False,
    )

    assert normalize_spaces(page.select_one('.banner-dangerous').text) == (
        'You cannot save this phone number '
        'In trial mode you can only send to yourself and members of your team '
        'Skip to file contents'
    )
    assert page.select_one('.banner-dangerous a')['href'] == url_for(
        'main.trial_mode_new'
    )
def test_uploads_page_shows_scheduled_jobs(
    mocker,
    client_request,
    mock_get_no_uploads,
    mock_get_jobs,
    mock_get_no_contact_lists,
    user,
):
    client_request.login(user)
    page = client_request.get('main.uploads', service_id=SERVICE_ONE_ID)

    assert [
        normalize_spaces(row.text) for row in page.select('tr')
    ] == [
        (
            'File Status'
        ),
        (
            'even_later.csv '
            'Sending 1 January 2016 at 11:09pm '
            '1 text message waiting to send'
        ),
        (
            'send_me_later.csv '
            'Sending 1 January 2016 at 11:09am '
            '1 text message waiting to send'
        ),
    ]
    assert not page.select('.table-empty-message')
Ejemplo n.º 9
0
def test_uploads_page_shows_contact_lists_first(
    mocker,
    client_request,
    mock_get_no_uploads,
    mock_get_jobs,
    mock_get_contact_lists,
    mock_get_service_data_retention,
):
    page = client_request.get('main.uploads', service_id=SERVICE_ONE_ID)

    assert [normalize_spaces(row.text) for row in page.select('tr')] == [
        ('File Status'),
        ('phone number list.csv '
         'Used twice in the last 7 days '
         '123 saved phone numbers'),
        ('EmergencyContactList.xls '
         'Not used in the last 7 days '
         '100 saved email addresses'),
        ('UnusedList.tsv '
         'Not used yet '
         '1 saved phone number'),
        ('even_later.csv '
         'Sending 1 January 2016 at 11:09pm '
         '1 text message waiting to send'),
        ('send_me_later.csv '
         'Sending 1 January 2016 at 11:09am '
         '1 text message waiting to send'),
    ]
    assert page.select_one('.file-list-filename-large')['href'] == url_for(
        'main.contact_list',
        service_id=SERVICE_ONE_ID,
        contact_list_id='d7b0bd1a-d1c7-4621-be5c-3c1b4278a2ad',
    )
Ejemplo n.º 10
0
def test_post_upload_letter_redirects_for_valid_file(
    mocker,
    active_user_with_permissions,
    service_one,
    client_request,
    fake_uuid,
    extra_permissions,
    expected_allow_international,
):
    mocker.patch('uuid.uuid4', return_value=fake_uuid)
    antivirus_mock = mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=True)
    mock_sanitise = mocker.patch(
        'app.main.views.uploads.sanitise_letter',
        return_value=Mock(
            content='The sanitised content',
            json=lambda: {'file': 'VGhlIHNhbml0aXNlZCBjb250ZW50', 'recipient_address': 'The Queen'}
        )
    )
    mock_s3 = mocker.patch('app.main.views.uploads.upload_letter_to_s3')
    mocker.patch('app.main.views.uploads.get_letter_metadata', return_value=LetterMetadata({
        'filename': 'tests/test_pdf_files/one_page_pdf.pdf',
        'page_count': '1',
        'status': 'valid',
        'recipient': 'The Queen'
    }))
    mocker.patch('app.main.views.uploads.service_api_client.get_precompiled_template')

    service_one['restricted'] = False
    service_one['permissions'] += extra_permissions
    client_request.login(active_user_with_permissions, service=service_one)

    with open('tests/test_pdf_files/one_page_pdf.pdf', 'rb') as file:
        page = client_request.post(
            'main.upload_letter',
            service_id=SERVICE_ONE_ID,
            _data={'file': file},
            _follow_redirects=True,
        )
    assert antivirus_mock.called

    mock_s3.assert_called_once_with(
        b'The sanitised content',
        file_location='service-{}/{}.pdf'.format(SERVICE_ONE_ID, fake_uuid),
        status='valid',
        page_count=1,
        filename='tests/test_pdf_files/one_page_pdf.pdf',
        recipient='The Queen',
    )
    mock_sanitise.assert_called_once_with(
        ANY,
        allow_international_letters=expected_allow_international,
    )

    assert 'The Queen' in page.find('div', class_='js-stick-at-bottom-when-scrolling').text
    assert page.find('h1').text == 'tests/test_pdf_files/one_page_pdf.pdf'
    assert not page.find(id='validation-error-message')

    assert not page.find('input', {'name': 'file_id'})
    assert normalize_spaces(page.select('main button[type=submit]')[0].text) == 'Send 1 letter'
def test_upload_contact_list_page(client_request):
    page = client_request.get(
        'main.upload_contact_list',
        service_id=SERVICE_ONE_ID,
    )
    assert 'action' not in page.select_one('form')
    assert page.select_one('form input')['name'] == 'file'
    assert page.select_one('form input')['type'] == 'file'

    assert normalize_spaces(
        page.select('.spreadsheet')[0].text) == ('Example A '
                                                 '1 email address '
                                                 '2 [email protected]')
    assert normalize_spaces(
        page.select('.spreadsheet')[1].text) == ('Example A '
                                                 '1 phone number '
                                                 '2 07700 900123')
def test_post_upload_letter_shows_error_when_no_file_uploaded(client_request):
    page = client_request.post(
        'main.upload_letter',
        service_id=SERVICE_ONE_ID,
        _data={'file': ''},
        _expected_status=200
    )
    assert page.find('div', class_='banner-dangerous').find('h1').text == 'You need to choose a file to upload'
    assert normalize_spaces(page.find('label', class_='file-upload-button').text) == 'Upload your file again'
Ejemplo n.º 13
0
def test_upload_international_letter_shows_preview_with_no_choice_of_postage(
    mocker,
    active_user_with_permissions,
    service_one,
    client_request,
    fake_uuid,
):
    letter_template = {
        'template_type': 'letter',
        'reply_to_text': '',
        'postage': 'second',
        'subject': 'hi',
        'content': 'my letter',
    }

    mocker.patch('uuid.uuid4', return_value=fake_uuid)
    mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=True)
    mocker.patch('app.main.views.uploads.sanitise_letter', return_value=Mock(
        content='The sanitised content',
        json=lambda: {'file': 'VGhlIHNhbml0aXNlZCBjb250ZW50', 'recipient_address': 'The Queen'}
    ))
    mocker.patch('app.main.views.uploads.upload_letter_to_s3')
    mocker.patch('app.main.views.uploads.pdf_page_count', return_value=3)
    mocker.patch('app.main.views.uploads.get_letter_metadata', return_value=LetterMetadata({
        'filename': 'tests/test_pdf_files/one_page_pdf.pdf',
        'page_count': '3',
        'status': 'valid',
        'recipient': (
            '123 Example Street\n'
            'Andorra la Vella\n'
            'Andorra'
        ),
    }))
    mocker.patch('app.main.views.uploads.service_api_client.get_precompiled_template', return_value=letter_template)

    service_one['restricted'] = False
    client_request.login(active_user_with_permissions, service=service_one)

    with open('tests/test_pdf_files/one_page_pdf.pdf', 'rb') as file:
        page = client_request.post(
            'main.upload_letter',
            service_id=SERVICE_ONE_ID,
            _data={'file': file},
            _follow_redirects=True,
        )

    assert page.find('h1').text == 'tests/test_pdf_files/one_page_pdf.pdf'
    assert not page.select('.letter-postage')
    assert not page.select('input[type=radio]')
    assert normalize_spaces(
        page.select_one('.js-stick-at-bottom-when-scrolling').text
    ) == (
        'Recipient: 123 Example Street, Andorra la Vella, Andorra '
        'Postage: international '
        'Send 1 letter'
    )
def test_post_upload_letter_shows_error_when_file_is_not_a_pdf(client_request):
    with open('tests/non_spreadsheet_files/actually_a_png.csv', 'rb') as file:
        page = client_request.post(
            'main.upload_letter',
            service_id=SERVICE_ONE_ID,
            _data={'file': file},
            _expected_status=200
        )
    assert page.find('h1').text == 'Wrong file type'
    assert page.find('div', class_='banner-dangerous').find('p').text == 'Save your letter as a PDF and try again.'
    assert normalize_spaces(page.find('label', class_='file-upload-button').text) == 'Upload your file again'
def test_post_upload_letter_shows_error_when_file_contains_virus(mocker, client_request):
    mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=False)

    with open('tests/test_pdf_files/one_page_pdf.pdf', 'rb') as file:
        page = client_request.post(
            'main.upload_letter',
            service_id=SERVICE_ONE_ID,
            _data={'file': file},
            _expected_status=400
        )
    assert page.find('div', class_='banner-dangerous').find('h1').text == 'Your file contains a virus'
    assert normalize_spaces(page.find('label', class_='file-upload-button').text) == 'Upload your file again'
Ejemplo n.º 16
0
def test_get_uploaded_letters(
    mocker,
    client_request,
    service_one,
    mock_get_uploaded_letters,
):
    page = client_request.get('main.uploaded_letters',
                              service_id=SERVICE_ONE_ID,
                              letter_print_day='2020-02-02')
    assert page.select_one('.govuk-back-link')['href'] == url_for(
        'main.uploads',
        service_id=SERVICE_ONE_ID,
    )
    assert normalize_spaces(page.select_one('h1').text) == ('Uploaded letters')
    assert normalize_spaces(page.select('main p')[0].text) == ('1,234 letters')
    assert normalize_spaces(
        page.select('main p')[1].text) == ('Printing starts today at 5:30pm')

    assert [normalize_spaces(row.text) for row in page.select('tbody tr')] == [
        ('Homer-Simpson.pdf '
         '742 Evergreen Terrace '
         '2 February at 1:59pm'),
        ('Kevin-McCallister.pdf '
         '671 Lincoln Avenue, Winnetka '
         '2 February at 12:59pm'),
    ]

    assert [link['href'] for link in page.select('tbody tr a')] == [
        url_for(
            'main.view_notification',
            service_id=SERVICE_ONE_ID,
            notification_id='03e34025-be54-4d43-8e6a-fb1ea0fd1f29',
            from_uploaded_letters='2020-02-02',
        ),
        url_for(
            'main.view_notification',
            service_id=SERVICE_ONE_ID,
            notification_id='fc090d91-e761-4464-9041-9c4594c96a35',
            from_uploaded_letters='2020-02-02',
        ),
    ]

    next_page_link = page.select_one('a[rel=next]')
    prev_page_link = page.select_one('a[rel=previous]')
    assert next_page_link['href'] == url_for('main.uploaded_letters',
                                             service_id=SERVICE_ONE_ID,
                                             letter_print_day='2020-02-02',
                                             page=2)
    assert normalize_spaces(next_page_link.text) == ('Next page ' 'page 2')
    assert prev_page_link['href'] == url_for('main.uploaded_letters',
                                             service_id=SERVICE_ONE_ID,
                                             letter_print_day='2020-02-02',
                                             page=0)
    assert normalize_spaces(prev_page_link.text) == ('Previous page ' 'page 0')

    mock_get_uploaded_letters.assert_called_once_with(
        SERVICE_ONE_ID,
        letter_print_day='2020-02-02',
        page=1,
    )
def test_view_contact_list(
    mocker,
    client_request,
    mock_get_contact_list,
    fake_uuid,
):
    mocker.patch('app.models.contact_list.s3download',
                 return_value='\n'.join(['email address'] +
                                        ['*****@*****.**'] * 51))
    page = client_request.get(
        'main.contact_list',
        service_id=SERVICE_ONE_ID,
        contact_list_id=fake_uuid,
    )
    assert normalize_spaces(
        page.select_one('h1').text) == ('EmergencyContactList.xls')
    assert normalize_spaces(page.select('main p')[0].text) == (
        'Uploaded by Test User today at 10:59am')
    assert normalize_spaces(page.select('main p')[1].text) == (
        'Download this list 51 email addresses')
    assert page.select_one('a[download]')['href'] == url_for(
        'main.download_contact_list',
        service_id=SERVICE_ONE_ID,
        contact_list_id=fake_uuid,
    )
    assert normalize_spaces(page.select_one('table').text).startswith(
        'Email addresses '
        '1 email address '
        '2 [email protected] '
        '3 [email protected] ')
    assert normalize_spaces(page.select_one('table').text).endswith(
        '50 [email protected] '
        '51 [email protected]')
    assert normalize_spaces(page.select_one('.table-show-more-link').text) == (
        'Only showing the first 50 rows')
def test_post_choose_upload_file_when_file_is_too_big(mocker, client_request):
    mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=True)

    with open('tests/test_pdf_files/big.pdf', 'rb') as file:
        page = client_request.post(
            'main.upload_letter',
            service_id=SERVICE_ONE_ID,
            _data={'file': file},
            _expected_status=400
        )
    assert page.find('div', class_='banner-dangerous').find('h1').text == 'Your file is too big'
    assert page.find('div', class_='banner-dangerous').find('p').text == 'Files must be smaller than 2MB.'
    assert normalize_spaces(page.find('label', class_='file-upload-button').text) == 'Upload your file again'
def test_upload_csv_shows_ok_page(
    client_request,
    mock_get_live_service,
    mock_get_users_by_service,
    mock_get_job_doesnt_exist,
    fake_uuid,
    mocker
):
    mocker.patch('app.models.contact_list.s3download', return_value='\n'.join(
        ['email address'] + ['*****@*****.**'] * 51
    ))
    mock_metadata_set = mocker.patch('app.models.contact_list.set_metadata_on_csv_upload')

    page = client_request.get(
        'main.check_contact_list',
        service_id=SERVICE_ONE_ID,
        upload_id=fake_uuid,
        original_file_name='good times.xlsx',
        _test_page_title=False,
    )

    mock_metadata_set.assert_called_once_with(
        SERVICE_ONE_ID,
        fake_uuid,
        bucket='test-contact-list',
        row_count=51,
        original_file_name='good times.xlsx',
        template_type='email',
        valid=True,
    )

    assert normalize_spaces(page.select_one('h1').text) == (
        'good times.xlsx'
    )
    assert normalize_spaces(page.select_one('main p').text) == (
        '51 email addresses found'
    )
    assert page.select_one('form')['action'] == url_for(
        'main.save_contact_list',
        service_id=SERVICE_ONE_ID,
        upload_id=fake_uuid,
    )

    assert normalize_spaces(page.select_one('form [type=submit]').text) == (
        'Save contact list'
    )
    assert normalize_spaces(page.select_one('thead').text) == (
        'Row in file 1 email address'
    )
    assert len(page.select('tbody tr')) == 50
    assert normalize_spaces(page.select_one('tbody tr').text) == (
        '2 [email protected]'
    )
    assert normalize_spaces(page.select_one('.table-show-more-link').text) == (
        'Only showing the first 50 rows'
    )
def test_post_choose_upload_file_when_file_is_malformed(mocker, client_request):
    mocker.patch('app.main.views.uploads.antivirus_client.scan', return_value=True)

    with open('tests/test_pdf_files/no_eof_marker.pdf', 'rb') as file:
        page = client_request.post(
            'main.upload_letter',
            service_id=SERVICE_ONE_ID,
            _data={'file': file},
            _expected_status=400
        )
    assert page.find('div', class_='banner-dangerous').find('h1').text == "There’s a problem with your file"
    assert page.find(
        'div', class_='banner-dangerous'
    ).find('p').text == 'Notify cannot read this PDF.Save a new copy of your file and try again.'
    assert normalize_spaces(page.find('label', class_='file-upload-button').text) == 'Upload your file again'
def test_get_upload_hub_with_no_uploads(
    mocker,
    client_request,
    service_one,
    mock_get_no_uploads,
    mock_get_no_contact_lists,
    extra_permissions,
    expected_empty_message,
):
    mocker.patch('app.job_api_client.get_jobs', return_value={'data': []})
    service_one['permissions'] += extra_permissions
    page = client_request.get('main.uploads', service_id=SERVICE_ONE_ID)
    assert normalize_spaces(' '.join(
        paragraph.text for paragraph in page.select('main p')
    )) == expected_empty_message
    assert not page.select('.file-list-filename')
def test_confirm_delete_contact_list(
    mocker,
    client_request,
    fake_uuid,
    mock_get_contact_list,
):
    mocker.patch('app.models.contact_list.s3download',
                 return_value='phone number\n07900900321')
    page = client_request.get(
        'main.delete_contact_list',
        service_id=SERVICE_ONE_ID,
        contact_list_id=fake_uuid,
    )
    assert normalize_spaces(page.select_one('.banner-dangerous').text) == (
        'Are you sure you want to delete ‘EmergencyContactList.xls’? '
        'Yes, delete')
    assert 'action' not in page.select_one('form')
    assert page.select_one('form')['method'] == 'post'
    assert page.select_one('form button')['type'] == 'submit'
Ejemplo n.º 23
0
def test_uploaded_letter_preview_does_not_show_send_button_if_service_in_trial_mode(
    mocker,
    client_request,
    fake_uuid,
):
    mocker.patch('app.main.views.uploads.service_api_client')
    mocker.patch('app.main.views.uploads.get_letter_metadata', return_value={
        'filename': 'my_letter.pdf', 'page_count': '1', 'status': 'valid'})

    # client_request uses service_one, which is in trial mode
    page = client_request.get(
        'main.uploaded_letter_preview',
        service_id=SERVICE_ONE_ID,
        file_id=fake_uuid,
        original_filename='my_letter.pdf',
        page_count=1,
        status='valid',
        error={},
        _test_page_title=False,
    )

    assert normalize_spaces(page.find('h1').text) == 'You cannot send this letter'
    assert page.find('div', class_='letter-sent')
    assert not page.find('button', {'type': 'submit'})
def test_view_contact_list(
    mocker,
    client_request,
    mock_get_contact_list,
    mock_get_no_jobs,
    mock_get_service_data_retention,
    fake_uuid,
    has_jobs,
    expected_empty_message,
):
    mocker.patch(
        'app.models.contact_list.contact_list_api_client.get_contact_list',
        return_value={
            'created_at': '2020-03-03 12:12:12',
            'created_by': 'Test User',
            'id': fake_uuid,
            'original_file_name': 'EmergencyContactList.xls',
            'row_count': 100,
            'recent_job_count': 0,
            'has_jobs': has_jobs,
            'service_id': SERVICE_ONE_ID,
            'template_type': 'email',
        },
    )
    mocker.patch(
        'app.models.contact_list.s3download',
        return_value='\n'.join(['email address'] +
                               [f'test-{i}@example.com' for i in range(51)]))
    page = client_request.get(
        'main.contact_list',
        service_id=SERVICE_ONE_ID,
        contact_list_id=fake_uuid,
    )
    mock_get_no_jobs.assert_called_once_with(
        SERVICE_ONE_ID,
        contact_list_id=fake_uuid,
        limit_days=7,
        statuses={
            'finished',
            'in progress',
            'pending',
            'ready to send',
            'scheduled',
            'sending limits exceeded',
            'sent to dvla',
        },
        page=1,
    )
    assert normalize_spaces(
        page.select_one('h1').text) == ('EmergencyContactList.xls')
    assert normalize_spaces(page.select('main p')[0].text) == (
        'Uploaded by Test User on 3 March at 12:12pm.')
    assert normalize_spaces(
        page.select('main p')[1].text) == (expected_empty_message)
    assert normalize_spaces(
        page.select_one('main h2').text) == ('51 saved email addresses')
    assert page.select_one(
        '.js-stick-at-bottom-when-scrolling a[download]')['href'] == url_for(
            'main.download_contact_list',
            service_id=SERVICE_ONE_ID,
            contact_list_id=fake_uuid,
        )
    assert len(page.select('tbody tr')) == 50
    assert [
        normalize_spaces(page.select('tbody tr')[0].text),
        normalize_spaces(page.select('tbody tr')[1].text),
        normalize_spaces(page.select('tbody tr')[48].text),
        normalize_spaces(page.select('tbody tr')[49].text),
    ] == [
        '*****@*****.**',
        '*****@*****.**',
        '*****@*****.**',
        '*****@*****.**',
    ]
    assert '*****@*****.**' not in page.select_one('tbody').text
    assert normalize_spaces(page.select_one('.table-show-more-link').text) == (
        'Only showing the first 50 rows')
def test_view_jobs_for_contact_list(
    mocker,
    client_request,
    mock_get_jobs,
    mock_get_service_data_retention,
    fake_uuid,
):
    mocker.patch(
        'app.models.contact_list.contact_list_api_client.get_contact_list',
        return_value={
            'created_at': '2015-12-31 12:12:12',
            'created_by': 'Test User',
            'id': fake_uuid,
            'original_file_name': 'EmergencyContactList.xls',
            'row_count': 100,
            'recent_job_count': 0,
            'has_jobs': True,
            'service_id': SERVICE_ONE_ID,
            'template_type': 'email',
        },
    )
    mocker.patch('app.models.contact_list.s3download',
                 return_value='\n'.join(['email address'] +
                                        ['*****@*****.**'] * 51))
    page = client_request.get(
        'main.contact_list',
        service_id=SERVICE_ONE_ID,
        contact_list_id=fake_uuid,
    )
    assert normalize_spaces(
        page.select_one('h1').text) == ('EmergencyContactList.xls')
    assert normalize_spaces(page.select('main p')[0].text) == (
        'Uploaded by Test User today at 12:12pm.')
    assert normalize_spaces(
        page.select('main p')[1].text) == ('Used 6 times in the last 7 days.')
    assert [
        normalize_spaces(row.text)
        for row in page.select_one('table').select('tr')
    ] == [
        'Template Status',
        ('Template Y '
         'Sending tomorrow at 11:09pm '
         '1 text message waiting to send'),
        ('Template Z '
         'Sending tomorrow at 11:09am '
         '1 text message waiting to send'),
        ('Template A '
         'Sent today at 4:51pm '
         '1 sending 0 delivered 0 failed'),
        ('Template B '
         'Sent today at 4:51pm '
         '1 sending 0 delivered 0 failed'),
        ('Template C '
         'Sent today at 4:51pm '
         '1 sending 0 delivered 0 failed'),
        ('Template D '
         'Sent today at 4:51pm '
         '1 sending 0 delivered 0 failed'),
    ]
    assert page.select_one('table a')['href'] == url_for(
        'main.view_job',
        service_id=SERVICE_ONE_ID,
        job_id=fake_uuid,
    )