"""Documentation checks for external Jenkins/GlitchTip MCP registration (#151/#152).""" from pathlib import Path REPO_ROOT = Path(__file__).resolve().parent.parent DOC = REPO_ROOT / "docs" / "mcp-client-registration.md" def _doc_text(): assert DOC.is_file(), "missing docs/mcp-client-registration.md" return DOC.read_text(encoding="utf-8") def test_registration_doc_names_canonical_servers(): text = _doc_text() assert "jenkins-mcp" in text assert "glitchtip-mcp" in text assert "Historical names" in text assert "jenkins-readonly" in text assert "glitchtip-readonly" in text def test_registration_doc_lists_expected_tool_visibility(): text = _doc_text() for tool in ( "jenkins_whoami", "jenkins_list_jobs", "jenkins_latest_build", "jenkins_build_status", "jenkins_get_build", "glitchtip_whoami", "glitchtip_list_projects", "glitchtip_list_unresolved", "glitchtip_get_issue", "glitchtip_recent_events", "glitchtip_search", ): assert tool in text def test_registration_doc_requires_reload_and_negative_case(): text = _doc_text() lower = text.lower() assert "reconnect" in lower assert "reload" in lower assert "enabled but no usable tools" in lower assert "SKIPPED" in text def test_registration_doc_preserves_boundaries(): text = " ".join(_doc_text().split()) for phrase in ( "Do not add Jenkins or GlitchTip credentials to the Gitea MCP server", "do not add Gitea write credentials to the GlitchTip server", "must not expose build trigger tools", "jenkins-write-mcp", "jenkins_mcp.write_server", "remains read-only", ): assert phrase in text def test_registration_doc_separates_jenkins_trigger_from_read_surface(): text = _doc_text() assert "jenkins_trigger_build" in text assert "must **not** appear on `jenkins-mcp`" in text assert "not" in text.lower() and "registered by default" in text.lower() def test_registration_doc_has_no_secret_material_or_live_urls(): text = _doc_text() for marker in ( "https://", "http://", "Authorization:", "BEGIN PRIVATE KEY", "ghp_", "token-value", ): assert marker not in text def test_related_docs_link_registration_doc(): for name in ( "README.md", "docs/llm-workflow-runbooks.md", "docs/architecture/jenkins-readonly-build-status-design.md", "docs/architecture/glitchtip-readonly-tools-design.md", ): text = (REPO_ROOT / name).read_text(encoding="utf-8") assert "mcp-client-registration.md" in text, ( f"{name} does not link docs/mcp-client-registration.md") def test_related_docs_keep_jenkins_trigger_off_read_surface(): for name in ( "docs/safety-model.md", "docs/architecture/jenkins-readonly-build-status-design.md", ): text = (REPO_ROOT / name).read_text(encoding="utf-8") assert "jenkins-write-mcp" in text assert "jenkins_mcp.write_server" in text assert "jenkins-mcp" in text