def streetnetwork_backend_manager_db_test():
    """
    Test that streetnetwork backends are created from db when conditions are met
    """
    manager = StreetNetworkBackendManager(sn_backends_getter_ok, -1)

    # 2 sn_backends defined in db are associated to the coverage
    # -> 2 sn_backends created
    manager._can_connect_to_database = MagicMock(return_value=True)
    manager._update_config("instance")

    assert not manager._streetnetwork_backends_by_instance_legacy
    assert len(manager._streetnetwork_backends) == 2
    assert 'kraken' in manager._streetnetwork_backends
    assert manager._streetnetwork_backends['kraken'].url == 'kraken.url'
    assert 'asgard' in manager._streetnetwork_backends
    assert manager._streetnetwork_backends['asgard'].url == 'asgard.url'

    manager_update = manager._last_update
    assert 'kraken' in manager._streetnetwork_backends_last_update
    kraken_update = manager._streetnetwork_backends_last_update['kraken']

    # Sn_backend already existing is updated
    manager._sn_backends_getter = sn_backends_getter_update
    manager._can_connect_to_database = MagicMock(return_value=True)
    manager._update_config("instance")
    assert manager._last_update > manager_update
    assert not manager._streetnetwork_backends_by_instance_legacy
    assert len(manager._streetnetwork_backends) == 2
    assert 'kraken' in manager._streetnetwork_backends
    assert manager._streetnetwork_backends['kraken'].url == 'kraken.url.UPDATE'
    assert 'kraken' in manager._streetnetwork_backends_last_update
    assert manager._streetnetwork_backends_last_update['kraken'] > kraken_update

    # Long update interval so sn_backend shouldn't be updated
    manager = StreetNetworkBackendManager(sn_backends_getter_ok, 600)
    manager._can_connect_to_database = MagicMock(return_value=True)
    manager._update_config("instance")
    assert not manager._streetnetwork_backends_by_instance_legacy
    assert len(manager._streetnetwork_backends) == 2
    assert 'kraken' in manager._streetnetwork_backends
    assert manager._streetnetwork_backends['kraken'].url == 'kraken.url'
    manager_update = manager._last_update

    manager.sn_backends_getter = sn_backends_getter_update
    manager._update_config("instance")
    assert manager._last_update == manager_update
    assert not manager._streetnetwork_backends_by_instance_legacy
    assert len(manager._streetnetwork_backends) == 2
    assert 'kraken' in manager._streetnetwork_backends
    assert manager._streetnetwork_backends['kraken'].url == 'kraken.url'
def get_all_street_networks_db_test():
    manager = StreetNetworkBackendManager(sn_backends_getter_ok, -1)
    instance = FakeInstance()

    manager._can_connect_to_database = MagicMock(return_value=True)
    all_sn = manager.get_all_street_networks_db(instance)
    assert len(all_sn) == 2

    # So that Asgard and kraken are always in the same order
    all_sn_sorted = sorted(all_sn, key=lambda sn: sn.url)

    assert all_sn_sorted[0].url == "asgard.url"
    assert sorted(all_sn_sorted[0].modes) == sorted(
        ["walking", "car", "car_no_park"])

    assert all_sn_sorted[1].url == "kraken.url"
    assert all_sn_sorted[1].modes == ["bss"]
def wrong_streetnetwork_backend_test():
    """
    Test that streetnetwork backends with wrong parameters aren't created
    """

    # Sn_backend has a class wrongly formatted
    manager = StreetNetworkBackendManager(sn_backends_getter_wrong_class, -1)
    manager._can_connect_to_database = MagicMock(return_value=True)
    manager._update_config("instance")
    assert not manager._streetnetwork_backends_by_instance_legacy
    assert not manager._streetnetwork_backends

    # No sn_backends available in db
    manager._sn_backends_getter = []
    manager._update_config("instance")
    assert not manager._streetnetwork_backends_by_instance_legacy
    assert not manager._streetnetwork_backends
def get_street_network_db_test():
    manager = StreetNetworkBackendManager(sn_backends_getter_ok, -1)

    manager._can_connect_to_database = MagicMock(return_value=True)
    sn = manager.get_street_network_db("instance", "kraken")
    assert sn is not None
    assert sn.timeout == 2
    assert sn.url == 'kraken.url'

    sn = manager.get_street_network_db("instance", "asgard")
    assert sn is not None
    assert sn.timeout == 2
    assert sn.url == 'asgard.url'

    with pytest.raises(TechnicalError) as excinfo:
        sn = manager.get_street_network_db("instance", "plopi")
    assert (
        str(excinfo.value.data['message']) ==
        'impossible to find a streetnetwork module for instance instance with configuration plopi'
    )
    assert 'TechnicalError' == str(excinfo.typename)