@@ -80,12 +80,12 @@ public function addResponses(array $responses): void
8080 /**
8181 * Add a mock response to the client
8282 *
83- * @param MockResponse $response
83+ * @param MockResponse|callable $response
8484 * @param string|null $captureMethod
8585 * @return void
8686 * @throws SaloonInvalidMockResponseCaptureMethodException
8787 */
88- public function addResponse (MockResponse $ response , ?string $ captureMethod = null ): void
88+ public function addResponse (MockResponse | callable $ response , ?string $ captureMethod = null ): void
8989 {
9090 if (is_null ($ captureMethod )) {
9191 $ this ->sequenceResponses [] = $ response ;
@@ -144,26 +144,26 @@ public function guessNextResponse(SaloonRequest $request): MockResponse
144144 $ requestClass = get_class ($ request );
145145
146146 if (array_key_exists ($ requestClass , $ this ->requestResponses )) {
147- return $ this ->requestResponses [$ requestClass ];
147+ return $ this ->mockResponseValue ( $ this -> requestResponses [$ requestClass ], $ request ) ;
148148 }
149149
150150 $ connectorClass = get_class ($ request ->getConnector ());
151151
152152 if (array_key_exists ($ connectorClass , $ this ->connectorResponses )) {
153- return $ this ->connectorResponses [$ connectorClass ];
153+ return $ this ->mockResponseValue ( $ this -> connectorResponses [$ connectorClass ], $ request ) ;
154154 }
155155
156156 $ guessedResponse = $ this ->guessResponseFromUrl ($ request );
157157
158158 if (! is_null ($ guessedResponse )) {
159- return $ guessedResponse ;
159+ return $ this -> mockResponseValue ( $ guessedResponse, $ request ) ;
160160 }
161161
162162 if (empty ($ this ->sequenceResponses )) {
163163 throw new SaloonNoMockResponseFoundException ;
164164 }
165165
166- return $ this ->getNextFromSequence ();
166+ return $ this ->mockResponseValue ( $ this -> getNextFromSequence (), $ request );
167167 }
168168
169169 /**
@@ -173,7 +173,7 @@ public function guessNextResponse(SaloonRequest $request): MockResponse
173173 * @return MockResponse|null
174174 * @throws \Sammyjo20\Saloon\Exceptions\SaloonInvalidConnectorException
175175 */
176- private function guessResponseFromUrl (SaloonRequest $ request ): ? MockResponse
176+ private function guessResponseFromUrl (SaloonRequest $ request ): MockResponse | callable | null
177177 {
178178 foreach ($ this ->urlResponses as $ url => $ response ) {
179179 if (! URLHelper::matches ($ url , $ request ->getFullRequestUrl ())) {
@@ -456,4 +456,20 @@ private function checkHistoryEmpty(): bool
456456 {
457457 return count ($ this ->recordedResponses ) <= 0 ;
458458 }
459+
460+ /**
461+ * Create the mock response. If it is a callable, we will call it.
462+ *
463+ * @param MockResponse|callable $mockResponse
464+ * @param SaloonRequest $request
465+ * @return MockResponse
466+ */
467+ private function mockResponseValue (MockResponse |callable $ mockResponse , SaloonRequest $ request ): MockResponse
468+ {
469+ if ($ mockResponse instanceof MockResponse) {
470+ return $ mockResponse ;
471+ }
472+
473+ return $ mockResponse ($ request );
474+ }
459475}
0 commit comments