Skip to content

Commit 3e50b7e

Browse files
committed
PHPLIB-530: Sort MapReduce results before comparing
With MR being moved to aggregation, result order can sometimes be different than expected. This adds a sort function before assertions to avoid test failures due to sorting.
1 parent 342ff3f commit 3e50b7e

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

tests/Operation/MapReduceFunctionalTest.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
use MongoDB\Operation\Find;
1010
use MongoDB\Operation\MapReduce;
1111
use MongoDB\Tests\CommandObserver;
12+
use function is_object;
1213
use function iterator_to_array;
14+
use function usort;
1315
use function version_compare;
1416

1517
class MapReduceFunctionalTest extends FunctionalTestCase
@@ -237,7 +239,7 @@ public function testTypeMapOptionWithInlineResults(array $typeMap = null, array
237239
$operation = new MapReduce($this->getDatabaseName(), $this->getCollectionName(), $map, $reduce, $out, ['typeMap' => $typeMap]);
238240
$results = iterator_to_array($operation->execute($this->getPrimaryServer()));
239241

240-
$this->assertEquals($expectedDocuments, $results);
242+
$this->assertEquals($this->sortResults($expectedDocuments), $this->sortResults($results));
241243
}
242244

243245
public function provideTypeMapOptionsAndExpectedDocuments()
@@ -284,12 +286,12 @@ public function testTypeMapOptionWithOutputCollection(array $typeMap = null, arr
284286
$operation = new MapReduce($this->getDatabaseName(), $this->getCollectionName(), $map, $reduce, $out, ['typeMap' => $typeMap]);
285287
$results = iterator_to_array($operation->execute($this->getPrimaryServer()));
286288

287-
$this->assertEquals($expectedDocuments, $results);
289+
$this->assertEquals($this->sortResults($expectedDocuments), $this->sortResults($results));
288290

289291
$operation = new Find($this->getDatabaseName(), $out, [], ['typeMap' => $typeMap]);
290292
$cursor = $operation->execute($this->getPrimaryServer());
291293

292-
$this->assertEquals($expectedDocuments, iterator_to_array($cursor));
294+
$this->assertEquals($this->sortResults($expectedDocuments), $this->sortResults(iterator_to_array($cursor)));
293295

294296
$operation = new DropCollection($this->getDatabaseName(), $out);
295297
$operation->execute($this->getPrimaryServer());
@@ -313,4 +315,19 @@ private function createFixtures($n)
313315

314316
$this->assertEquals($n * 2, $result->getInsertedCount());
315317
}
318+
319+
private function sortResults(array $results) : array
320+
{
321+
$sortFunction = static function ($resultA, $resultB) : int {
322+
$idA = is_object($resultA) ? $resultA->_id : $resultA['_id'];
323+
$idB = is_object($resultB) ? $resultB->_id : $resultB['_id'];
324+
325+
return $idA <=> $idB;
326+
};
327+
328+
$sortedResults = $results;
329+
usort($sortedResults, $sortFunction);
330+
331+
return $sortedResults;
332+
}
316333
}

0 commit comments

Comments
 (0)