@@ -280,7 +280,7 @@ public function testFullModeRejectsBlockedProxyLikeMethodBySplitSelector(): void
280280 );
281281 }
282282
283- public function testFullModeAttemptsMutatingMethodCall (): void
283+ public function testFullModeReturnsDetailedValidationErrorForAddUser (): void
284284 {
285285 McpTestHelper::setRawApiAccessMode ('full ' );
286286
@@ -295,17 +295,33 @@ public function testFullModeAttemptsMutatingMethodCall(): void
295295 );
296296
297297 McpTestHelper::assertToolError ($ result );
298- $ content = $ result ->content [0 ] ?? null ;
299- self ::assertInstanceOf (\Matomo \Dependencies \McpServer \Mcp \Schema \Content \TextContent::class, $ content );
300- $ errorText = $ content ->text ;
301- self ::assertIsString ($ errorText );
302- self ::assertTrue (
303- $ errorText === 'Matomo API request failed. '
304- || str_starts_with ($ errorText , 'Matomo API request failed: ' ),
298+ $ this ->assertIsDetailedMissingParameterError ($ result );
299+ }
300+
301+ public function testFullModeSuppressesNestedSegmentValidationError (): void
302+ {
303+ McpTestHelper::setRawApiAccessMode ('full ' );
304+
305+ $ server = McpTestHelper::buildServer ();
306+ $ sessionId = McpTestHelper::initializeSession ($ server );
307+ McpTestHelper::callToolAndAssertError (
308+ $ server ,
309+ $ sessionId ,
310+ ApiCallFull::TOOL_NAME ,
311+ [
312+ 'method ' => 'SegmentEditor.add ' ,
313+ 'parameters ' => [
314+ 'name ' => 'Broken Segment ' ,
315+ 'definition ' => 'invalidSegmentDefinition==value ' ,
316+ 'idSite ' => $ this ->idSite ,
317+ ],
318+ ],
319+ 'Matomo API request failed. ' ,
320+ __METHOD__ ,
305321 );
306322 }
307323
308- public function testCreateModeAttemptsCreateMethodCall (): void
324+ public function testCreateModeReturnsDetailedValidationErrorForAddUser (): void
309325 {
310326 McpTestHelper::setRawApiAccessMode ('create ' );
311327
@@ -320,11 +336,10 @@ public function testCreateModeAttemptsCreateMethodCall(): void
320336 );
321337
322338 McpTestHelper::assertToolError ($ result );
323- $ content = $ result ->content [0 ] ?? null ;
324- self ::assertInstanceOf (\Matomo \Dependencies \McpServer \Mcp \Schema \Content \TextContent::class, $ content );
339+ $ this ->assertIsDetailedMissingParameterError ($ result );
325340 }
326341
327- public function testDeleteModeAttemptsDeleteMethodCall (): void
342+ public function testDeleteModeReturnsDetailedValidationErrorForDeleteSite (): void
328343 {
329344 McpTestHelper::setRawApiAccessMode ('delete ' );
330345
@@ -339,17 +354,10 @@ public function testDeleteModeAttemptsDeleteMethodCall(): void
339354 );
340355
341356 McpTestHelper::assertToolError ($ result );
342- $ content = $ result ->content [0 ] ?? null ;
343- self ::assertInstanceOf (\Matomo \Dependencies \McpServer \Mcp \Schema \Content \TextContent::class, $ content );
344- $ errorText = $ content ->text ;
345- self ::assertIsString ($ errorText );
346- self ::assertTrue (
347- $ errorText === 'Matomo API request failed. '
348- || str_starts_with ($ errorText , 'Matomo API request failed: ' ),
349- );
357+ $ this ->assertIsDetailedMissingParameterError ($ result );
350358 }
351359
352- public function testUpdateModeAttemptsUpdateMethodCall (): void
360+ public function testUpdateModeReturnsDetailedValidationErrorForUpdateUser (): void
353361 {
354362 McpTestHelper::setRawApiAccessMode ('update ' );
355363
@@ -364,14 +372,7 @@ public function testUpdateModeAttemptsUpdateMethodCall(): void
364372 );
365373
366374 McpTestHelper::assertToolError ($ result );
367- $ content = $ result ->content [0 ] ?? null ;
368- self ::assertInstanceOf (\Matomo \Dependencies \McpServer \Mcp \Schema \Content \TextContent::class, $ content );
369- $ errorText = $ content ->text ;
370- self ::assertIsString ($ errorText );
371- self ::assertTrue (
372- $ errorText === 'Matomo API request failed. '
373- || str_starts_with ($ errorText , 'Matomo API request failed: ' ),
374- );
375+ $ this ->assertIsDetailedMissingParameterError ($ result );
375376 }
376377
377378 public function testRejectsReservedParameterKeys (): void
@@ -530,4 +531,14 @@ private function listToolNamesForCurrentConfig(): array
530531
531532 return array_values (array_map (static fn ($ tool ) => $ tool ->name , $ result ->tools ));
532533 }
534+
535+ private function assertIsDetailedMissingParameterError (
536+ \Matomo \Dependencies \McpServer \Mcp \Schema \Result \CallToolResult $ result ,
537+ ): void {
538+ $ content = $ result ->content [0 ] ?? null ;
539+ self ::assertInstanceOf (\Matomo \Dependencies \McpServer \Mcp \Schema \Content \TextContent::class, $ content );
540+ self ::assertIsString ($ content ->text );
541+ self ::assertStringStartsWith ('Matomo API request failed: ' , $ content ->text );
542+ self ::assertStringContainsString ('General_PleaseSpecifyValue ' , $ content ->text );
543+ }
533544}
0 commit comments