Commit 0437bb85 authored by Jeremy Mikola's avatar Jeremy Mikola

Make expected document assertions more flexible

Normalizing top-level documents as arrays will allow single and multi-document checks to be more flexible. This will not extend to embedded documents, where we'll still need to be explicit.

Additionally, assertSameDocuments can now operate on any array or Traversable without needing to set its own type map.
parent 82de6ec1
...@@ -32,12 +32,11 @@ class AggregateFunctionalTest extends FunctionalTestCase ...@@ -32,12 +32,11 @@ class AggregateFunctionalTest extends FunctionalTestCase
); );
$expected = array( $expected = array(
(object) array('_id' => 2, 'x' => 22), array('_id' => 2, 'x' => 22),
(object) array('_id' => 3, 'x' => 33), array('_id' => 3, 'x' => 33),
); );
// Use iterator_to_array() here since aggregate() may return an ArrayIterator $this->assertSameDocuments($expected, $cursor);
$this->assertEquals($expected, iterator_to_array($cursor));
} }
public function testAggregateWithOut() public function testAggregateWithOut()
......
...@@ -25,7 +25,7 @@ class FindOneAndDeleteFunctionalTest extends FunctionalTestCase ...@@ -25,7 +25,7 @@ class FindOneAndDeleteFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndDelete($filter, $options); $document = $this->collection->findOneAndDelete($filter, $options);
$this->assertEquals((object) array('x' => 22), $document); $this->assertSameDocument(array('x' => 22), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -44,7 +44,7 @@ class FindOneAndDeleteFunctionalTest extends FunctionalTestCase ...@@ -44,7 +44,7 @@ class FindOneAndDeleteFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndDelete($filter, $options); $document = $this->collection->findOneAndDelete($filter, $options);
$this->assertEquals((object) array('x' => 22), $document); $this->assertSameDocument(array('x' => 22), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
......
...@@ -29,7 +29,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase ...@@ -29,7 +29,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndReplace($filter, $replacement, $options); $document = $this->collection->findOneAndReplace($filter, $replacement, $options);
$this->assertEquals((object) array('x' => 22), $document); $this->assertSameDocument(array('x' => 22), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -51,7 +51,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase ...@@ -51,7 +51,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndReplace($filter, $replacement, $options); $document = $this->collection->findOneAndReplace($filter, $replacement, $options);
$this->assertEquals((object) array('x' => 32), $document); $this->assertSameDocument(array('x' => 32), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -72,7 +72,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase ...@@ -72,7 +72,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndReplace($filter, $replacement, $options); $document = $this->collection->findOneAndReplace($filter, $replacement, $options);
$this->assertEquals((object) array('x' => 22), $document); $this->assertSameDocument(array('x' => 22), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -94,7 +94,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase ...@@ -94,7 +94,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndReplace($filter, $replacement, $options); $document = $this->collection->findOneAndReplace($filter, $replacement, $options);
$this->assertEquals((object) array('x' => 32), $document); $this->assertSameDocument(array('x' => 32), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -185,7 +185,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase ...@@ -185,7 +185,7 @@ class FindOneAndReplaceFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndReplace($filter, $replacement, $options); $document = $this->collection->findOneAndReplace($filter, $replacement, $options);
$this->assertEquals((object) array('x' => 44), $document); $this->assertSameDocument(array('x' => 44), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
......
...@@ -29,7 +29,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase ...@@ -29,7 +29,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndUpdate($filter, $update, $options); $document = $this->collection->findOneAndUpdate($filter, $update, $options);
$this->assertEquals((object) array('x' => 22), $document); $this->assertSameDocument(array('x' => 22), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -51,7 +51,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase ...@@ -51,7 +51,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndUpdate($filter, $update, $options); $document = $this->collection->findOneAndUpdate($filter, $update, $options);
$this->assertEquals((object) array('x' => 23), $document); $this->assertSameDocument(array('x' => 23), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -72,7 +72,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase ...@@ -72,7 +72,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndUpdate($filter, $update, $options); $document = $this->collection->findOneAndUpdate($filter, $update, $options);
$this->assertEquals((object) array('x' => 22), $document); $this->assertSameDocument(array('x' => 22), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -94,7 +94,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase ...@@ -94,7 +94,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndUpdate($filter, $update, $options); $document = $this->collection->findOneAndUpdate($filter, $update, $options);
$this->assertEquals((object) array('x' => 23), $document); $this->assertSameDocument(array('x' => 23), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
...@@ -183,7 +183,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase ...@@ -183,7 +183,7 @@ class FindOneAndUpdateFunctionalTest extends FunctionalTestCase
); );
$document = $this->collection->findOneAndUpdate($filter, $update, $options); $document = $this->collection->findOneAndUpdate($filter, $update, $options);
$this->assertEquals((object) array('x' => 1), $document); $this->assertSameDocument(array('x' => 1), $document);
$expected = array( $expected = array(
array('_id' => 1, 'x' => 11), array('_id' => 1, 'x' => 11),
......
...@@ -6,6 +6,8 @@ use MongoDB\Driver\Command; ...@@ -6,6 +6,8 @@ use MongoDB\Driver\Command;
use MongoDB\Driver\Cursor; use MongoDB\Driver\Cursor;
use MongoDB\Driver\Manager; use MongoDB\Driver\Manager;
use MongoDB\Driver\ReadPreference; use MongoDB\Driver\ReadPreference;
use stdClass;
use Traversable;
abstract class FunctionalTestCase extends TestCase abstract class FunctionalTestCase extends TestCase
{ {
...@@ -38,10 +40,32 @@ abstract class FunctionalTestCase extends TestCase ...@@ -38,10 +40,32 @@ abstract class FunctionalTestCase extends TestCase
$this->assertEquals(1, $document['ok']); $this->assertEquals(1, $document['ok']);
} }
protected function assertSameDocuments(array $expected, $cursor) protected function assertSameDocument($expectedDocument, $actualDocument)
{ {
$cursor->setTypeMap(array('document' => 'array')); $this->assertEquals(
$this->assertEquals($expected, iterator_to_array($cursor)); ($expectedDocument instanceof stdClass) ? (array) $expectedDocument : $expectedDocument,
($actualDocument instanceof stdClass) ? (array) $actualDocument : $actualDocument
);
}
protected function assertSameDocuments(array $expectedDocuments, $actualDocuments)
{
if ($actualDocuments instanceof Traversable) {
$actualDocuments = iterator_to_array($actualDocuments);
}
if ( ! is_array($actualDocuments)) {
throw new InvalidArgumentException('$actualDocuments is not an array or Traversable');
}
$normalizeRootDocuments = function($document) {
return ($document instanceof stdClass) ? (array) $document : $document;
};
$this->assertEquals(
array_map($normalizeRootDocuments, $expectedDocuments),
array_map($normalizeRootDocuments, $actualDocuments)
);
} }
protected function getServerVersion(ReadPreference $readPreference = null) protected function getServerVersion(ReadPreference $readPreference = null)
......
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