@@ -172,6 +172,61 @@ func TestResolveUserQuestionSkip(t *testing.T) {
172172 }
173173}
174174
175+ func TestResolveUserQuestionDefaultsStatusAndTrimsMessage (t * testing.T ) {
176+ t .Parallel ()
177+
178+ service := NewWithFactory (
179+ newRuntimeConfigManager (t ),
180+ & stubToolManager {},
181+ newMemoryStore (),
182+ & scriptedProviderFactory {provider : & scriptedProvider {}},
183+ nil ,
184+ )
185+
186+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
187+ defer cancel ()
188+
189+ var openResult askuser.Result
190+ var openErr error
191+
192+ var wg sync.WaitGroup
193+ wg .Add (1 )
194+ go func () {
195+ defer wg .Done ()
196+ _ , openResult , openErr = service .askUserBroker .Open (ctx , askuser.Request {
197+ QuestionID : "q1" ,
198+ TimeoutSec : 10 ,
199+ })
200+ }()
201+
202+ time .Sleep (50 * time .Millisecond )
203+
204+ ids := service .askUserBroker .PendingIDs ()
205+ if len (ids ) != 1 {
206+ t .Fatalf ("expected 1 pending request, got %d" , len (ids ))
207+ }
208+
209+ resolveErr := service .ResolveUserQuestion (context .Background (), UserQuestionResolutionInput {
210+ RequestID : ids [0 ],
211+ Message : " keep this trimmed " ,
212+ })
213+ if resolveErr != nil {
214+ t .Fatalf ("ResolveUserQuestion default status error: %v" , resolveErr )
215+ }
216+
217+ wg .Wait ()
218+
219+ if openErr != nil {
220+ t .Fatalf ("broker Open error: %v" , openErr )
221+ }
222+ if openResult .Status != askuser .StatusAnswered {
223+ t .Fatalf ("expected default answered status, got %q" , openResult .Status )
224+ }
225+ if openResult .Message != "keep this trimmed" {
226+ t .Fatalf ("expected trimmed message, got %q" , openResult .Message )
227+ }
228+ }
229+
175230func TestResolveUserQuestionContextCanceled (t * testing.T ) {
176231 t .Parallel ()
177232
@@ -195,6 +250,24 @@ func TestResolveUserQuestionContextCanceled(t *testing.T) {
195250 }
196251}
197252
253+ func TestEventTypeFromAskUserEvent (t * testing.T ) {
254+ t .Parallel ()
255+
256+ tests := map [string ]EventType {
257+ "user_question_requested" : EventUserQuestionRequested ,
258+ "user_question_answered" : EventUserQuestionAnswered ,
259+ "user_question_skipped" : EventUserQuestionSkipped ,
260+ "user_question_timeout" : EventUserQuestionTimeout ,
261+ "unknown" : EventError ,
262+ }
263+
264+ for name , want := range tests {
265+ if got := eventTypeFromAskUserEvent (name ); got != want {
266+ t .Fatalf ("eventTypeFromAskUserEvent(%q) = %q, want %q" , name , got , want )
267+ }
268+ }
269+ }
270+
198271func TestAskUserBrokerAdapterConversion (t * testing.T ) {
199272 t .Parallel ()
200273
@@ -255,3 +328,38 @@ func TestAskUserBrokerAdapterConversion(t *testing.T) {
255328
256329 wg .Wait ()
257330}
331+
332+ func TestAskUserBrokerAdapterErrorAndOptionConversion (t * testing.T ) {
333+ t .Parallel ()
334+
335+ broker := askuser .NewBroker ()
336+ adapter := newAskUserBrokerAdapter (broker )
337+
338+ if got := convertAskUserOptions (nil ); got != nil {
339+ t .Fatalf ("expected nil options conversion, got %#v" , got )
340+ }
341+
342+ ctx , cancel := context .WithCancel (context .Background ())
343+ cancel ()
344+
345+ requestID , result , err := adapter .Open (ctx , tools.AskUserRequest {
346+ QuestionID : "adapter-q2" ,
347+ Title : "Choose" ,
348+ Kind : "single_choice" ,
349+ Options : []tools.AskUserOption {
350+ {Label : "A" , Description : "first" },
351+ },
352+ })
353+ if err == nil {
354+ t .Fatal ("expected adapter Open error when context is canceled" )
355+ }
356+ if ! strings .Contains (err .Error (), "canceled" ) {
357+ t .Fatalf ("expected canceled error, got %v" , err )
358+ }
359+ if requestID == "" {
360+ t .Fatal ("expected generated request_id on canceled adapter Open" )
361+ }
362+ if result .Status != askuser .StatusTimeout {
363+ t .Fatalf ("expected timeout status on canceled adapter Open, got %q" , result .Status )
364+ }
365+ }
0 commit comments