mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-13 02:41:50 +08:00
Add unit tests for LspGraphBuilder class
- Implement comprehensive unit tests for the LspGraphBuilder class to validate its functionality in building code association graphs. - Tests cover various scenarios including single level graph expansion, max nodes and depth boundaries, concurrent expansion limits, document symbol caching, error handling during node expansion, and edge cases such as empty seed lists and self-referencing nodes. - Utilize pytest and asyncio for asynchronous testing and mocking of LspBridge methods.
This commit is contained in:
93
codex-lens/tests/real/direct_pyright_test.py
Normal file
93
codex-lens/tests/real/direct_pyright_test.py
Normal file
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env python
|
||||
"""Direct test of pyright-langserver communication."""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import sys
|
||||
|
||||
async def test_pyright():
|
||||
print("Starting pyright-langserver...")
|
||||
|
||||
process = await asyncio.create_subprocess_exec(
|
||||
"pyright-langserver", "--stdio",
|
||||
stdin=asyncio.subprocess.PIPE,
|
||||
stdout=asyncio.subprocess.PIPE,
|
||||
stderr=asyncio.subprocess.PIPE,
|
||||
)
|
||||
|
||||
# Build initialize request
|
||||
init_msg = {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"method": "initialize",
|
||||
"params": {
|
||||
"processId": 1234,
|
||||
"rootUri": "file:///D:/Claude_dms3/codex-lens",
|
||||
"rootPath": "D:/Claude_dms3/codex-lens",
|
||||
"capabilities": {
|
||||
"textDocument": {
|
||||
"documentSymbol": {"hierarchicalDocumentSymbolSupport": True}
|
||||
},
|
||||
"workspace": {"configuration": True}
|
||||
},
|
||||
"workspaceFolders": [
|
||||
{"uri": "file:///D:/Claude_dms3/codex-lens", "name": "codex-lens"}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
body = json.dumps(init_msg).encode("utf-8")
|
||||
header = f"Content-Length: {len(body)}\r\n\r\n".encode("ascii")
|
||||
|
||||
print(f"Sending initialize request ({len(body)} bytes)...")
|
||||
process.stdin.write(header + body)
|
||||
await process.stdin.drain()
|
||||
|
||||
# Read responses
|
||||
print("Reading responses...")
|
||||
for i in range(20):
|
||||
try:
|
||||
line = await asyncio.wait_for(process.stdout.readline(), timeout=2.0)
|
||||
if not line:
|
||||
print(" (empty line - stream closed)")
|
||||
break
|
||||
line_str = line.decode("ascii").strip()
|
||||
print(f" Header: {line_str}")
|
||||
|
||||
if line_str.lower().startswith("content-length:"):
|
||||
content_length = int(line_str.split(":")[1].strip())
|
||||
# Read empty line
|
||||
await process.stdout.readline()
|
||||
# Read body
|
||||
body_data = await process.stdout.readexactly(content_length)
|
||||
msg = json.loads(body_data.decode("utf-8"))
|
||||
print(f" Message: id={msg.get('id', 'none')}, method={msg.get('method', 'none')}")
|
||||
if msg.get("id") == 1:
|
||||
print(f" >>> GOT INITIALIZE RESPONSE!")
|
||||
print(f" >>> Capabilities: {list(msg.get('result', {}).get('capabilities', {}).keys())[:10]}...")
|
||||
|
||||
# Send initialized notification
|
||||
print("\nSending 'initialized' notification...")
|
||||
init_notif = {"jsonrpc": "2.0", "method": "initialized", "params": {}}
|
||||
body2 = json.dumps(init_notif).encode("utf-8")
|
||||
header2 = f"Content-Length: {len(body2)}\r\n\r\n".encode("ascii")
|
||||
process.stdin.write(header2 + body2)
|
||||
await process.stdin.drain()
|
||||
|
||||
# Wait a moment for any server requests
|
||||
print("Waiting for server requests...")
|
||||
await asyncio.sleep(1.0)
|
||||
continue # Keep reading to see if workspace/configuration comes
|
||||
if msg.get("method") == "workspace/configuration":
|
||||
print(f" >>> GOT workspace/configuration REQUEST!")
|
||||
print(f" >>> Params: {msg.get('params')}")
|
||||
except asyncio.TimeoutError:
|
||||
print(" (timeout waiting for more data)")
|
||||
break
|
||||
|
||||
process.terminate()
|
||||
await process.wait()
|
||||
print("Done.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(test_pyright())
|
||||
Reference in New Issue
Block a user