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
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)
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)
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
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
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
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
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)
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
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
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
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
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)
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)
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
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
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
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
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
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'])
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"
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'
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
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)
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()