Merge remote-tracking branch 'origin/main' into feat/server-list-ux
This commit is contained in:
@@ -758,6 +758,152 @@ def test_server_log_path_unsupported_platform_returns_none(tmp_path, monkeypatch
|
||||
assert c.server_log_path("brave-search") is None
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- #
|
||||
# MSIX-virtualized Claude Desktop config detection (issue #7)
|
||||
# --------------------------------------------------------------------------- #
|
||||
def _make_msix_pkg(localappdata, pkg_name="AnthropicClaude_abc123xyz", with_config=True):
|
||||
cfg_dir = localappdata / "Packages" / pkg_name / "LocalCache" / "Roaming" / "Claude"
|
||||
cfg_dir.mkdir(parents=True)
|
||||
cfg_path = cfg_dir / c.CONFIG_FILENAME
|
||||
if with_config:
|
||||
cfg_path.write_text('{"mcpServers": {}}')
|
||||
return cfg_path
|
||||
|
||||
|
||||
def test_msix_config_paths_finds_package_config(tmp_path):
|
||||
local = tmp_path / "Local"
|
||||
expected = _make_msix_pkg(local)
|
||||
assert c.msix_config_paths(local) == [expected]
|
||||
|
||||
|
||||
def test_msix_config_paths_ignores_non_claude_packages(tmp_path):
|
||||
local = tmp_path / "Local"
|
||||
(local / "Packages" / "SomeOtherApp_xyz" / "LocalCache" / "Roaming").mkdir(parents=True)
|
||||
assert c.msix_config_paths(local) == []
|
||||
|
||||
|
||||
def test_msix_config_paths_empty_when_package_dir_has_no_config_yet(tmp_path):
|
||||
local = tmp_path / "Local"
|
||||
_make_msix_pkg(local, with_config=False)
|
||||
assert c.msix_config_paths(local) == []
|
||||
|
||||
|
||||
def test_msix_config_paths_empty_when_no_packages_dir(tmp_path):
|
||||
assert c.msix_config_paths(tmp_path / "Local") == []
|
||||
|
||||
|
||||
def test_msix_config_paths_uses_localappdata_env_by_default(tmp_path, monkeypatch):
|
||||
local = tmp_path / "Local"
|
||||
expected = _make_msix_pkg(local)
|
||||
monkeypatch.setenv("LOCALAPPDATA", str(local))
|
||||
assert c.msix_config_paths() == [expected]
|
||||
|
||||
|
||||
def test_detect_msix_claude_returns_none_on_non_windows(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "darwin")
|
||||
local = tmp_path / "Local"
|
||||
_make_msix_pkg(local)
|
||||
assert c.detect_msix_claude(localappdata=local) is None
|
||||
|
||||
|
||||
def test_detect_msix_claude_finds_virtualized_config_on_windows(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "win32")
|
||||
local = tmp_path / "Local"
|
||||
expected = _make_msix_pkg(local)
|
||||
assert c.detect_msix_claude(localappdata=local) == expected
|
||||
|
||||
|
||||
def test_detect_msix_claude_none_when_nothing_present_on_windows(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "win32")
|
||||
local = tmp_path / "Local"
|
||||
assert c.detect_msix_claude(localappdata=local) is None
|
||||
|
||||
|
||||
def test_msix_warning_text_none_on_non_windows(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "darwin")
|
||||
local = tmp_path / "Local"
|
||||
_make_msix_pkg(local)
|
||||
assert c.msix_warning_text(localappdata=local) is None
|
||||
|
||||
|
||||
def test_msix_warning_text_none_when_nothing_detected(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "win32")
|
||||
local = tmp_path / "Local"
|
||||
assert c.msix_warning_text(localappdata=local) is None
|
||||
|
||||
|
||||
def test_msix_warning_text_warns_when_virtualized_path_differs(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "win32")
|
||||
roaming = tmp_path / "Roaming"
|
||||
local = tmp_path / "Local"
|
||||
real = _make_msix_pkg(local)
|
||||
warning = c.msix_warning_text(appdata=roaming, localappdata=local)
|
||||
assert warning is not None
|
||||
assert "Microsoft Store" in warning
|
||||
assert str(real) in warning
|
||||
assert str(roaming / "Claude" / c.CONFIG_FILENAME) in warning
|
||||
|
||||
|
||||
def test_msix_warning_text_none_when_plain_and_virtualized_paths_match(tmp_path, monkeypatch):
|
||||
# Degenerate case: if the "plain" APPDATA base is pointed at the exact
|
||||
# same tree the MSIX scan found (e.g. a symlink setup), there's nothing
|
||||
# surprising to warn about.
|
||||
monkeypatch.setattr(c.sys, "platform", "win32")
|
||||
local = tmp_path / "Local"
|
||||
pkg_claude_dir = local / "Packages" / "AnthropicClaude_abc123xyz" / "LocalCache" / "Roaming"
|
||||
pkg_claude_dir.mkdir(parents=True)
|
||||
(pkg_claude_dir / "Claude").mkdir()
|
||||
(pkg_claude_dir / "Claude" / c.CONFIG_FILENAME).write_text("{}")
|
||||
warning = c.msix_warning_text(appdata=pkg_claude_dir, localappdata=local)
|
||||
assert warning is None
|
||||
|
||||
|
||||
def test_discover_profiles_adds_msix_profile_on_windows(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "win32")
|
||||
base = tmp_path / "AppSupport"
|
||||
base.mkdir()
|
||||
monkeypatch.setattr(c, "app_support_base", lambda: base)
|
||||
monkeypatch.setattr(c.Path, "home", lambda: tmp_path / "home")
|
||||
(tmp_path / "home" / ".claude").mkdir(parents=True)
|
||||
local = tmp_path / "Local"
|
||||
real = _make_msix_pkg(local)
|
||||
monkeypatch.setenv("LOCALAPPDATA", str(local))
|
||||
|
||||
profs = c.discover_profiles()
|
||||
msix = [p for p in profs if "MSIX" in p.label]
|
||||
assert len(msix) == 1
|
||||
assert msix[0].path == real
|
||||
assert msix[0].config_exists
|
||||
|
||||
|
||||
def test_discover_profiles_no_msix_profile_when_nothing_detected(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "win32")
|
||||
base = tmp_path / "AppSupport"
|
||||
base.mkdir()
|
||||
monkeypatch.setattr(c, "app_support_base", lambda: base)
|
||||
monkeypatch.setattr(c.Path, "home", lambda: tmp_path / "home")
|
||||
(tmp_path / "home" / ".claude").mkdir(parents=True)
|
||||
monkeypatch.setenv("LOCALAPPDATA", str(tmp_path / "Local"))
|
||||
|
||||
profs = c.discover_profiles()
|
||||
assert not any("MSIX" in p.label for p in profs)
|
||||
|
||||
|
||||
def test_discover_profiles_no_msix_profile_on_non_windows(tmp_path, monkeypatch):
|
||||
monkeypatch.setattr(c.sys, "platform", "darwin")
|
||||
base = tmp_path / "AppSupport"
|
||||
base.mkdir()
|
||||
monkeypatch.setattr(c, "app_support_base", lambda: base)
|
||||
monkeypatch.setattr(c.Path, "home", lambda: tmp_path / "home")
|
||||
(tmp_path / "home" / ".claude").mkdir(parents=True)
|
||||
local = tmp_path / "Local"
|
||||
_make_msix_pkg(local)
|
||||
monkeypatch.setenv("LOCALAPPDATA", str(local))
|
||||
|
||||
profs = c.discover_profiles()
|
||||
assert not any("MSIX" in p.label for p in profs)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- #
|
||||
# restart_claude_desktop / profile_targets_claude_desktop (issue #9)
|
||||
# --------------------------------------------------------------------------- #
|
||||
|
||||
Reference in New Issue
Block a user