test_muse_only.py
file-level
1
files
1
commits
0
hotspots
0
🧊 dead
0
💥 blast risk
| 1 | """Unit tests for muse-only adapter fail-closed branches.""" |
| 2 | |
| 3 | from __future__ import annotations |
| 4 | |
| 5 | from adapters.errors import ReadError, WriteError |
| 6 | from tests.support import adapter_for, fail, make_runner, ok |
| 7 | |
| 8 | GIT_FORBIDDEN = "git forbidden in this regime" |
| 9 | |
| 10 | |
| 11 | def test_status_success(muse_only_config, repo_root) -> None: |
| 12 | root = str(repo_root) |
| 13 | runner = make_runner( |
| 14 | { |
| 15 | f"muse -C {root} branch": ok("feat/hub"), |
| 16 | f"muse -C {root} status --json": ok('{"dirty": false, "branch": "feat/hub"}'), |
| 17 | } |
| 18 | ) |
| 19 | adapter = adapter_for(muse_only_config, repo_root, runner) |
| 20 | result = adapter.status() |
| 21 | assert result.regime == "muse-only" |
| 22 | assert result.branch == "feat/hub" |
| 23 | assert "git-forbidden" in result.notes[1] |
| 24 | |
| 25 | |
| 26 | def test_status_fails_closed_on_muse_error(muse_only_config, repo_root) -> None: |
| 27 | root = str(repo_root) |
| 28 | runner = make_runner({f"muse -C {root} branch": fail("muse unavailable")}) |
| 29 | adapter = adapter_for(muse_only_config, repo_root, runner) |
| 30 | result = adapter.status() |
| 31 | assert isinstance(result, ReadError) |
| 32 | assert "muse -C" in result.command |
| 33 | |
| 34 | |
| 35 | def test_read_head_rejects_git_ref(muse_only_config, repo_root) -> None: |
| 36 | adapter = adapter_for(muse_only_config, repo_root, make_runner({})) |
| 37 | result = adapter.read_head("origin/main") |
| 38 | assert isinstance(result, ReadError) |
| 39 | assert result.message == GIT_FORBIDDEN |
| 40 | |
| 41 | |
| 42 | def test_read_canonical_anchor(muse_only_config, repo_root) -> None: |
| 43 | root = str(repo_root) |
| 44 | runner = make_runner( |
| 45 | {f"muse -C {root} rev-parse main": ok('sha256:abc')} |
| 46 | ) |
| 47 | adapter = adapter_for(muse_only_config, repo_root, runner) |
| 48 | result = adapter.read_canonical_anchor() |
| 49 | assert result.anchor_sha == "sha256:abc" |
| 50 | assert result.source == "muse:main" |
| 51 | |
| 52 | |
| 53 | def test_realign_noop(muse_only_config, repo_root) -> None: |
| 54 | adapter = adapter_for(muse_only_config, repo_root, make_runner({})) |
| 55 | result = adapter.realign(dry_run=False, max_commits=50) |
| 56 | assert result.reason == "single-history" |
| 57 | |
| 58 | |
| 59 | def test_mirror_reports_git_forbidden(muse_only_config, repo_root) -> None: |
| 60 | adapter = adapter_for(muse_only_config, repo_root, make_runner({})) |
| 61 | result = adapter.mirror(dry_run=True) |
| 62 | assert result.reason == GIT_FORBIDDEN |
| 63 | assert result.pushed is False |
| 64 | |
| 65 | |
| 66 | def test_commit_feature_refuses_main(muse_only_config, repo_root) -> None: |
| 67 | adapter = adapter_for(muse_only_config, repo_root, make_runner({})) |
| 68 | result = adapter.commit_feature(branch="main", message="x", paths=[]) |
| 69 | assert isinstance(result, WriteError) |