newBridgeTestServer creates a fully configured test server running a RequestBridge with sensible defaults: - All standard providers (unless withProvider / withCustomProvider) - NoopMCPManager (unless withMCP) - slogtest debug logger - defaultTracer (unless withTracer) - defaultActorID (unless withAc
( ctx context.Context, t *testing.T, upstreamURL string, opts ...bridgeOption, )
| 132 | // - defaultTracer (unless withTracer) |
| 133 | // - defaultActorID (unless withActor) |
| 134 | func newBridgeTestServer( |
| 135 | ctx context.Context, |
| 136 | t *testing.T, |
| 137 | upstreamURL string, |
| 138 | opts ...bridgeOption, |
| 139 | ) *bridgeTestServer { |
| 140 | t.Helper() |
| 141 | |
| 142 | cfg := &bridgeConfig{ |
| 143 | userID: defaultActorID, |
| 144 | } |
| 145 | for _, o := range opts { |
| 146 | o(cfg) |
| 147 | } |
| 148 | if cfg.tracer == nil { |
| 149 | cfg.tracer = defaultTracer |
| 150 | } |
| 151 | cfg.logger = newLogger(t) |
| 152 | if cfg.mcpProxy == nil { |
| 153 | cfg.mcpProxy = newNoopMCPManager() |
| 154 | } |
| 155 | |
| 156 | // Resolve providers: use explicit builders when provided, otherwise |
| 157 | // create default providers for every supported type. |
| 158 | var providers []aibridge.Provider |
| 159 | if len(cfg.providerBuilders) > 0 { |
| 160 | for _, b := range cfg.providerBuilders { |
| 161 | providers = append(providers, b(upstreamURL)) |
| 162 | } |
| 163 | } else { |
| 164 | providers = []aibridge.Provider{ |
| 165 | newDefaultProvider(config.ProviderAnthropic, upstreamURL), |
| 166 | newDefaultProvider(config.ProviderOpenAI, upstreamURL), |
| 167 | } |
| 168 | } |
| 169 | |
| 170 | mockRec := &testutil.MockRecorder{} |
| 171 | rec := aibridge.NewRecorder(cfg.logger, cfg.tracer, func() (aibridge.Recorder, error) { |
| 172 | return mockRec, nil |
| 173 | }) |
| 174 | |
| 175 | bridge, err := aibridge.NewRequestBridge( |
| 176 | ctx, providers, rec, cfg.mcpProxy, |
| 177 | cfg.logger, cfg.metrics, cfg.tracer, |
| 178 | ) |
| 179 | require.NoError(t, err) |
| 180 | |
| 181 | actorID, md := cfg.userID, cfg.metadata |
| 182 | srv := httptest.NewUnstartedServer(bridge) |
| 183 | srv.Config.BaseContext = func(_ net.Listener) context.Context { |
| 184 | return aibcontext.AsActor(ctx, actorID, md) |
| 185 | } |
| 186 | srv.Start() |
| 187 | t.Cleanup(srv.Close) |
| 188 | |
| 189 | return &bridgeTestServer{ |
| 190 | Server: srv, |
| 191 | Recorder: mockRec, |