File size: 5,054 Bytes
d242052
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a5d33a6
 
 
 
 
 
 
 
 
d242052
a5d33a6
 
 
 
 
 
d242052
a5d33a6
 
 
d242052
 
 
 
 
 
 
 
 
 
 
 
a5d33a6
 
 
d242052
 
 
 
a5d33a6
 
 
d242052
 
 
 
 
 
 
 
 
 
 
a5d33a6
 
 
 
 
 
d242052
 
 
 
 
 
 
 
a5d33a6
 
 
d242052
 
 
 
 
 
 
 
 
 
 
a5d33a6
 
 
 
 
 
d242052
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a5d33a6
 
 
 
 
 
d242052
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a5d33a6
 
 
d242052
a5d33a6
 
 
 
 
 
d242052
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
"""Unit tests for C9 Developer Interfaces (REST, CLI, MCP, Python SDK, VS Code)."""

from unittest.mock import MagicMock

from ria.interfaces.cli import CLIRunner
from ria.interfaces.mcp import MCPServer
from ria.interfaces.rest import RESTAPIServer
from ria.interfaces.sdk.python import RIAClient
from ria.interfaces.vscode.extension import VSCodeCommandDispatcher


def test_rest_api_server_endpoints() -> None:
    mock_sync = MagicMock()
    mock_search = MagicMock()
    mock_query = MagicMock()
    mock_context = MagicMock()
    mock_knowledge = MagicMock()

    mock_sync.register_repository.return_value = MagicMock(
        is_success=True, repo_id="r1", status="SYNCED"
    )
    mock_sync.synchronize_repository.return_value = MagicMock(
        is_success=True, repo_id="r1", current_commit_sha="abc"
    )
    mock_search.search_symbol.return_value = MagicMock(
        is_success=True, results=MagicMock(payload=(1, 2, 3, 4, 5))
    )
    mock_query.find_definition.return_value = MagicMock(is_success=True, query_id="q1")
    mock_context.build_context.return_value = MagicMock(
        is_success=True, package_id="p1", total_tokens=150, content="{}"
    )
    mock_knowledge.answer_question.return_value = MagicMock(
        is_success=True, answer_text="Ans", is_grounded=True, grounding_score=0.98
    )

    server = RESTAPIServer(
        mock_sync, mock_search, mock_query, mock_context, mock_knowledge
    )

    # Health
    resp = server.handle_request("GET", "/health")
    assert resp.is_success
    assert resp.data["status"] == "healthy"

    # Version
    resp = server.handle_request("GET", "/version")
    assert resp.is_success
    assert resp.data["version"] == "2.0.0"

    # Register repo
    resp = server.handle_request(
        "POST", "/repositories", {"remote_url": "https://repo.git", "name": "repo"}
    )
    assert resp.is_success
    assert resp.data["repo_id"] == "r1"

    # Search
    resp = server.handle_request(
        "POST", "/search", {"repo_id": "r1", "query_text": "main"}
    )
    assert resp.is_success
    assert resp.data["total_matches"] == 5


def test_mcp_server_tools() -> None:
    mock_sync = MagicMock()
    mock_search = MagicMock()
    mock_query = MagicMock()
    mock_context = MagicMock()
    mock_knowledge = MagicMock()

    mock_search.search_symbol.return_value = MagicMock(
        is_success=True, results=MagicMock(payload=(1, 2))
    )
    mock_knowledge.answer_question.return_value = MagicMock(
        is_success=True, answer_text="Ans", is_grounded=True
    )

    mcp = MCPServer(mock_sync, mock_search, mock_query, mock_context, mock_knowledge)
    tools = mcp.list_tools()
    assert len(tools) == 14

    res = mcp.invoke_tool("search_symbol", {"repo_id": "r1", "query": "login"})
    assert res["is_success"]

    res = mcp.invoke_tool(
        "ask_repository", {"repo_id": "r1", "question": "how to login?"}
    )
    assert res["is_success"]
    assert res["answer"] == "Ans"


def test_python_sdk_client() -> None:
    mock_sync = MagicMock()
    mock_search = MagicMock()
    mock_query = MagicMock()
    mock_context = MagicMock()
    mock_knowledge = MagicMock()

    mock_search.search_symbol.return_value = MagicMock(
        is_success=True, results=MagicMock(payload=tuple(range(10)))
    )
    mock_knowledge.answer_question.return_value = MagicMock(
        is_success=True, answer_text="SDK Ans", is_grounded=True
    )

    client = RIAClient(mock_sync, mock_search, mock_query, mock_context, mock_knowledge)

    srch_resp = client.search("r1", "AuthService")
    assert srch_resp.is_success
    assert srch_resp.data["total_matches"] == 10

    ask_resp = client.ask("r1", "AuthService?")
    assert ask_resp.is_success
    assert ask_resp.data["answer"] == "SDK Ans"


def test_cli_runner() -> None:
    mock_sync = MagicMock()
    mock_search = MagicMock()
    mock_query = MagicMock()
    mock_context = MagicMock()
    mock_knowledge = MagicMock()

    mock_sync.register_repository.return_value = MagicMock(
        is_success=True, repo_id="r1", status="SYNCED"
    )
    mock_search.search_symbol.return_value = MagicMock(
        is_success=True, results=MagicMock(payload=(1,))
    )

    cli = CLIRunner(mock_sync, mock_search, mock_query, mock_context, mock_knowledge)
    ret = cli.run(["init", "--remote-url", "https://repo.git", "--name", "repo"])
    assert ret == 0

    ret = cli.run(["search", "--repo-id", "r1", "--query", "login"])
    assert ret == 0


def test_vscode_command_dispatcher() -> None:
    mock_search = MagicMock()
    mock_query = MagicMock()
    mock_context = MagicMock()
    mock_knowledge = MagicMock()

    mock_knowledge.answer_question.return_value = MagicMock(
        is_success=True, answer_text="VS Code Ans"
    )

    disp = VSCodeCommandDispatcher(
        mock_search, mock_query, mock_context, mock_knowledge
    )
    res = disp.execute_command(
        "ria.askRepository", {"repo_id": "r1", "question": "auth?"}
    )
    assert res["is_success"]
    assert res["answer"] == "VS Code Ans"