"""Tests for `muse hub collaborator accept` — musehub#193. No prior test file existed for muse/cli/commands/hub/collaborators.py at all; this covers the new `accept` verb specifically by mocking the three hub-plumbing calls (_get_hub_and_identity / _resolve_repo_id / _hub_api), which every verb in this module goes through. """ from __future__ import annotations import argparse import json from unittest.mock import MagicMock, patch import pytest from muse.cli.commands.hub import collaborators class TestRegisterFlags: def _parse(self, *extra: str) -> argparse.Namespace: p = argparse.ArgumentParser() sub = p.add_subparsers() collaborators.register(sub) return p.parse_args(["collaborator", "accept", *extra]) def test_no_positional_arg_required(self) -> None: ns = self._parse() assert ns.func is collaborators.run_collaborator_accept def test_json_flag(self) -> None: ns = self._parse("--json") assert ns.json_output is True def test_hub_override_flag(self) -> None: ns = self._parse("--hub", "https://staging.musehub.ai") assert ns.hub == "https://staging.musehub.ai" class TestRunCollaboratorAccept: def test_calls_accept_endpoint(self, capsys: pytest.CaptureFixture[str]) -> None: args = argparse.Namespace(json_output=True, hub=None, repo=None) with ( patch.object(collaborators, "_get_hub_and_identity", return_value=("https://hub.example", MagicMock())), patch.object(collaborators, "_resolve_repo_id", return_value="sha256:repo123"), patch.object(collaborators, "_hub_api") as mock_api, ): mock_api.return_value = {"handle": "carol", "accepted": True} collaborators.run_collaborator_accept(args) mock_api.assert_called_once() call_args = mock_api.call_args assert call_args[0][2] == "POST" assert call_args[0][3] == "/api/repos/sha256:repo123/collaborators/accept" def test_json_output_includes_envelope_and_data(self, capsys: pytest.CaptureFixture[str]) -> None: args = argparse.Namespace(json_output=True, hub=None, repo=None) with ( patch.object(collaborators, "_get_hub_and_identity", return_value=("https://hub.example", MagicMock())), patch.object(collaborators, "_resolve_repo_id", return_value="sha256:repo123"), patch.object(collaborators, "_hub_api", return_value={"handle": "carol", "accepted": True}), ): collaborators.run_collaborator_accept(args) out = capsys.readouterr().out data = json.loads(out) assert data["handle"] == "carol" assert data["accepted"] is True assert "muse_version" in data def test_text_mode_prints_confirmation_to_stderr(self, capsys: pytest.CaptureFixture[str]) -> None: args = argparse.Namespace(json_output=False, hub=None, repo=None) with ( patch.object(collaborators, "_get_hub_and_identity", return_value=("https://hub.example", MagicMock())), patch.object(collaborators, "_resolve_repo_id", return_value="sha256:repo123"), patch.object(collaborators, "_hub_api", return_value={"handle": "carol", "accepted": True}), ): collaborators.run_collaborator_accept(args) cap = capsys.readouterr() assert cap.out == "" assert "accepted" in cap.err.lower()