Co-authored-by: Clément Drouin <clement.drouin@mistral.ai> Co-authored-by: Jean-Baptiste Muscat <jeanbaptiste.muscatdupuis@mistral.ai> Co-authored-by: JeroenvdV <JeroenvdV@users.noreply.github.com> Co-authored-by: Kim-Adeline Miguel <51720070+kimadeline@users.noreply.github.com> Co-authored-by: Mathias Gesbert <mathias.gesbert@mistral.ai> Co-authored-by: Paul Cacheux <paul.cacheux@mistral.ai> Co-authored-by: Pierre Rossinès <pierre.rossines@mistral.ai> Co-authored-by: Simon Van de Kerckhove <simon.vandekerckhove@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: allansimon-mistral <allan.simon@ext.mistral.ai> Co-authored-by: Mistral Vibe <vibe@mistral.ai>
126 lines
4.3 KiB
Python
126 lines
4.3 KiB
Python
from __future__ import annotations
|
|
|
|
from vibe.acp.utils import (
|
|
TOOL_OPTIONS,
|
|
ToolOption,
|
|
build_permission_options,
|
|
get_proxy_help_text,
|
|
)
|
|
from vibe.core.paths import GLOBAL_ENV_FILE
|
|
from vibe.core.proxy_setup import SUPPORTED_PROXY_VARS
|
|
from vibe.core.tools.permissions import PermissionScope, RequiredPermission
|
|
|
|
|
|
def _write_env_file(content: str) -> None:
|
|
GLOBAL_ENV_FILE.path.parent.mkdir(parents=True, exist_ok=True)
|
|
GLOBAL_ENV_FILE.path.write_text(content, encoding="utf-8")
|
|
|
|
|
|
class TestGetProxyHelpText:
|
|
def test_returns_string(self) -> None:
|
|
result = get_proxy_help_text()
|
|
|
|
assert isinstance(result, str)
|
|
|
|
def test_includes_proxy_configuration_header(self) -> None:
|
|
result = get_proxy_help_text()
|
|
|
|
assert "## Proxy Configuration" in result
|
|
|
|
def test_includes_usage_section(self) -> None:
|
|
result = get_proxy_help_text()
|
|
|
|
assert "### Usage:" in result
|
|
assert "/proxy-setup" in result
|
|
|
|
def test_includes_all_supported_variables(self) -> None:
|
|
result = get_proxy_help_text()
|
|
|
|
for key in SUPPORTED_PROXY_VARS:
|
|
assert f"`{key}`" in result
|
|
|
|
def test_shows_none_configured_when_no_settings(self) -> None:
|
|
result = get_proxy_help_text()
|
|
|
|
assert "(none configured)" in result
|
|
|
|
def test_shows_current_settings_when_configured(self) -> None:
|
|
_write_env_file("HTTP_PROXY=http://proxy:8080\n")
|
|
|
|
result = get_proxy_help_text()
|
|
|
|
assert "HTTP_PROXY=http://proxy:8080" in result
|
|
assert "(none configured)" not in result
|
|
|
|
def test_shows_only_set_values(self) -> None:
|
|
_write_env_file("HTTP_PROXY=http://proxy:8080\n")
|
|
|
|
result = get_proxy_help_text()
|
|
|
|
assert "HTTP_PROXY=http://proxy:8080" in result
|
|
assert "HTTPS_PROXY=" not in result
|
|
|
|
|
|
class TestBuildPermissionOptions:
|
|
def test_no_permissions_returns_default_options(self) -> None:
|
|
result = build_permission_options(None)
|
|
assert result is TOOL_OPTIONS
|
|
|
|
def test_empty_list_returns_default_options(self) -> None:
|
|
result = build_permission_options([])
|
|
assert result is TOOL_OPTIONS
|
|
|
|
def test_with_permissions_includes_labels_in_allow_always(self) -> None:
|
|
permissions = [
|
|
RequiredPermission(
|
|
scope=PermissionScope.COMMAND_PATTERN,
|
|
invocation_pattern="npm install foo",
|
|
session_pattern="npm install *",
|
|
label="npm install *",
|
|
)
|
|
]
|
|
result = build_permission_options(permissions)
|
|
|
|
assert len(result) == 4
|
|
allow_always = next(o for o in result if o.option_id == ToolOption.ALLOW_ALWAYS)
|
|
assert "session" in allow_always.name.lower()
|
|
allow_permanent = next(
|
|
o for o in result if o.option_id == ToolOption.ALLOW_ALWAYS_PERMANENT
|
|
)
|
|
assert "Always allow" == allow_permanent.name
|
|
|
|
def test_allow_always_has_field_meta(self) -> None:
|
|
permissions = [
|
|
RequiredPermission(
|
|
scope=PermissionScope.COMMAND_PATTERN,
|
|
invocation_pattern="mkdir foo",
|
|
session_pattern="mkdir *",
|
|
label="mkdir *",
|
|
)
|
|
]
|
|
result = build_permission_options(permissions)
|
|
|
|
allow_always = next(o for o in result if o.option_id == ToolOption.ALLOW_ALWAYS)
|
|
assert allow_always.field_meta is not None
|
|
assert "required_permissions" in allow_always.field_meta
|
|
meta_perms = allow_always.field_meta["required_permissions"]
|
|
assert len(meta_perms) == 1
|
|
assert meta_perms[0]["session_pattern"] == "mkdir *"
|
|
|
|
def test_allow_once_and_reject_unchanged(self) -> None:
|
|
permissions = [
|
|
RequiredPermission(
|
|
scope=PermissionScope.URL_PATTERN,
|
|
invocation_pattern="example.com",
|
|
session_pattern="example.com",
|
|
label="fetching from example.com",
|
|
)
|
|
]
|
|
result = build_permission_options(permissions)
|
|
|
|
allow_once = next(o for o in result if o.option_id == ToolOption.ALLOW_ONCE)
|
|
reject_once = next(o for o in result if o.option_id == ToolOption.REJECT_ONCE)
|
|
assert allow_once.name == "Allow once"
|
|
assert reject_once.name == "Deny"
|
|
assert allow_once.field_meta is None
|
|
assert reject_once.field_meta is None
|