def test_optional_validation(path):
    builder = ConfigBuilder()
    builder.set_field_access_optional()
    builder.validate_field_type("cache.name", str)
    builder.validate_field_value("cache.host", "localhost")
    builder.transform_field_value("cache.host", lambda name: f"https://{name}")
    builder.parse_config(path)
def test_value_validation_error_messages(path):
    builder = ConfigBuilder()
    custom_message = "test error"
    builder.validate_field_value("server.debug_mode", lambda x:
                                 (x, custom_message))
    expected_message = f'Error validating field "server.debug_mode" with value "False": {custom_message}'
    with pytest.raises(AssertionError, match=expected_message):
        builder.parse_config(path)
def test_value_validation_builder():
    builder = ConfigBuilder()
    builder.validate_field_value("key1", lambda x: x < 4)
    builder.validate_field_value("key1.key2", lambda x: len(x) == 3)
    value_validation_dict = builder._ConfigBuilder__validation_functions
    assert value_validation_dict["key1"][0](1)
    assert not value_validation_dict["key1"][0](4)
    assert value_validation_dict["key1.key2"][0]([1, 2, 3])
    assert not value_validation_dict["key1.key2"][0](["a", "b"])
def test_value_validation(path):
    builder = ConfigBuilder()
    builder.validate_field_value("server.debug_mode", lambda x: not x)
    builder.validate_field_value("server.port",
                                 [lambda x: x < 10000, lambda x: x > 1023])
    builder.parse_config(path)

    builder.validate_field_value("server.port", lambda x: x > 6000)
    with pytest.raises(AssertionError):
        builder.parse_config(path)

    builder = ConfigBuilder()
    builder = builder.validate_field_value("cache.ttl", lambda x: x > 200)
    with pytest.raises(AssertionError):
        builder.parse_config(path)