Skip to content

Commit a98eba4

Browse files
Add sendAndWait for all languages
1 parent 1617f7d commit a98eba4

File tree

5 files changed

+21
-14
lines changed

5 files changed

+21
-14
lines changed

dotnet/test/SessionTests.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,15 +329,16 @@ public async Task Send_Returns_Immediately_While_Events_Stream_In_Background()
329329

330330
session.On(evt => events.Add(evt.Type));
331331

332-
await session.SendAsync(new MessageOptions { Prompt = "What is 1+1?" });
332+
// Use a slow command so we can verify SendAsync() returns before completion
333+
await session.SendAsync(new MessageOptions { Prompt = "Run 'sleep 2 && echo done'" });
333334

334-
// send() should return before turn completes (no session.idle yet)
335+
// SendAsync() should return before turn completes (no session.idle yet)
335336
Assert.DoesNotContain("session.idle", events);
336337

337338
// Wait for turn to complete
338339
var message = await TestHelper.GetFinalAssistantMessageAsync(session);
339340

340-
Assert.Contains("2", message?.Data.Content ?? string.Empty);
341+
Assert.Contains("done", message?.Data.Content ?? string.Empty);
341342
Assert.Contains("session.idle", events);
342343
Assert.Contains("assistant.message", events);
343344
}
@@ -364,8 +365,9 @@ public async Task SendAndWait_Throws_On_Timeout()
364365
{
365366
var session = await Client.CreateSessionAsync();
366367

368+
// Use a slow command to ensure timeout triggers before completion
367369
var ex = await Assert.ThrowsAsync<TimeoutException>(() =>
368-
session.SendAndWaitAsync(new MessageOptions { Prompt = "What is 3+3?" }, TimeSpan.FromMilliseconds(1)));
370+
session.SendAndWaitAsync(new MessageOptions { Prompt = "Run 'sleep 2 && echo done'" }, TimeSpan.FromMilliseconds(100)));
369371

370372
Assert.Contains("timed out", ex.Message);
371373
}

go/session.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,17 +152,18 @@ func (s *Session) SendAndWait(options MessageOptions, timeout time.Duration) (*S
152152
var mu sync.Mutex
153153

154154
unsubscribe := s.On(func(event SessionEvent) {
155-
if event.Type == generated.AssistantMessage {
155+
switch event.Type {
156+
case generated.AssistantMessage:
156157
mu.Lock()
157158
eventCopy := event
158159
lastAssistantMessage = &eventCopy
159160
mu.Unlock()
160-
} else if event.Type == generated.SessionIdle {
161+
case generated.SessionIdle:
161162
select {
162163
case idleCh <- struct{}{}:
163164
default:
164165
}
165-
} else if event.Type == generated.SessionError {
166+
case generated.SessionError:
166167
errMsg := "session error"
167168
if event.Data.Message != nil {
168169
errMsg = *event.Data.Message

nodejs/test/e2e/session.test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -334,15 +334,16 @@ describe("Send Blocking Behavior", async () => {
334334
events.push(event.type);
335335
});
336336

337-
await session.send({ prompt: "What is 1+1?" });
337+
// Use a slow command so we can verify send() returns before completion
338+
await session.send({ prompt: "Run 'sleep 2 && echo done'" });
338339

339340
// send() should return before turn completes (no session.idle yet)
340341
expect(events).not.toContain("session.idle");
341342

342343
// Wait for turn to complete
343344
const message = await getFinalAssistantMessage(session);
344345

345-
expect(message.data.content).toContain("2");
346+
expect(message.data.content).toContain("done");
346347
expect(events).toContain("session.idle");
347348
expect(events).toContain("assistant.message");
348349
});
@@ -367,8 +368,9 @@ describe("Send Blocking Behavior", async () => {
367368
it("sendAndWait throws on timeout", async () => {
368369
const session = await client.createSession();
369370

370-
await expect(session.sendAndWait({ prompt: "What is 3+3?" }, 1)).rejects.toThrow(
371-
/Timeout after 1ms/
372-
);
371+
// Use a slow command to ensure timeout triggers before completion
372+
await expect(
373+
session.sendAndWait({ prompt: "Run 'sleep 2 && echo done'" }, 100)
374+
).rejects.toThrow(/Timeout after 100ms/);
373375
});
374376
});

python/copilot/session.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
from .types import (
1515
MessageOptions,
1616
PermissionHandler,
17-
SessionEvent as SessionEventTypeAlias,
1817
Tool,
1918
ToolHandler,
2019
)
20+
from .types import (
21+
SessionEvent as SessionEventTypeAlias,
22+
)
2123

2224

2325
class CopilotSession:

python/e2e/test_permissions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from copilot import PermissionRequest, PermissionRequestResult
1010

11-
from .testharness import E2ETestContext, get_final_assistant_message
11+
from .testharness import E2ETestContext
1212
from .testharness.helper import read_file, write_file
1313

1414
pytestmark = pytest.mark.asyncio(loop_scope="module")

0 commit comments

Comments
 (0)