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;
use MongoDB\Operation\Find;
use MongoDB\Operation\MapReduce;
use MongoDB\Tests\CommandObserver;
use function is_object;
use function iterator_to_array;
use function usort;
use function version_compare;
class MapReduceFunctionalTest extends FunctionalTestCase
......@@ -237,7 +239,7 @@ class MapReduceFunctionalTest extends FunctionalTestCase
$operation = new MapReduce($this->getDatabaseName(), $this->getCollectionName(), $map, $reduce, $out, ['typeMap' => $typeMap]);
$results = iterator_to_array($operation->execute($this->getPrimaryServer()));
$this->assertEquals($expectedDocuments, $results);
$this->assertEquals($this->sortResults($expectedDocuments), $this->sortResults($results));
}
public function provideTypeMapOptionsAndExpectedDocuments()
......@@ -284,12 +286,12 @@ class MapReduceFunctionalTest extends FunctionalTestCase
$operation = new MapReduce($this->getDatabaseName(), $this->getCollectionName(), $map, $reduce, $out, ['typeMap' => $typeMap]);
$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]);
$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->execute($this->getPrimaryServer());
......@@ -313,4 +315,19 @@ class MapReduceFunctionalTest extends FunctionalTestCase
$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