connection = ConnectionManager::get('test'); $this->table = new Table([ 'table' => 'articles', 'connection' => $this->connection, ]); $this->fixtureData = [ ['id' => 1, 'author_id' => 1, 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y'], ['id' => 2, 'author_id' => 3, 'title' => 'Second Article', 'body' => 'Second Article Body', 'published' => 'Y'], ['id' => 3, 'author_id' => 1, 'title' => 'Third Article', 'body' => 'Third Article Body', 'published' => 'Y'] ]; } /** * Test that result sets can be rewound and re-used. * * @return void */ public function testRewind() { $query = $this->table->find('all'); $results = $query->all(); $first = $second = []; foreach ($results as $result) { $first[] = $result; } foreach ($results as $result) { $second[] = $result; } } /** * Test that streaming results cannot be rewound * * @return void */ public function testRewindStreaming() { $query = $this->table->find('all')->bufferResults(false); $results = $query->all(); $first = $second = []; foreach ($results as $result) { $first[] = $result; } $this->setExpectedException('Cake\Database\Exception'); foreach ($results as $result) { $second[] = $result; } } /** * An integration test for testing serialize and unserialize features. * * Compare the results of a query with the results iterated, with * those of a different query that have been serialized/unserialized. * * @return void */ public function testSerialization() { $query = $this->table->find('all'); $results = $query->all(); $expected = $results->toArray(); $query2 = $this->table->find('all'); $results2 = $query2->all(); $serialized = serialize($results2); $outcome = unserialize($serialized); $this->assertEquals($expected, $outcome->toArray()); } /** * Test iteration after serialization * * @return void */ public function testIteratorAfterSerializationNoHydration() { $query = $this->table->find('all')->hydrate(false); $results = unserialize(serialize($query->all())); // Use a loop to test Iterator implementation foreach ($results as $i => $row) { $this->assertEquals($this->fixtureData[$i], $row, "Row $i does not match"); } } /** * Test iteration after serialization * * @return void */ public function testIteratorAfterSerializationHydrated() { $query = $this->table->find('all'); $results = unserialize(serialize($query->all())); // Use a loop to test Iterator implementation foreach ($results as $i => $row) { $expected = new \Cake\ORM\Entity($this->fixtureData[$i]); $expected->isNew(false); $expected->source($this->table->alias()); $expected->clean(); $this->assertEquals($expected, $row, "Row $i does not match"); } } /** * Test converting resultsets into json * * @return void */ public function testJsonSerialize() { $query = $this->table->find('all'); $results = $query->all(); $expected = json_encode($this->fixtureData); $this->assertEquals($expected, json_encode($results)); } /** * Test first() method with a statement backed result set. * * @return void */ public function testFirst() { $query = $this->table->find('all'); $results = $query->hydrate(false)->all(); $row = $results->first(); $this->assertEquals($this->fixtureData[0], $row); $row = $results->first(); $this->assertEquals($this->fixtureData[0], $row); } /** * Test first() method with a result set that has been unserialized * * @return void */ public function testFirstAfterSerialize() { $query = $this->table->find('all'); $results = $query->hydrate(false)->all(); $results = unserialize(serialize($results)); $row = $results->first(); $this->assertEquals($this->fixtureData[0], $row); $this->assertSame($row, $results->first()); $this->assertSame($row, $results->first()); } /** * Test the countable interface. * * @return void */ public function testCount() { $query = $this->table->find('all'); $results = $query->all(); $this->assertCount(3, $results, 'Should be countable and 3'); } /** * Test the countable interface after unserialize * * @return void */ public function testCountAfterSerialize() { $query = $this->table->find('all'); $results = $query->all(); $results = unserialize(serialize($results)); $this->assertCount(3, $results, 'Should be countable and 3'); } /** * Integration test to show methods from CollectionTrait work * * @return void */ public function testGroupBy() { $query = $this->table->find('all'); $results = $query->all()->groupBy('author_id')->toArray(); $options = [ 'markNew' => false, 'markClean' => true, 'source' => $this->table->alias() ]; $expected = [ 1 => [ new Entity($this->fixtureData[0], $options), new Entity($this->fixtureData[2], $options) ], 3 => [ new Entity($this->fixtureData[1], $options), ] ]; $this->assertEquals($expected, $results); } /** * Tests __debugInfo * * @return void */ public function testDebugInfo() { $query = $this->table->find('all'); $results = $query->all(); $expected = [ 'query' => $query, 'items' => $results->toArray() ]; $this->assertSame($expected, $results->__debugInfo()); } }