package promptkit_test import ( "context" "errors" "testing" "testing/synctest" "time" "go.maximumdirect.net/promptkit" ) func TestRunOperationTimeoutAttribution(t *testing.T) { synctest.Test(t, func(t *testing.T) { engine := observationEngine(t, observationClientFunc(func(ctx context.Context, _ promptkit.GenerateRequest) (*promptkit.GenerateResponse, error) { <-ctx.Done() return nil, ctx.Err() })) var terminal promptkit.ExecutionEvent _, err := engine.Run(context.Background(), promptkit.RunRequest{PromptID: "prompt", OperationTimeout: time.Second, Observer: func(event promptkit.ExecutionEvent) { if event.Kind == promptkit.ExecutionFinished { terminal = event } }}) if !errors.Is(err, promptkit.ErrOperationTimeout) || !errors.Is(err, context.DeadlineExceeded) || !errors.Is(err, promptkit.ErrLLMGenerate) || terminal.Failure != promptkit.ExecutionFailureDeadline { t.Fatalf("error=%v terminal=%+v", err, terminal) } }) } func TestRunProviderDeadlineIsNotOperationTimeout(t *testing.T) { engine := observationEngine(t, observationClientFunc(func(context.Context, promptkit.GenerateRequest) (*promptkit.GenerateResponse, error) { return nil, context.DeadlineExceeded })) _, err := engine.Run(context.Background(), promptkit.RunRequest{PromptID: "prompt", OperationTimeout: time.Minute}) if !errors.Is(err, context.DeadlineExceeded) || errors.Is(err, promptkit.ErrOperationTimeout) { t.Fatalf("provider deadline attribution: %v", err) } }