Co-authored-by: Guillaume LE GOFF <guillaume.lgf@gmail.com> Co-authored-by: Michel Thomazo <51709227+michelTho@users.noreply.github.com> Co-authored-by: Pierre Rossinès <pierre.rossines@mistral.ai> Co-authored-by: Val <102326092+vdeva@users.noreply.github.com> Co-authored-by: Vincent G <10739306+VinceOPS@users.noreply.github.com> Co-authored-by: Mistral Vibe <vibe@mistral.ai>
96 lines
3 KiB
Python
96 lines
3 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from vibe.core.config.layer import LayerImplementationError
|
|
from vibe.core.config.layers.user import UserConfigLayer
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_reads_toml_file(tmp_working_directory: Path) -> None:
|
|
path = tmp_working_directory / "config.toml"
|
|
path.write_text('active_model = "mistral-large"\ncount = 42\n')
|
|
|
|
layer = UserConfigLayer(path=path, name="user-toml")
|
|
data = await layer.load()
|
|
assert data.model_extra == {"active_model": "mistral-large", "count": 42}
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_always_trusted(tmp_working_directory: Path) -> None:
|
|
path = tmp_working_directory / "config.toml"
|
|
path.write_text('key = "value"\n')
|
|
|
|
layer = UserConfigLayer(path=path, name="user-toml")
|
|
assert layer.is_trusted is None
|
|
data = await layer.load()
|
|
assert layer.is_trusted is True
|
|
assert data.model_extra == {"key": "value"}
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_missing_file_returns_empty(tmp_working_directory: Path) -> None:
|
|
path = tmp_working_directory / "nonexistent.toml"
|
|
layer = UserConfigLayer(path=path, name="user-toml")
|
|
data = await layer.load()
|
|
assert data.model_extra == {}
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_apply_raises_not_implemented(tmp_working_directory: Path) -> None:
|
|
path = tmp_working_directory / "config.toml"
|
|
layer = UserConfigLayer(path=path, name="user-toml")
|
|
with pytest.raises(NotImplementedError, match="M2"):
|
|
await layer.apply({"op": "set"})
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_nested_toml_structure(tmp_working_directory: Path) -> None:
|
|
path = tmp_working_directory / "config.toml"
|
|
path.write_text("""\
|
|
[models]
|
|
active_model = "test"
|
|
|
|
[[models.items]]
|
|
alias = "a"
|
|
provider = "p"
|
|
""")
|
|
layer = UserConfigLayer(path=path, name="user-toml")
|
|
data = await layer.load()
|
|
assert data.model_extra == {
|
|
"models": {"active_model": "test", "items": [{"alias": "a", "provider": "p"}]}
|
|
}
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_invalid_toml_raises(tmp_working_directory: Path) -> None:
|
|
path = tmp_working_directory / "bad.toml"
|
|
path.write_text("this is not valid = = = toml [[[")
|
|
layer = UserConfigLayer(path=path, name="user-toml")
|
|
with pytest.raises(LayerImplementationError, match="_read_config"):
|
|
await layer.load()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_force_reload_reads_fresh_data(tmp_working_directory: Path) -> None:
|
|
path = tmp_working_directory / "config.toml"
|
|
path.write_text('value = "first"\n')
|
|
layer = UserConfigLayer(path=path, name="user-toml")
|
|
|
|
data1 = await layer.load()
|
|
assert data1.model_extra == {"value": "first"}
|
|
|
|
path.write_text('value = "second"\n')
|
|
data2 = await layer.load(force=True)
|
|
assert data2.model_extra == {"value": "second"}
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_empty_toml_file(tmp_working_directory: Path) -> None:
|
|
path = tmp_working_directory / "empty.toml"
|
|
path.write_text("")
|
|
layer = UserConfigLayer(path=path, name="user-toml")
|
|
data = await layer.load()
|
|
assert data.model_extra == {}
|