forked from github/copilot-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_connectors.py
More file actions
148 lines (134 loc) · 4.98 KB
/
Copy pathtest_connectors.py
File metadata and controls
148 lines (134 loc) · 4.98 KB
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
from unittest.mock import AsyncMock, Mock
import pytest
from copilot.generated.rpc import (
ConnectorAccountRequest,
ConnectorAvailability,
ConnectorConnectRequest,
ConnectorConnectResultKind,
ConnectorContinueRequest,
ConnectorReconcileRequest,
)
from copilot.session import CopilotSession
@pytest.mark.asyncio
async def test_session_connectors_exposes_host_lifecycle_api():
transport = Mock()
transport.request = AsyncMock(side_effect=connector_response)
session = CopilotSession("session-1", transport)
capabilities = await session.rpc.connectors.get_capabilities()
assert capabilities.availability is ConnectorAvailability.ENABLED
assert (await session.rpc.connectors.get_status()).api_version == 1
assert (
await session.rpc.connectors.list(ConnectorAccountRequest(account_id="account-1"))
).revision == 1
assert (
await session.rpc.connectors.refresh(ConnectorAccountRequest(account_id="account-1"))
).revision == 1
request = ConnectorConnectRequest(account_id="account-1", connector_name="calendar")
consent = await session.rpc.connectors.connect(request)
assert consent.kind is ConnectorConnectResultKind.CONSENT_REQUIRED
assert consent.consent_url == "https://example.com/consent"
assert consent.continuation_id == "continuation-1"
reconnect = await session.rpc.connectors.reconnect(request)
assert reconnect.kind is ConnectorConnectResultKind.PENDING
assert reconnect.continuation_id == "continuation-1"
continued = await session.rpc.connectors.continue_connection(
ConnectorContinueRequest(
continuation_id="continuation-1",
max_attempts=3,
poll_interval_ms=100,
deadline_ms=1_000,
)
)
assert continued.kind is ConnectorConnectResultKind.PENDING
assert continued.continuation_id == "continuation-1"
assert (await session.rpc.connectors.disconnect(request)).disconnected
assert (
await session.rpc.connectors.reconcile(
ConnectorReconcileRequest(account_id="account-1", refresh_catalog=True)
)
).api_version == 1
assert [(call.args[0], call.args[1]) for call in transport.request.await_args_list] == [
("session.connectors.getCapabilities", {"sessionId": "session-1"}),
("session.connectors.getStatus", {"sessionId": "session-1"}),
(
"session.connectors.list",
{"accountId": "account-1", "sessionId": "session-1"},
),
(
"session.connectors.refresh",
{"accountId": "account-1", "sessionId": "session-1"},
),
(
"session.connectors.connect",
{
"accountId": "account-1",
"connectorName": "calendar",
"sessionId": "session-1",
},
),
(
"session.connectors.reconnect",
{
"accountId": "account-1",
"connectorName": "calendar",
"sessionId": "session-1",
},
),
(
"session.connectors.continueConnection",
{
"continuationId": "continuation-1",
"deadlineMs": 1_000,
"maxAttempts": 3,
"pollIntervalMs": 100,
"sessionId": "session-1",
},
),
(
"session.connectors.disconnect",
{
"accountId": "account-1",
"connectorName": "calendar",
"sessionId": "session-1",
},
),
(
"session.connectors.reconcile",
{
"accountId": "account-1",
"refreshCatalog": True,
"sessionId": "session-1",
},
),
]
def connector_response(method, _params, **_kwargs):
if method == "session.connectors.getCapabilities":
return {
"apiVersion": 1,
"availability": "enabled",
"consentContinuation": True,
"opaqueAccountSelection": True,
"maxPollAttempts": 30,
"maxPollIntervalMs": 2_000,
"maxDeadlineMs": 60_000,
}
if method in ("session.connectors.list", "session.connectors.refresh"):
return {"revision": 1, "refreshedAtMs": 1, "connectors": []}
if method == "session.connectors.connect":
return {
"kind": "consent_required",
"consentUrl": "https://example.com/consent",
"continuationId": "continuation-1",
}
if method in ("session.connectors.reconnect", "session.connectors.continueConnection"):
return {"kind": "pending", "continuationId": "continuation-1"}
if method == "session.connectors.disconnect":
return {"disconnected": True, "status": connector_status()}
return connector_status()
def connector_status():
return {
"apiVersion": 1,
"availability": "enabled",
"runtimeServers": [],
"pendingConnections": 0,
}