def test_non_critical_component_should_ignore_if_client_not_connected(
        requests_mock, client):
    config = Config('arch.test', 'a_cluster')
    requests_mock.wait_time = 10
    client.run()

    assert config.get("test") is None
def test_should_get_new_value_if_cluster_config_is_added(
        requests_mock, no_cache_client, wait_huskar_api_ioloop_connected):
    config = Config('arch.test', 'some-cluster-not-exists')
    wait_huskar_api_ioloop_connected(3.0)
    requests_mock.add_response(
        '{"body": {"config": {"arch.test": {"some-cluster-not-exists": '
        '{"test_config": {"value": "new_value"}}}}}, "message": "update"}')
    assert requests_mock.wait_processed()
    assert config.get('test_config') == 'new_value'
    assert config.get('test_config', _force_overall=True) == 'test_value'
def test_listener_called_with_config_in_overall_cluster_if_not_exists(
        requests_mock, no_cache_client, wait_huskar_api_ioloop_connected):
    config = Config('arch.test', 'some-cluster-not-exists')
    wait_huskar_api_ioloop_connected(3.0)
    handler = Mock()
    config.watch("test_config", handler)

    requests_mock.set_result_file('test_data_changed.txt')
    assert requests_mock.wait_processed()
    assert config.get('test_config') == 'new_value'
    assert config.exists('test_config')
    handler.assert_called_once_with(u'new_value')
    assert handler.call_count == 1

    requests_mock.add_response(
        '{"body": {"config": {"arch.test": {"some-cluster-not-exists": '
        '{"test_config": {"value": "new_value_2"}}}}}, "message": "update"}')
    assert requests_mock.wait_processed()
    assert config.get('test_config') == 'new_value_2'
    assert config.exists('test_config')
    handler.assert_any_call(u'new_value_2')
    assert handler.call_count == 2

    requests_mock.add_response(
        '{"body": {"config": {"arch.test": {"overall": {"test_config": '
        '{"value": "new_value_2"}}}}}, "message": "update"}')
    assert handler.call_count == 2
def test_iteritems_in_config(requests_mock, started_client):
    config = Config('arch.test', 'a_cluster')
    assert started_client.connected.wait(1)
    requests_mock.add_response(
        r'{"body": {"config": {"arch.test": {"a_cluster": {"test_json":'
        r' {"value": "\"abcdefg\""}}}}}, "message": "update"}')
    requests_mock.add_response(
        r'{"body": {"config": {"arch.test": {"a_cluster": {"test_config":'
        r' {"value": "\"12345\""}}}}}, "message": "update"}')
    assert requests_mock.wait_processed()

    items = list(config.iteritems())
    assert sorted(items) == sorted(
        list({
            'test_json': "abcdefg",
            'test_config': "12345",
        }.items()))
def test_critical_component_should_recover_if_connection_reestablished(
        requests_mock, client, sleep_ops):
    config = Config('arch.test', 'a_cluster')
    config.set_critical()
    client.run()
    config_component = config.client
    config.get("test")
    assert not config_component.fail_mode

    sleep_ops.set_constant_sleep_time(0.1)
    requests_mock.stop_exception = socket.timeout
    assert client.is_disconnected.wait(3)
    assert not client.is_connected()

    config.get("test")
    assert not config_component.fail_mode

    requests_mock.stop_exception = None
    assert client.connected.wait(3)

    config.get("test")
    assert not config_component.fail_mode
def test_critical_component_should_raise_if_client_not_connected(
        requests_mock, client):
    config = Config('arch.test', 'a_cluster')
    config.set_critical()
    requests_mock.wait_time = 11
    client.run()

    with pytest.raises(RuntimeError):
        config.get("test")
def test_should_get_overall_value_if_cluster_config_is_deleted(
        requests_mock, no_cache_client, wait_huskar_api_ioloop_connected):
    config = Config('arch.test', 'some-cluster-not-exists')
    wait_huskar_api_ioloop_connected(3.0)
    requests_mock.add_response(
        '{"body": {"config": {"arch.test": {"some-cluster-not-exists":'
        ' {"test_config": {"value": "new_value"}}}}}, "message": "update"}')
    assert requests_mock.wait_processed()
    assert config.get('test_config') == 'new_value'

    mock_handler = Mock()
    config.on_change("test_config")(mock_handler)

    requests_mock.add_response(
        '{"body": {"config": {"arch.test": {"some-cluster-not-exists": '
        '{"test_config": {"value": null}}}}}, "message": "delete"}')
    assert requests_mock.wait_processed()
    assert config.get('test_config') == 'test_value'
    mock_handler.assert_called_once_with(u'test_value')
def test_should_get_global_config_if_local_not_exists(
        requests_mock, no_cache_client, wait_huskar_api_ioloop_connected):
    config = Config('arch.test', 'some-cluster-not-exists')
    wait_huskar_api_ioloop_connected(3.0)
    assert config.get('test_config') == 'test_value'
def config_component(requests_mock, no_cache_client):
    return Config('arch.test', 'overall')