Exemple #1
0
def test_dao_get_letter_contacts_by_service_id(notify_db_session):
    service = create_service()
    default_letter_contact = create_letter_contact(
        service=service, contact_block='Edinburgh, ED1 1AA')
    second_letter_contact = create_letter_contact(
        service=service, contact_block='Cardiff, CA1 2DB', is_default=False)
    third_letter_contact = create_letter_contact(
        service=service, contact_block='London, E1 8QS', is_default=False)

    results = dao_get_letter_contacts_by_service_id(service_id=service.id)

    assert len(results) == 3
    assert default_letter_contact == results[0]
    assert third_letter_contact == results[1]
    assert second_letter_contact == results[2]
Exemple #2
0
def test_fetch_billing_data_for_today_includes_data_with_the_right_status(
        notify_db_session):
    service = create_service()
    template = create_template(service=service, template_type="email")
    for status in ['created', 'technical-failure']:
        create_notification(template=template, status=status)

    today = convert_utc_to_local_timezone(datetime.utcnow())
    results = fetch_billing_data_for_day(today)
    assert results == []
    for status in ['delivered', 'sending', 'temporary-failure']:
        create_notification(template=template, status=status)
    results = fetch_billing_data_for_day(today)
    assert len(results) == 1
    assert results[0].notifications_sent == 3
Exemple #3
0
def test_add_letter_contact_does_not_override_default(notify_db_session):
    service = create_service()

    add_letter_contact_for_service(service_id=service.id, contact_block='Edinburgh, ED1 1AA', is_default=True)
    add_letter_contact_for_service(service_id=service.id, contact_block='Swansea, SN1 3CC', is_default=False)

    results = dao_get_letter_contacts_by_service_id(service_id=service.id)

    assert len(results) == 2

    assert results[0].contact_block == 'Edinburgh, ED1 1AA'
    assert results[0].is_default

    assert results[1].contact_block == 'Swansea, SN1 3CC'
    assert not results[1].is_default
Exemple #4
0
def sample_inbound_numbers(notify_db, notify_db_session, sample_service):
    service = create_service(service_name='sample service 2',
                             check_if_service_exists=True)
    inbound_numbers = list()
    inbound_numbers.append(create_inbound_number(number='1', provider='mmg'))
    inbound_numbers.append(
        create_inbound_number(number='2',
                              provider='mmg',
                              active=False,
                              service_id=service.id))
    inbound_numbers.append(
        create_inbound_number(number='3',
                              provider='firetext',
                              service_id=sample_service.id))
    return inbound_numbers
Exemple #5
0
def test_fetch_monthly_billing_for_year_adds_data_for_today(notify_db_session):
    service = create_service()
    template = create_template(service=service, template_type="email")
    for i in range(1, 32):
        create_ft_billing(utc_date='2018-07-{}'.format(i),
                          service=service,
                          template=template,
                          notification_type='email',
                          rate=0.162)
    create_notification(template=template, status='delivered')

    assert db.session.query(FactBilling.bst_date).count() == 31
    results = fetch_monthly_billing_for_year(service_id=service.id, year=2018)
    assert db.session.query(FactBilling.bst_date).count() == 32
    assert len(results) == 2
Exemple #6
0
def test_dao_get_reply_to_by_service_id_does_not_return_archived_reply_tos(notify_db_session):
    service = create_service()
    create_reply_to_email(service=service, email_address='*****@*****.**')
    create_reply_to_email(service=service, email_address='*****@*****.**', is_default=False)
    archived_reply_to = create_reply_to_email(
        service=service,
        email_address='*****@*****.**',
        is_default=False,
        archived=True
    )

    results = dao_get_reply_to_by_service_id(service_id=service.id)

    assert len(results) == 2
    assert archived_reply_to not in results
def test_check_service_message_limit_in_cache_over_message_limit_fails(
        notify_db_session, key_type, mocker):
    with freeze_time("2016-01-01 12:00:00.000000"):
        mocker.patch('app.redis_store.get', return_value=5)
        mocker.patch('app.notifications.validators.redis_store.set')
        mocker.patch('app.notifications.validators.services_dao')

        service = create_service(restricted=True, message_limit=4)
        with pytest.raises(TooManyRequestsError) as e:
            check_service_over_daily_message_limit(key_type, service)
        assert e.value.status_code == 429
        assert e.value.message == 'Exceeded send limits (4) for today'
        assert e.value.fields == []
        app.notifications.validators.redis_store.set.assert_not_called()
        assert not app.notifications.validators.services_dao.mock_calls
Exemple #8
0
def test_send_pdf_letter_notification_raises_error_if_service_does_not_have_permission(
    notify_db_session,
    fake_uuid,
    permissions,
):
    service = create_service(service_permissions=permissions)
    post_data = {
        'filename': 'valid.pdf',
        'created_by': fake_uuid,
        'file_id': fake_uuid,
        'postage': 'first'
    }

    with pytest.raises(BadRequestError):
        send_pdf_letter_notification(service.id, post_data)
def test_send_one_off_notification_honors_priority(notify_db_session,
                                                   persist_mock, celery_mock):
    service = create_service()
    template = create_template(service=service)
    template.process_type = PRIORITY

    post_data = {
        'template_id': str(template.id),
        'to': '07700 900 001',
        'created_by': str(service.created_by_id)
    }

    send_one_off_notification(service.id, post_data)

    assert celery_mock.call_args[1]['queue'] == QueueNames.PRIORITY
Exemple #10
0
def test_dao_get_sms_senders_by_service_id(notify_db_session):
    service = create_service()
    second_sender = dao_add_sms_sender_for_service(
        service_id=service.id,
        sms_sender="second",
        is_default=False,
        inbound_number_id=None,
    )
    results = dao_get_sms_senders_by_service_id(service_id=service.id)
    assert len(results) == 2
    for x in results:
        if x.is_default:
            assert x.sms_sender == "testing"
        else:
            assert x == second_sender
Exemple #11
0
def test_get_api_key_stats_no_sends(admin_request, notify_db, notify_db_session):

    service = create_service(service_name='Service 2')
    api_key = create_api_key(service)

    api_key_stats = admin_request.get(
        'api_key.get_api_key_stats',
        api_key_id=api_key.id
    )['data']

    assert api_key_stats["api_key_id"] == str(api_key.id)
    assert api_key_stats["email_sends"] == 0
    assert api_key_stats["sms_sends"] == 0
    assert api_key_stats["total_sends"] == 0
    assert api_key_stats["last_send"] is None
Exemple #12
0
def test_dao_add_sms_sender_for_service_switches_default(notify_db_session):
    service = create_service()
    new_sms_sender = dao_add_sms_sender_for_service(
        service_id=service.id,
        sms_sender="new_sms",
        is_default=True,
        inbound_number_id=None,
    )

    service_sms_senders = ServiceSmsSender.query.order_by(
        ServiceSmsSender.created_at).all()
    assert len(service_sms_senders) == 2
    assert service_sms_senders[0].sms_sender == "testing"
    assert not service_sms_senders[0].is_default
    assert service_sms_senders[1] == new_sms_sender
Exemple #13
0
def test_fetch_monthly_notification_statuses_per_service(notify_db_session):
    service_one = create_service(service_name='service one', service_id=UUID('e4e34c4e-73c1-4802-811c-3dd273f21da4'))
    service_two = create_service(service_name='service two', service_id=UUID('b19d7aad-6f09-4198-8b62-f6cf126b87e5'))

    create_ft_notification_status(date(2019, 4, 30), notification_type='letter', service=service_one,
                                  notification_status=NOTIFICATION_DELIVERED)
    create_ft_notification_status(date(2019, 3, 1), notification_type='email', service=service_one,
                                  notification_status=NOTIFICATION_SENDING, count=4)
    create_ft_notification_status(date(2019, 3, 1), notification_type='email', service=service_one,
                                  notification_status=NOTIFICATION_PENDING, count=1)
    create_ft_notification_status(date(2019, 3, 2), notification_type='email', service=service_one,
                                  notification_status=NOTIFICATION_TECHNICAL_FAILURE, count=2)
    create_ft_notification_status(date(2019, 3, 7), notification_type='email', service=service_one,
                                  notification_status=NOTIFICATION_FAILED, count=1)
    create_ft_notification_status(date(2019, 3, 10), notification_type='letter', service=service_two,
                                  notification_status=NOTIFICATION_PERMANENT_FAILURE, count=1)
    create_ft_notification_status(date(2019, 3, 10), notification_type='letter', service=service_two,
                                  notification_status=NOTIFICATION_PERMANENT_FAILURE, count=1)
    create_ft_notification_status(date(2019, 3, 13), notification_type='sms', service=service_one,
                                  notification_status=NOTIFICATION_SENT, count=1)
    create_ft_notification_status(date(2019, 4, 1), notification_type='letter', service=service_two,
                                  notification_status=NOTIFICATION_TEMPORARY_FAILURE, count=10)
    create_ft_notification_status(date(2019, 3, 31), notification_type='letter', service=service_one,
                                  notification_status=NOTIFICATION_DELIVERED)

    results = fetch_monthly_notification_statuses_per_service(date(2019, 3, 1), date(2019, 4, 30))

    assert len(results) == 6
    # column order: date, service_id, service_name, notifaction_type, count_sending, count_delivered,
    # count_technical_failure, count_temporary_failure, count_permanent_failure, count_sent
    assert [x for x in results[0]] == [date(2019, 3, 1), service_two.id, 'service two', 'letter', 0, 0, 0, 0, 2, 0]
    assert [x for x in results[1]] == [date(2019, 3, 1), service_one.id, 'service one', 'email', 5, 0, 3, 0, 0, 0]
    assert [x for x in results[2]] == [date(2019, 3, 1), service_one.id, 'service one', 'letter', 0, 1, 0, 0, 0, 0]
    assert [x for x in results[3]] == [date(2019, 3, 1), service_one.id, 'service one', 'sms', 0, 0, 0, 0, 0, 1]
    assert [x for x in results[4]] == [date(2019, 4, 1), service_two.id, 'service two', 'letter', 0, 0, 0, 10, 0, 0]
    assert [x for x in results[5]] == [date(2019, 4, 1), service_one.id, 'service one', 'letter', 0, 1, 0, 0, 0, 0]
Exemple #14
0
def test_archive_letter_contact_does_not_archive_a_template_default_letter_contact(
        notify_db_session):
    service = create_service()
    create_letter_contact(service=service, contact_block='Edinburgh, ED1 1AA')
    template_default = create_letter_contact(
        service=service, contact_block='Aberdeen, AB12 23X', is_default=False)
    create_template(service=service,
                    template_type='letter',
                    reply_to=template_default.id)

    with pytest.raises(ArchiveValidationError) as e:
        archive_letter_contact(service.id, template_default.id)

    assert 'You cannot delete the default letter contact block for a template' in str(
        e.value)
def test_update_existing_sms_sender_with_inbound_number(notify_db_session):
    service = create_service()
    inbound_number = create_inbound_number(number='12345',
                                           service_id=service.id)

    existing_sms_sender = ServiceSmsSender.query.filter_by(
        service_id=service.id).one()
    sms_sender = update_existing_sms_sender_with_inbound_number(
        service_sms_sender=existing_sms_sender,
        sms_sender=inbound_number.number,
        inbound_number_id=inbound_number.id)

    assert sms_sender.inbound_number_id == inbound_number.id
    assert sms_sender.sms_sender == inbound_number.number
    assert sms_sender.is_default
Exemple #16
0
def test_create_template_folder_fails_if_parent_id_from_different_service(
        admin_request, sample_service):
    s1 = create_service(service_name='a')
    parent_folder_id = create_template_folder(s1).id

    resp = admin_request.post('template_folder.create_template_folder',
                              service_id=sample_service.id,
                              _data={
                                  'name': 'bar',
                                  'parent_id': str(parent_folder_id)
                              },
                              _expected_status=400)

    assert resp['result'] == 'error'
    assert resp['message'] == 'parent_id not found'
Exemple #17
0
    def test_raises_exception_if_update_would_result_in_no_default_sms_sender(
            self, notify_db_session):
        service = create_service()
        existing_sms_sender = ServiceSmsSender.query.filter_by(
            service_id=service.id).one()

        with pytest.raises(SmsSenderDefaultValidationException) as e:
            dao_update_service_sms_sender(
                service_id=service.id,
                service_sms_sender_id=existing_sms_sender.id,
                is_default=False,
                sms_sender="updated")

        assert 'You must have at least one SMS sender as the default' in str(
            e.value)
Exemple #18
0
def test_delete_notifications_returns_sum_correctly(sample_template):
    create_notification(template=sample_template,
                        created_at=datetime.now() - timedelta(days=8))
    create_notification(template=sample_template,
                        created_at=datetime.now() - timedelta(days=8))

    s2 = create_service(service_name='s2')
    t2 = create_template(s2, template_type='sms')
    create_notification(template=t2,
                        created_at=datetime.now() - timedelta(days=8))
    create_notification(template=t2,
                        created_at=datetime.now() - timedelta(days=8))

    ret = delete_notifications_older_than_retention_by_type('sms', qry_limit=1)
    assert ret == 4
Exemple #19
0
def test_add_reply_to_email_address_for_service_creates_another_email_for_service(notify_db_session):
    service = create_service()
    create_reply_to_email(service=service, email_address="*****@*****.**")

    add_reply_to_email_address_for_service(service_id=service.id, email_address='*****@*****.**', is_default=False)

    results = dao_get_reply_to_by_service_id(service_id=service.id)
    assert len(results) == 2
    for x in results:
        if x.email_address == '*****@*****.**':
            assert x.is_default
        elif x.email_address == '*****@*****.**':
            assert not x.is_default
        else:
            raise AssertionError()
Exemple #20
0
def test_get_service_sms_senders_for_service(admin_request, notify_db_session):
    service_sms_sender = create_service_sms_sender(service=create_service(),
                                                   sms_sender='second',
                                                   is_default=False)

    response_json = admin_request.get(
        'service_sms_sender.get_service_sms_senders_for_service',
        service_id=service_sms_sender.service_id,
        _expected_status=200)

    assert len(response_json) == 2
    assert response_json[0]['is_default']
    assert response_json[0]['sms_sender'] == current_app.config['FROM_NUMBER']
    assert not response_json[1]['is_default']
    assert response_json[1]['sms_sender'] == 'second'
Exemple #21
0
def test_can_update_letter_contact(notify_db_session):
    service = create_service()
    letter_contact = create_letter_contact(service=service,
                                           contact_block='Aberdeen, AB12 23X')

    update_letter_contact(service_id=service.id,
                          letter_contact_id=letter_contact.id,
                          contact_block='Warwick, W14 TSR',
                          is_default=True)

    updated_letter_contact = ServiceLetterContact.query.get(letter_contact.id)

    assert updated_letter_contact.contact_block == 'Warwick, W14 TSR'
    assert updated_letter_contact.updated_at
    assert updated_letter_contact.is_default
Exemple #22
0
def test_get_services_by_partial_name(notify_db_session):
    create_service(service_name="Tadfield Police")
    create_service(service_name="Tadfield Air Base")
    create_service(service_name="London M25 Management Body")
    services_from_db = get_services_by_partial_name("Tadfield")
    assert len(services_from_db) == 2
    assert sorted([service.name for service in services_from_db]) == [
        "Tadfield Air Base",
        "Tadfield Police",
    ]
Exemple #23
0
def sample_invited_user(notify_db_session):
    service = create_service(check_if_service_exists=True)
    to_email_address = '*****@*****.**'

    from_user = service.users[0]

    data = {
        'service': service,
        'email_address': to_email_address,
        'from_user': from_user,
        'permissions': 'send_messages,manage_service,manage_api_keys',
        'folder_permissions': ['folder_1_id', 'folder_2_id'],
    }
    invited_user = InvitedUser(**data)
    save_invited_user(invited_user)
    return invited_user
Exemple #24
0
def sample_notification_with_job(notify_db_session):
    service = create_service(check_if_service_exists=True)
    template = create_template(service=service)
    job = create_job(template=template)
    return create_notification(template=template,
                               job=job,
                               job_row_number=None,
                               to_field=None,
                               status='created',
                               reference=None,
                               created_at=None,
                               sent_at=None,
                               billable_units=1,
                               personalisation=None,
                               api_key=None,
                               key_type=KEY_TYPE_NORMAL)
Exemple #25
0
def sample_email_template(notify_db_session):
    user = create_user()
    service = create_service(user=user,
                             service_permissions=[EMAIL_TYPE, SMS_TYPE],
                             check_if_service_exists=True)
    data = {
        'name': 'Email Template Name',
        'template_type': EMAIL_TYPE,
        'content': 'This is a template',
        'service': service,
        'created_by': user,
        'subject': 'Email Subject'
    }
    template = Template(**data)
    dao_create_template(template)
    return template
Exemple #26
0
def test_dao_fetch_todays_stats_for_all_services_only_includes_today(notify_db_session):
    template = create_template(service=create_service())
    with freeze_time('2001-01-01T23:59:00'):
        # just_before_midnight_yesterday
        create_notification(template=template, to_field='1', status='delivered')

    with freeze_time('2001-01-02T00:01:00'):
        # just_after_midnight_today
        create_notification(template=template, to_field='2', status='failed')

    with freeze_time('2001-01-02T12:00:00'):
        stats = dao_fetch_todays_stats_for_all_services()

    stats = {row.status: row.count for row in stats}
    assert 'delivered' not in stats
    assert stats['failed'] == 1
Exemple #27
0
def test_dao_add_user_to_service_raises_error_if_adding_folder_permissions_for_a_different_service(
    sample_service,
):
    user = create_user()
    other_service = create_service(service_name='other service')
    other_service_folder = create_template_folder(other_service)
    folder_permissions = [str(other_service_folder.id)]

    assert ServiceUser.query.count() == 2

    with pytest.raises(IntegrityError) as e:
        dao_add_user_to_service(sample_service, user, folder_permissions=folder_permissions)

    db.session.rollback()
    assert 'insert or update on table "user_folder_permissions" violates foreign key constraint' in str(e.value)
    assert ServiceUser.query.count() == 2
Exemple #28
0
def sample_api_key(notify_db,
                   notify_db_session,
                   service=None,
                   key_type=KEY_TYPE_NORMAL,
                   name=None):
    if service is None:
        service = create_service(check_if_service_exists=True)
    data = {
        'service': service,
        'name': name or uuid.uuid4(),
        'created_by': service.created_by,
        'key_type': key_type
    }
    api_key = ApiKey(**data)
    save_model_api_key(api_key)
    return api_key
def test_fetch_billing_data_for_day_is_grouped_by_international(
        notify_db_session):
    service = create_service()
    template = create_template(service=service)
    create_notification(template=template,
                        status='delivered',
                        international=True)
    create_notification(template=template,
                        status='delivered',
                        international=False)

    today = convert_utc_to_local_timezone(datetime.utcnow())
    results = fetch_billing_data_for_day(today)
    assert len(results) == 2
    assert results[0].notifications_sent == 1
    assert results[1].notifications_sent == 1
def test_fetch_billing_data_for_day_is_grouped_by_rate_mulitplier(
        notify_db_session):
    service = create_service()
    template = create_template(service=service)
    create_notification(template=template,
                        status='delivered',
                        rate_multiplier=1)
    create_notification(template=template,
                        status='delivered',
                        rate_multiplier=2)

    today = convert_utc_to_bst(datetime.utcnow())
    results = fetch_billing_data_for_day(today.date())
    assert len(results) == 2
    assert results[0].notifications_sent == 1
    assert results[1].notifications_sent == 1