diff --git a/tests/Operation/AggregateFunctionalTest.php b/tests/Operation/AggregateFunctionalTest.php index 3d1057ac9..7146ac973 100644 --- a/tests/Operation/AggregateFunctionalTest.php +++ b/tests/Operation/AggregateFunctionalTest.php @@ -13,6 +13,8 @@ use MongoDB\Tests\Fixtures\Document\TestObject; use stdClass; +use function array_key_exists; +use function array_key_first; use function current; use function iterator_to_array; @@ -182,9 +184,16 @@ public function testExplainOption(): void $this->assertCount(1, $results); + $checkResult = $results[0]; + // Sharded clusters and load balanced servers list plans per shard + if (array_key_exists('shards', $results[0])) { + $firstShard = array_key_first((array) $results[0]['shards']); + $checkResult = (array) $results[0]['shards']->$firstShard; + } + /* MongoDB 4.2 may optimize aggregate pipelines into queries, which can * result in different explain output (see: SERVER-24860) */ - $this->assertThat($results[0], $this->logicalOr( + $this->assertThat($checkResult, $this->logicalOr( $this->arrayHasKey('stages'), $this->arrayHasKey('queryPlanner'), )); diff --git a/tests/Operation/ExplainFunctionalTest.php b/tests/Operation/ExplainFunctionalTest.php index f37814486..c620dbeaf 100644 --- a/tests/Operation/ExplainFunctionalTest.php +++ b/tests/Operation/ExplainFunctionalTest.php @@ -21,6 +21,9 @@ use MongoDB\Operation\UpdateOne; use MongoDB\Tests\CommandObserver; +use function array_key_exists; +use function array_key_first; + class ExplainFunctionalTest extends FunctionalTestCase { /** @dataProvider provideVerbosityInformation */ @@ -368,21 +371,28 @@ public function provideVerbosityInformation() private function assertExplainResult($result, $executionStatsExpected, $allPlansExecutionExpected, $stagesExpected = false): void { + $checkResult = $result; + + if (array_key_exists('shards', $result)) { + $firstShard = array_key_first($result['shards']); + $checkResult = $result['shards'][$firstShard]; + } + if ($stagesExpected) { - $this->assertArrayHasKey('stages', $result); + $this->assertArrayHasKey('stages', $checkResult); } else { - $this->assertArrayHasKey('queryPlanner', $result); + $this->assertArrayHasKey('queryPlanner', $checkResult); } if ($executionStatsExpected) { - $this->assertArrayHasKey('executionStats', $result); + $this->assertArrayHasKey('executionStats', $checkResult); if ($allPlansExecutionExpected) { - $this->assertArrayHasKey('allPlansExecution', $result['executionStats']); + $this->assertArrayHasKey('allPlansExecution', $checkResult['executionStats']); } else { - $this->assertArrayNotHasKey('allPlansExecution', $result['executionStats']); + $this->assertArrayNotHasKey('allPlansExecution', $checkResult['executionStats']); } } else { - $this->assertArrayNotHasKey('executionStats', $result); + $this->assertArrayNotHasKey('executionStats', $checkResult); } }