コード例 #1
0
def test_dao_get_provider_stats(notify_db_session):
    service_1 = create_service(service_name="1")
    service_2 = create_service(service_name="2")
    sms_template_1 = create_template(service_1, "sms")
    sms_template_2 = create_template(service_2, "sms")

    create_ft_billing("2017-06-05", "sms", sms_template_2, service_1, provider="mmg", billable_unit=4)
    create_ft_billing("2018-05-31", "sms", sms_template_1, service_1, provider="sns", billable_unit=1)
    create_ft_billing(
        "2018-06-01",
        "sms",
        sms_template_1,
        service_1,
        provider="sns",
        rate_multiplier=2,
        billable_unit=1,
    )
    create_ft_billing("2018-06-03", "sms", sms_template_2, service_1, provider="mmg", billable_unit=4)
    create_ft_billing("2018-06-15", "sms", sms_template_1, service_2, provider="mmg", billable_unit=1)
    create_ft_billing("2018-06-28", "sms", sms_template_2, service_2, provider="sns", billable_unit=2)

    provider = get_provider_details_by_identifier("pinpoint")
    provider.priority = 50
    dao_update_provider_details(provider)

    result = dao_get_provider_stats()

    assert len(result) == 7

    assert result[0].identifier == "ses"
    assert result[0].display_name == "AWS SES"
    assert result[0].created_by_name is None
    assert result[0].current_month_billable_sms == 0

    assert result[1].identifier == "sns"
    assert result[1].display_name == "AWS SNS"
    assert result[1].supports_international is False
    assert result[1].active is True
    assert result[1].current_month_billable_sms == 4

    assert result[2].identifier == "mmg"
    assert result[2].notification_type == "sms"
    assert result[2].supports_international is True
    assert result[2].active is False
    assert result[2].current_month_billable_sms == 5

    assert result[3].identifier == "firetext"
    assert result[3].active is False
    assert result[3].current_month_billable_sms == 0

    assert result[4].identifier == "loadtesting"
    assert result[4].active is False
    assert result[4].current_month_billable_sms == 0
    assert result[4].supports_international is False

    assert result[5].identifier == "pinpoint"
    assert result[5].notification_type == "sms"
    assert result[5].supports_international is False
    assert result[5].active is False
    assert result[5].current_month_billable_sms == 0
コード例 #2
0
def test_update_adds_history(restore_provider_details):
    ses = ProviderDetails.query.filter(ProviderDetails.identifier == "ses").one()
    ses_history = ProviderDetailsHistory.query.filter(ProviderDetailsHistory.id == ses.id).one()

    assert ses.version == 1
    assert ses_history.version == 1
    assert ses.updated_at is None

    ses.active = False

    dao_update_provider_details(ses)

    assert not ses.active
    assert ses.updated_at == datetime(2000, 1, 1, 0, 0, 0)

    ses_history = (
        ProviderDetailsHistory.query.filter(ProviderDetailsHistory.id == ses.id).order_by(ProviderDetailsHistory.version).all()
    )

    assert ses_history[0].active
    assert ses_history[0].version == 1
    assert ses_history[0].updated_at is None

    assert not ses_history[1].active
    assert ses_history[1].version == 2
    assert ses_history[1].updated_at == datetime(2000, 1, 1, 0, 0, 0)
コード例 #3
0
def test_update_adds_history(restore_provider_details):
    ses = ProviderDetails.query.filter(ProviderDetails.identifier == 'ses').one()
    ses_history = ProviderDetailsHistory.query.filter(ProviderDetailsHistory.id == ses.id).one()

    assert ses.version == 1
    assert ses_history.version == 1
    assert ses.updated_at is None

    ses.active = False

    dao_update_provider_details(ses)

    assert not ses.active
    assert ses.updated_at == datetime(2000, 1, 1, 0, 0, 0)

    ses_history = ProviderDetailsHistory.query.filter(
        ProviderDetailsHistory.id == ses.id
    ).order_by(
        ProviderDetailsHistory.version
    ).all()

    assert ses_history[0].active
    assert ses_history[0].version == 1
    assert ses_history[0].updated_at is None

    assert not ses_history[1].active
    assert ses_history[1].version == 2
    assert ses_history[1].updated_at == datetime(2000, 1, 1, 0, 0, 0)
コード例 #4
0
def test_should_return_highest_priority_active_provider(restore_provider_details):
    providers = provider_details_dao.get_provider_details_by_notification_type('sms')

    first = providers[0]
    second = providers[1]

    assert send_to_providers.provider_to_use('sms', '1234').name == first.identifier

    first.priority, second.priority = second.priority, first.priority

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use('sms', '1234').name == second.identifier

    first.priority, second.priority = second.priority, first.priority
    first.active = False

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use('sms', '1234').name == second.identifier

    first.active = True
    provider_details_dao.dao_update_provider_details(first)

    assert send_to_providers.provider_to_use('sms', '1234').name == first.identifier
コード例 #5
0
def test_get_current_sms_provider_returns_active_only(restore_provider_details):
    current_provider = get_current_provider('sms')
    current_provider.active = False
    dao_update_provider_details(current_provider)
    new_current_provider = get_current_provider('sms')

    assert current_provider.identifier != new_current_provider.identifier
コード例 #6
0
def test_can_get_all_provider_history_with_newest_first(setup_sms_providers_with_history):
    [inactive_provider, current_provider, alternative_provider] = setup_sms_providers_with_history
    current_provider.priority += 1
    dao_update_provider_details(current_provider)
    versions = dao_get_provider_versions(current_provider.id)
    assert len(versions) == 2
    assert versions[0].version == 2
コード例 #7
0
def test_update_sms_provider_to_inactive_sets_inactive(restore_provider_details):
    primary_provider = get_current_provider("sms")
    primary_provider.active = False

    dao_update_provider_details(primary_provider)

    assert not primary_provider.active
コード例 #8
0
def test_update_adds_history(restore_provider_details):
    provider = ProviderDetails.query.filter(
        ProviderDetails.identifier == 'ses').one()

    provider_history = ProviderDetailsHistory.query.filter(
        ProviderDetailsHistory.id == provider.id).one()

    assert provider.version == 1
    assert provider_history.version == 1
    assert provider.updated_at is None

    provider.active = False

    dao_update_provider_details(provider)

    assert not provider.active
    assert provider.updated_at == datetime(2000, 1, 1, 0, 0, 0)

    provider_history = ProviderDetailsHistory.query.filter(
        ProviderDetailsHistory.id == provider.id).order_by(
            ProviderDetailsHistory.version).all()

    assert provider_history[0].active
    assert provider_history[0].version == 1
    assert provider_history[0].updated_at is None

    assert not provider_history[1].active
    assert provider_history[1].version == 2
    assert provider_history[1].updated_at == datetime(2000, 1, 1, 0, 0, 0)
コード例 #9
0
def test_update_sms_provider_to_inactive_sets_inactive(restore_provider_details):
    mmg = get_provider_details_by_identifier('mmg')

    mmg.active = False
    dao_update_provider_details(mmg)

    assert not mmg.active
コード例 #10
0
def test_should_return_highest_priority_active_provider(restore_provider_details):
    providers = provider_details_dao.get_provider_details_by_notification_type("sms")
    providers = [provider for provider in providers if provider.active]

    first = providers[0]
    second = providers[1]

    assert send_to_providers.provider_to_use("sms", "1234").name == first.identifier

    first.priority = 12
    second.priority = 10

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use("sms", "1234").name == second.identifier

    first.priority = 10
    first.active = False
    second.priority = 12

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use("sms", "1234").name == second.identifier

    first.active = True
    provider_details_dao.dao_update_provider_details(first)

    assert send_to_providers.provider_to_use("sms", "1234").name == first.identifier
コード例 #11
0
def test_get_current_sms_provider_returns_active_only(restore_provider_details):
    current_provider = get_current_provider("sms")
    current_provider.active = False
    dao_update_provider_details(current_provider)
    new_current_provider = get_current_provider("sms")

    assert new_current_provider is None
コード例 #12
0
def test_should_return_highest_priority_active_provider(notify_db, notify_db_session):
    providers = provider_details_dao.get_provider_details_by_notification_type('sms')

    first = providers[0]
    second = providers[1]

    assert send_to_providers.provider_to_use('sms', '1234').name == first.identifier

    first.priority = 20
    second.priority = 10

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use('sms', '1234').name == second.identifier

    first.priority = 10
    first.active = False
    second.priority = 20

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use('sms', '1234').name == second.identifier

    first.active = True
    provider_details_dao.dao_update_provider_details(first)

    assert send_to_providers.provider_to_use('sms', '1234').name == first.identifier
コード例 #13
0
ファイル: conftest.py プロジェクト: trodjr/notify
def with_active_telstra_provider():
    # Simulate the Telstra provider actually being active.
    # This is required because at the time of writing Telstra is not currently
    # active in the DB but we have some behaviour that we want to test that
    # relies on being able to switch providers to another active provider.
    telstra = get_provider_details_by_identifier('telstra')
    telstra.active = True
    dao_update_provider_details(telstra)
コード例 #14
0
def set_primary_sms_provider(identifier):
    primary_provider = get_provider_details_by_identifier(identifier)
    secondary_provider = get_alternative_sms_provider(identifier)

    primary_provider.priority = 10
    secondary_provider.priority = 20

    dao_update_provider_details(primary_provider)
    dao_update_provider_details(secondary_provider)
コード例 #15
0
def test_switch_sms_provider_to_inactive_provider_does_not_switch(restore_provider_details, current_sms_provider):
    alternative_sms_provider = get_alternative_sms_provider(current_sms_provider.identifier)
    alternative_sms_provider.active = False
    dao_update_provider_details(alternative_sms_provider)

    dao_switch_sms_provider_to_provider_with_identifier(alternative_sms_provider.identifier)
    new_provider = get_current_provider("sms")

    assert new_provider.id == current_sms_provider.id
    assert new_provider.identifier == current_sms_provider.identifier
コード例 #16
0
def test_get_sms_provider_with_equal_priority_returns_provider(
        restore_provider_details, with_active_telstra_provider):
    current_provider = get_current_provider('sms')
    new_provider = get_alternative_sms_provider(current_provider.identifier)

    current_provider.priority = new_provider.priority
    dao_update_provider_details(current_provider)

    conflicting_provider = \
        dao_get_sms_provider_with_equal_priority(current_provider.identifier, current_provider.priority)

    assert conflicting_provider
コード例 #17
0
def test_dao_get_provider_stats(notify_db_session):
    service_1 = create_service(service_name='1')
    service_2 = create_service(service_name='2')
    sms_template_1 = create_template(service_1, 'sms')
    sms_template_2 = create_template(service_2, 'sms')

    create_ft_billing('2017-06-05', 'sms', sms_template_2, service_1, provider='mmg', billable_unit=4)
    create_ft_billing('2018-05-31', 'sms', sms_template_1, service_1, provider='sns', billable_unit=1)
    create_ft_billing('2018-06-01', 'sms', sms_template_1, service_1, provider='sns',
                      rate_multiplier=2, billable_unit=1)
    create_ft_billing('2018-06-03', 'sms', sms_template_2, service_1, provider='mmg', billable_unit=4)
    create_ft_billing('2018-06-15', 'sms', sms_template_1, service_2, provider='mmg', billable_unit=1)
    create_ft_billing('2018-06-28', 'sms', sms_template_2, service_2, provider='sns', billable_unit=2)

    provider = get_provider_details_by_identifier('pinpoint')
    provider.priority = 50
    dao_update_provider_details(provider)

    result = dao_get_provider_stats()

    assert len(result) == 7

    assert result[0].identifier == 'ses'
    assert result[0].display_name == 'AWS SES'
    assert result[0].created_by_name is None
    assert result[0].current_month_billable_sms == 0

    assert result[1].identifier == 'sns'
    assert result[1].display_name == 'AWS SNS'
    assert result[1].supports_international is False
    assert result[1].active is True
    assert result[1].current_month_billable_sms == 4

    assert result[2].identifier == 'mmg'
    assert result[2].notification_type == 'sms'
    assert result[2].supports_international is True
    assert result[2].active is True
    assert result[2].current_month_billable_sms == 5

    assert result[3].identifier == 'firetext'
    assert result[3].current_month_billable_sms == 0

    assert result[4].identifier == 'loadtesting'
    assert result[4].current_month_billable_sms == 0
    assert result[4].supports_international is False

    assert result[5].identifier == 'pinpoint'
    assert result[5].notification_type == 'sms'
    assert result[5].supports_international is False
    assert result[5].active is True
    assert result[5].current_month_billable_sms == 0
コード例 #18
0
def test_toggle_sms_provider_switches_when_provider_priorities_are_equal(mocker, restore_provider_details, sample_user):
    mocker.patch("app.provider_details.switch_providers.get_user_by_id", return_value=sample_user)
    current_provider = get_current_provider("sms")
    new_provider = get_alternative_sms_provider(current_provider.identifier)

    current_provider.priority = new_provider.priority
    dao_update_provider_details(current_provider)

    dao_toggle_sms_provider(current_provider.identifier)

    old_starting_provider = get_provider_details_by_identifier(current_provider.identifier)

    assert new_provider.identifier != old_starting_provider.identifier
    assert new_provider.priority < old_starting_provider.priority
コード例 #19
0
ファイル: rest.py プロジェクト: alphagov/notifications-api
def update_provider_details(provider_details_id):
    fetched_provider_details = get_provider_details_by_id(provider_details_id)

    current_data = dict(provider_details_schema.dump(fetched_provider_details).data.items())
    current_data.update(request.get_json())
    update_dict = provider_details_schema.load(current_data).data

    invalid_keys = {'identifier', 'version', 'updated_at'} & set(key for key in request.get_json().keys())
    if invalid_keys:
        message = "Not permitted to be updated"
        errors = {key: [message] for key in invalid_keys}
        raise InvalidRequest(errors, status_code=400)

    dao_update_provider_details(update_dict)
    return jsonify(provider_details=provider_details_schema.dump(fetched_provider_details).data), 200
コード例 #20
0
ファイル: test_schemas.py プロジェクト: qld-gov-au/notify
def test_provider_details_history_schema_returns_user_details(
        mocker, sample_user, restore_provider_details, current_sms_provider):
    from app.schemas import provider_details_schema
    mocker.patch('app.provider_details.switch_providers.get_user_by_id',
                 return_value=sample_user)
    current_sms_provider.created_by_id = sample_user.id
    data = provider_details_schema.dump(current_sms_provider).data

    dao_update_provider_details(current_sms_provider)

    current_sms_provider_in_history = ProviderDetailsHistory.query.filter(
        ProviderDetailsHistory.id == current_sms_provider.id).order_by(
            desc(ProviderDetailsHistory.version)).first()
    data = provider_details_schema.dump(current_sms_provider_in_history).data

    assert sorted(data['created_by'].keys()) == sorted(
        ['id', 'email_address', 'name'])
コード例 #21
0
ファイル: test_rest.py プロジェクト: cds-snc/notification-api
def test_get_provider_details_in_type_and_identifier_order(client, notify_db):
    provider = get_provider_details_by_identifier("pinpoint")
    provider.priority = 50
    dao_update_provider_details(provider)

    response = client.get("/provider-details",
                          headers=[create_authorization_header()])
    assert response.status_code == 200
    json_resp = json.loads(response.get_data(as_text=True))["provider_details"]
    assert len(json_resp) == 7

    assert json_resp[0]["identifier"] == "ses"
    assert json_resp[1]["identifier"] == "sns"
    assert json_resp[2]["identifier"] == "mmg"
    assert json_resp[3]["identifier"] == "firetext"
    assert json_resp[4]["identifier"] == "loadtesting"
    assert json_resp[5]["identifier"] == "pinpoint"
    assert json_resp[6]["identifier"] == "dvla"
コード例 #22
0
def test_get_provider_details_in_type_and_identifier_order(client, notify_db):
    provider = get_provider_details_by_identifier('pinpoint')
    provider.priority = 50
    dao_update_provider_details(provider)

    response = client.get('/provider-details',
                          headers=[create_authorization_header()])
    assert response.status_code == 200
    json_resp = json.loads(response.get_data(as_text=True))['provider_details']
    assert len(json_resp) == 7

    assert json_resp[0]['identifier'] == 'ses'
    assert json_resp[1]['identifier'] == 'sns'
    assert json_resp[2]['identifier'] == 'mmg'
    assert json_resp[3]['identifier'] == 'firetext'
    assert json_resp[4]['identifier'] == 'loadtesting'
    assert json_resp[5]['identifier'] == 'pinpoint'
    assert json_resp[6]['identifier'] == 'dvla'
コード例 #23
0
ファイル: rest.py プロジェクト: cds-snc/notification-api
def update_provider_details(provider_details_id):
    valid_keys = {"priority", "created_by", "active"}
    req_json = request.get_json()

    invalid_keys = req_json.keys() - valid_keys
    if invalid_keys:
        message = "Not permitted to be updated"
        errors = {key: [message] for key in invalid_keys}
        raise InvalidRequest(errors, status_code=400)

    provider = get_provider_details_by_id(provider_details_id)

    # Handle created_by differently due to how history entry is created
    if "created_by" in req_json:
        user = get_user_by_id(req_json["created_by"])
        provider.created_by_id = user.id
        req_json.pop("created_by")

    for key in req_json:
        setattr(provider, key, req_json[key])
    dao_update_provider_details(provider)

    return jsonify(
        provider_details=provider_details_schema.dump(provider).data), 200
コード例 #24
0
def with_active_sap_provider():
    # Simulate the SAP provider actually being active.
    sap = get_provider_details_by_identifier('sap')
    sap.active = True
    dao_update_provider_details(sap)
コード例 #25
0
def prepare_current_provider(restore_provider_details):
    initial_provider = get_current_provider('sms')
    dao_update_provider_details(initial_provider)
    initial_provider.updated_at = datetime.utcnow() - timedelta(minutes=30)
    db.session.commit()