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_optional_access(path):
    builder = ConfigBuilder()
    builder.set_field_access_optional()
    builder.add_required_field("server.nokey")
    builder.add_required_fields(["cache.name", "test"])
    config = builder.parse_config(path)

    assert config.nokey is None
    with pytest.raises(AttributeError):
        config.test
    assert config.server.nokey2 is None
    with pytest.raises(AttributeError):
        config.server.nokey
    assert config.cache.name2 is None
    with pytest.raises(AttributeError):
        config.cache.name