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.
parent c9b4f244
...@@ -9,7 +9,9 @@ use MongoDB\Operation\DropCollection; ...@@ -9,7 +9,9 @@ use MongoDB\Operation\DropCollection;
use MongoDB\Operation\Find; use MongoDB\Operation\Find;
use MongoDB\Operation\MapReduce; use MongoDB\Operation\MapReduce;
use MongoDB\Tests\CommandObserver; use MongoDB\Tests\CommandObserver;
use function is_object;
use function iterator_to_array; use function iterator_to_array;
use function usort;
use function version_compare; use function version_compare;
class MapReduceFunctionalTest extends FunctionalTestCase class MapReduceFunctionalTest extends FunctionalTestCase
...@@ -237,7 +239,7 @@ class MapReduceFunctionalTest extends FunctionalTestCase ...@@ -237,7 +239,7 @@ class MapReduceFunctionalTest extends FunctionalTestCase
$operation = new MapReduce($this->getDatabaseName(), $this->getCollectionName(), $map, $reduce, $out, ['typeMap' => $typeMap]); $operation = new MapReduce($this->getDatabaseName(), $this->getCollectionName(), $map, $reduce, $out, ['typeMap' => $typeMap]);
$results = iterator_to_array($operation->execute($this->getPrimaryServer())); $results = iterator_to_array($operation->execute($this->getPrimaryServer()));
$this->assertEquals($expectedDocuments, $results); $this->assertEquals($this->sortResults($expectedDocuments), $this->sortResults($results));
} }
public function provideTypeMapOptionsAndExpectedDocuments() public function provideTypeMapOptionsAndExpectedDocuments()
...@@ -284,12 +286,12 @@ class MapReduceFunctionalTest extends FunctionalTestCase ...@@ -284,12 +286,12 @@ class MapReduceFunctionalTest extends FunctionalTestCase
$operation = new MapReduce($this->getDatabaseName(), $this->getCollectionName(), $map, $reduce, $out, ['typeMap' => $typeMap]); $operation = new MapReduce($this->getDatabaseName(), $this->getCollectionName(), $map, $reduce, $out, ['typeMap' => $typeMap]);
$results = iterator_to_array($operation->execute($this->getPrimaryServer())); $results = iterator_to_array($operation->execute($this->getPrimaryServer()));
$this->assertEquals($expectedDocuments, $results); $this->assertEquals($this->sortResults($expectedDocuments), $this->sortResults($results));
$operation = new Find($this->getDatabaseName(), $out, [], ['typeMap' => $typeMap]); $operation = new Find($this->getDatabaseName(), $out, [], ['typeMap' => $typeMap]);
$cursor = $operation->execute($this->getPrimaryServer()); $cursor = $operation->execute($this->getPrimaryServer());
$this->assertEquals($expectedDocuments, iterator_to_array($cursor)); $this->assertEquals($this->sortResults($expectedDocuments), $this->sortResults(iterator_to_array($cursor)));
$operation = new DropCollection($this->getDatabaseName(), $out); $operation = new DropCollection($this->getDatabaseName(), $out);
$operation->execute($this->getPrimaryServer()); $operation->execute($this->getPrimaryServer());
...@@ -313,4 +315,19 @@ class MapReduceFunctionalTest extends FunctionalTestCase ...@@ -313,4 +315,19 @@ class MapReduceFunctionalTest extends FunctionalTestCase
$this->assertEquals($n * 2, $result->getInsertedCount()); $this->assertEquals($n * 2, $result->getInsertedCount());
} }
private function sortResults(array $results) : array
{
$sortFunction = static function ($resultA, $resultB) : int {
$idA = is_object($resultA) ? $resultA->_id : $resultA['_id'];
$idB = is_object($resultB) ? $resultB->_id : $resultB['_id'];
return $idA <=> $idB;
};
$sortedResults = $results;
usort($sortedResults, $sortFunction);
return $sortedResults;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment