cgcardona / muse public
test_plugin_registry.py python
82 lines 3.1 KB
e6786943 feat: upgrade to Python 3.14, drop from __future__ import annotations Gabriel Cardona <cgcardona@gmail.com> 1d ago
1 """Unit tests for muse.plugins.registry — resolve_plugin, read_domain, registered_domains."""
2
3 import json
4 import pathlib
5
6 import pytest
7
8 from muse.core.errors import MuseCLIError
9 from muse.domain import MuseDomainPlugin
10 from muse.plugins.midi.plugin import MidiPlugin
11 from muse.plugins.registry import read_domain, registered_domains, resolve_plugin
12
13
14 def _make_repo(tmp_path: pathlib.Path, domain: str = "midi") -> pathlib.Path:
15 """Scaffold a minimal .muse/repo.json so registry helpers can run."""
16 muse_dir = tmp_path / ".muse"
17 muse_dir.mkdir()
18 (muse_dir / "repo.json").write_text(
19 json.dumps({"repo_id": "test-id", "schema_version": "2", "domain": domain})
20 )
21 return tmp_path
22
23
24 class TestReadDomain:
25 def test_returns_stored_domain(self, tmp_path: pathlib.Path) -> None:
26 root = _make_repo(tmp_path, domain="midi")
27 assert read_domain(root) == "midi"
28
29 def test_defaults_to_music_when_key_missing(self, tmp_path: pathlib.Path) -> None:
30 muse_dir = tmp_path / ".muse"
31 muse_dir.mkdir()
32 (muse_dir / "repo.json").write_text(json.dumps({"repo_id": "x"}))
33 assert read_domain(tmp_path) == "midi"
34
35 def test_defaults_to_music_when_repo_json_absent(self, tmp_path: pathlib.Path) -> None:
36 (tmp_path / ".muse").mkdir()
37 assert read_domain(tmp_path) == "midi"
38
39 def test_defaults_to_music_when_muse_dir_absent(self, tmp_path: pathlib.Path) -> None:
40 assert read_domain(tmp_path) == "midi"
41
42
43 class TestResolvePlugin:
44 def test_returns_music_plugin_for_music_domain(self, tmp_path: pathlib.Path) -> None:
45 root = _make_repo(tmp_path, domain="midi")
46 plugin = resolve_plugin(root)
47 assert isinstance(plugin, MidiPlugin)
48
49 def test_returned_plugin_satisfies_protocol(self, tmp_path: pathlib.Path) -> None:
50 root = _make_repo(tmp_path, domain="midi")
51 plugin = resolve_plugin(root)
52 assert isinstance(plugin, MuseDomainPlugin)
53
54 def test_raises_for_unknown_domain(self, tmp_path: pathlib.Path) -> None:
55 root = _make_repo(tmp_path, domain="unknown-domain")
56 with pytest.raises(MuseCLIError, match="unknown-domain"):
57 resolve_plugin(root)
58
59 def test_raises_error_mentions_registered_domains(self, tmp_path: pathlib.Path) -> None:
60 root = _make_repo(tmp_path, domain="bogus")
61 with pytest.raises(MuseCLIError, match="midi"):
62 resolve_plugin(root)
63
64 def test_defaults_to_music_plugin_when_no_domain_key(self, tmp_path: pathlib.Path) -> None:
65 muse_dir = tmp_path / ".muse"
66 muse_dir.mkdir()
67 (muse_dir / "repo.json").write_text(json.dumps({"repo_id": "x"}))
68 plugin = resolve_plugin(tmp_path)
69 assert isinstance(plugin, MidiPlugin)
70
71
72 class TestRegisteredDomains:
73 def test_includes_music(self) -> None:
74 assert "midi" in registered_domains()
75
76 def test_returns_sorted_list(self) -> None:
77 domains = registered_domains()
78 assert domains == sorted(domains)
79
80 def test_returns_list_of_strings(self) -> None:
81 domains = registered_domains()
82 assert all(isinstance(d, str) for d in domains)