Skip to content

Commit 8057b56

Browse files
Fix other E2E tests following runtime change
1 parent 9515de6 commit 8057b56

6 files changed

Lines changed: 39 additions & 25 deletions

File tree

go/internal/e2e/session_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ func TestSession(t *testing.T) {
407407
t.Errorf("Expected resumed session ID to match, got %q vs %q", session2.SessionID, sessionID)
408408
}
409409

410-
answer2, err := testharness.GetFinalAssistantMessage(t.Context(), session2)
410+
answer2, err := testharness.GetFinalAssistantMessage(t.Context(), session2, true)
411411
if err != nil {
412412
t.Fatalf("Failed to get assistant message from resumed session: %v", err)
413413
}

go/internal/e2e/testharness/helper.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
99
)
1010

1111
// GetFinalAssistantMessage waits for and returns the final assistant message from a session turn.
12-
func GetFinalAssistantMessage(ctx context.Context, session *copilot.Session) (*copilot.SessionEvent, error) {
12+
// If alreadyIdle is true, skip waiting for session.idle (useful for resumed sessions where the
13+
// idle event was ephemeral and not persisted in the event history).
14+
func GetFinalAssistantMessage(ctx context.Context, session *copilot.Session, alreadyIdle ...bool) (*copilot.SessionEvent, error) {
1315
result := make(chan *copilot.SessionEvent, 1)
1416
errCh := make(chan error, 1)
1517

@@ -34,8 +36,9 @@ func GetFinalAssistantMessage(ctx context.Context, session *copilot.Session) (*c
3436
defer unsubscribe()
3537

3638
// Also check existing messages in case the response already arrived
39+
isAlreadyIdle := len(alreadyIdle) > 0 && alreadyIdle[0]
3740
go func() {
38-
existing, err := getExistingFinalResponse(ctx, session)
41+
existing, err := getExistingFinalResponse(ctx, session, isAlreadyIdle)
3942
if err != nil {
4043
errCh <- err
4144
return
@@ -90,7 +93,7 @@ func GetNextEventOfType(session *copilot.Session, eventType copilot.SessionEvent
9093
}
9194
}
9295

93-
func getExistingFinalResponse(ctx context.Context, session *copilot.Session) (*copilot.SessionEvent, error) {
96+
func getExistingFinalResponse(ctx context.Context, session *copilot.Session, alreadyIdle bool) (*copilot.SessionEvent, error) {
9497
messages, err := session.GetMessages(ctx)
9598
if err != nil {
9699
return nil, err
@@ -125,10 +128,14 @@ func getExistingFinalResponse(ctx context.Context, session *copilot.Session) (*c
125128

126129
// Find session.idle and get last assistant message before it
127130
sessionIdleIndex := -1
128-
for i, msg := range currentTurnMessages {
129-
if msg.Type == "session.idle" {
130-
sessionIdleIndex = i
131-
break
131+
if alreadyIdle {
132+
sessionIdleIndex = len(currentTurnMessages)
133+
} else {
134+
for i, msg := range currentTurnMessages {
135+
if msg.Type == "session.idle" {
136+
sessionIdleIndex = i
137+
break
138+
}
132139
}
133140
}
134141

nodejs/test/e2e/harness/sdkTestHelper.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
import { AssistantMessageEvent, CopilotSession, SessionEvent } from "../../../src";
66

77
export async function getFinalAssistantMessage(
8-
session: CopilotSession
8+
session: CopilotSession,
9+
{ alreadyIdle = false }: { alreadyIdle?: boolean } = {}
910
): Promise<AssistantMessageEvent> {
1011
// We don't know whether the answer has already arrived or not, so race both possibilities
1112
return new Promise<AssistantMessageEvent>(async (resolve, reject) => {
1213
getFutureFinalResponse(session).then(resolve).catch(reject);
13-
getExistingFinalResponse(session)
14+
getExistingFinalResponse(session, alreadyIdle)
1415
.then((msg) => {
1516
if (msg) {
1617
resolve(msg);
@@ -21,7 +22,8 @@ export async function getFinalAssistantMessage(
2122
}
2223

2324
function getExistingFinalResponse(
24-
session: CopilotSession
25+
session: CopilotSession,
26+
alreadyIdle: boolean = false
2527
): Promise<AssistantMessageEvent | undefined> {
2628
return new Promise<AssistantMessageEvent | undefined>(async (resolve, reject) => {
2729
const messages = await session.getMessages();
@@ -37,9 +39,9 @@ function getExistingFinalResponse(
3739
return;
3840
}
3941

40-
const sessionIdleMessageIndex = currentTurnMessages.findIndex(
41-
(m) => m.type === "session.idle"
42-
);
42+
const sessionIdleMessageIndex = alreadyIdle
43+
? currentTurnMessages.length
44+
: currentTurnMessages.findIndex((m) => m.type === "session.idle");
4345
if (sessionIdleMessageIndex !== -1) {
4446
const lastAssistantMessage = currentTurnMessages
4547
.slice(0, sessionIdleMessageIndex)

nodejs/test/e2e/session.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,10 @@ describe("Sessions", async () => {
231231
});
232232
expect(session2.sessionId).toBe(sessionId);
233233

234-
// TODO: There's an inconsistency here. When resuming with a new client, we don't see
235-
// the session.idle message in the history, which means we can't use getFinalAssistantMessage.
234+
// session.idle is ephemeral and not persisted, so use alreadyIdle
235+
// to find the assistant message from the completed session.
236+
const answer2 = await getFinalAssistantMessage(session2, { alreadyIdle: true });
237+
expect(answer2?.data.content).toContain("2");
236238

237239
const messages = await session2.getMessages();
238240
expect(messages).toContainEqual(expect.objectContaining({ type: "user.message" }));

python/e2e/test_session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ async def test_should_resume_a_session_using_the_same_client(self, ctx: E2ETestC
190190
session_id, on_permission_request=PermissionHandler.approve_all
191191
)
192192
assert session2.session_id == session_id
193-
answer2 = await get_final_assistant_message(session2)
193+
answer2 = await get_final_assistant_message(session2, already_idle=True)
194194
assert "2" in answer2.data.content
195195

196196
# Can continue the conversation statefully

python/e2e/testharness/helper.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from copilot import CopilotSession
99

1010

11-
async def get_final_assistant_message(session: CopilotSession, timeout: float = 10.0):
11+
async def get_final_assistant_message(session: CopilotSession, timeout: float = 10.0, already_idle: bool = False):
1212
"""
1313
Wait for and return the final assistant message from a session turn.
1414
@@ -46,7 +46,7 @@ def on_event(event):
4646

4747
try:
4848
# Also check existing messages in case the response already arrived
49-
existing = await _get_existing_final_response(session)
49+
existing = await _get_existing_final_response(session, already_idle)
5050
if existing is not None:
5151
return existing
5252

@@ -55,7 +55,7 @@ def on_event(event):
5555
unsubscribe()
5656

5757

58-
async def _get_existing_final_response(session: CopilotSession):
58+
async def _get_existing_final_response(session: CopilotSession, already_idle: bool = False):
5959
"""Check existing messages for a final response."""
6060
messages = await session.get_messages()
6161

@@ -78,11 +78,14 @@ async def _get_existing_final_response(session: CopilotSession):
7878
raise RuntimeError(err_msg)
7979

8080
# Find session.idle and get last assistant message before it
81-
session_idle_index = -1
82-
for i, msg in enumerate(current_turn_messages):
83-
if msg.type.value == "session.idle":
84-
session_idle_index = i
85-
break
81+
if already_idle:
82+
session_idle_index = len(current_turn_messages)
83+
else:
84+
session_idle_index = -1
85+
for i, msg in enumerate(current_turn_messages):
86+
if msg.type.value == "session.idle":
87+
session_idle_index = i
88+
break
8689

8790
if session_idle_index != -1:
8891
# Find last assistant.message before session.idle

0 commit comments

Comments
 (0)