newMockUpstream creates a started httptest.Server that replays fixture responses. Responses are returned in order: first call → first response. The test fails if the number of requests doesn't match the number of responses (when AllowOverflow is not set, default). srv := newMockUpstream(ctx, t, ne
(ctx context.Context, t *testing.T, responses ...upstreamResponse)
| 115 | // srv := newMockUpstream(ctx, t, newFixtureResponse(fix)) // simple |
| 116 | // srv := newMockUpstream(ctx, t, newFixtureResponse(fix), newFixtureToolResponse(fix)) // multi-turn |
| 117 | func newMockUpstream(ctx context.Context, t *testing.T, responses ...upstreamResponse) *mockUpstream { |
| 118 | t.Helper() |
| 119 | require.NotEmpty(t, responses, "at least one upstreamResponse required") |
| 120 | |
| 121 | ms := &mockUpstream{ |
| 122 | t: t, |
| 123 | responses: responses, |
| 124 | } |
| 125 | |
| 126 | srv := httptest.NewUnstartedServer(http.HandlerFunc(ms.handle)) |
| 127 | srv.Config.BaseContext = func(_ net.Listener) context.Context { return ctx } |
| 128 | srv.Start() |
| 129 | |
| 130 | t.Cleanup(func() { |
| 131 | srv.Close() |
| 132 | |
| 133 | // Verify the number of requests matches expectations. |
| 134 | calls := int(ms.Calls.Load()) |
| 135 | if ms.AllowOverflow { |
| 136 | require.LessOrEqual(t, len(ms.responses), calls, "too few requests, got: %v, want at least: %v", calls, len(ms.responses)) |
| 137 | } else { |
| 138 | require.Equal(t, len(ms.responses), calls, "unexpected number of requests, got: %v, want: %v", calls, len(ms.responses)) |
| 139 | } |
| 140 | }) |
| 141 | |
| 142 | ms.Server = srv |
| 143 | return ms |
| 144 | } |
| 145 | |
| 146 | func (ms *mockUpstream) handle(w http.ResponseWriter, r *http.Request) { |
| 147 | call := int(ms.Calls.Add(1) - 1) |