diff options
Diffstat (limited to 'tests/Unit/Db')
-rw-r--r-- | tests/Unit/Db/FolderMapperTest.php | 228 | ||||
-rw-r--r-- | tests/Unit/Db/MapperTestUtility.php | 202 |
2 files changed, 220 insertions, 210 deletions
diff --git a/tests/Unit/Db/FolderMapperTest.php b/tests/Unit/Db/FolderMapperTest.php index deb235ff7..803c84ebe 100644 --- a/tests/Unit/Db/FolderMapperTest.php +++ b/tests/Unit/Db/FolderMapperTest.php @@ -50,21 +50,40 @@ class FolderMapperTest extends MapperTestUtility ]; } - + /** + * @covers \OCA\News\Db\FolderMapper::find + */ public function testFind() { $userId = 'john'; $id = 3; - $rows = [['id' => $this->folders[0]->getId()]]; $sql = 'SELECT * FROM `*PREFIX*news_folders` ' . 'WHERE `id` = ? ' . 'AND `user_id` = ?'; - $this->setMapperResult($sql, [$id, $userId], $rows); + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(2)) + ->method('fetch') + ->willReturnOnConsecutiveCalls(['id' => 4], false); + + $this->query->expects($this->exactly(2)) + ->method('bindValue') + ->withConsecutive([1, 3, 1], [2, $userId, 2]); + + $this->query->expects($this->exactly(1)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->with('') + ->will($this->returnValue([])); $result = $this->folderMapper->find($userId, $id); $this->assertEquals($this->folders[0], $result); - } @@ -76,7 +95,26 @@ class FolderMapperTest extends MapperTestUtility 'WHERE `id` = ? ' . 'AND `user_id` = ?'; - $this->setMapperResult($sql, [$id, $userId]); + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(1)) + ->method('fetch') + ->willReturnOnConsecutiveCalls(false); + + $this->query->expects($this->exactly(2)) + ->method('bindValue') + ->withConsecutive([1, $id, 1], [2, $userId, 2]); + + $this->query->expects($this->exactly(1)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->with('') + ->will($this->returnValue([])); $this->expectException(DoesNotExistException::class); $this->folderMapper->find($userId, $id); @@ -87,12 +125,30 @@ class FolderMapperTest extends MapperTestUtility { $userId = 'john'; $id = 3; - $rows = $this->twoRows; $sql = 'SELECT * FROM `*PREFIX*news_folders` ' . 'WHERE `id` = ? ' . 'AND `user_id` = ?'; - $this->setMapperResult($sql, [$id, $userId], $rows); + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(2)) + ->method('fetch') + ->willReturnOnConsecutiveCalls(['id' => 4], ['id' => 5]); + + $this->query->expects($this->exactly(2)) + ->method('bindValue') + ->withConsecutive([1, 3, 1], [2, $userId, 2]); + + $this->query->expects($this->exactly(1)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->with('') + ->will($this->returnValue([])); $this->expectException(MultipleObjectsReturnedException::class); $this->folderMapper->find($userId, $id); @@ -103,12 +159,29 @@ class FolderMapperTest extends MapperTestUtility public function testFindAllFromUser() { $userId = 'john'; - $rows = $this->twoRows; $sql = 'SELECT * FROM `*PREFIX*news_folders` ' . 'WHERE `user_id` = ? ' . 'AND `deleted_at` = 0'; - $this->setMapperResult($sql, [$userId], $rows); + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(3)) + ->method('fetch') + ->willReturnOnConsecutiveCalls(['id' => 4], ['id' => 5]); + + $this->query->expects($this->exactly(1)) + ->method('bindValue') + ->withConsecutive([1, $userId, 2]); + + $this->query->expects($this->exactly(1)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->will($this->returnValue([])); $result = $this->folderMapper->findAllFromUser($userId); $this->assertEquals($this->folders, $result); @@ -119,12 +192,29 @@ class FolderMapperTest extends MapperTestUtility { $folderName = 'heheh'; $userId = 'john'; - $rows = $this->twoRows; $sql = 'SELECT * FROM `*PREFIX*news_folders` ' . 'WHERE `name` = ? ' . 'AND `user_id` = ?'; - $this->setMapperResult($sql, [$folderName, $userId], $rows); + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(3)) + ->method('fetch') + ->willReturnOnConsecutiveCalls(['id' => 4], ['id' => 5]); + + $this->query->expects($this->exactly(2)) + ->method('bindValue') + ->withConsecutive([1, $folderName, 2], [2, $userId, 2]); + + $this->query->expects($this->exactly(1)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->will($this->returnValue([])); $result = $this->folderMapper->findByName($folderName, $userId); $this->assertEquals($this->folders, $result); @@ -145,9 +235,25 @@ class FolderMapperTest extends MapperTestUtility $sql3 = 'DELETE FROM `*PREFIX*news_items` WHERE `feed_id` NOT IN '. '(SELECT `feeds`.`id` FROM `*PREFIX*news_feeds` `feeds`)'; - $this->setMapperResult($sql, $arguments, [], null, null, true); - $this->setMapperResult($sql2, $arguments2, [], null, null, true); - $this->setMapperResult($sql3, [], [], null, null, true); + $this->db->expects($this->exactly(3)) + ->method('prepare') + ->withConsecutive( + [$sql, null, null], + [$sql2, null, null], + [$sql3, null, null] + ) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(2)) + ->method('bindValue') + ->withConsecutive([1, 3, 1]); + + $this->query->expects($this->exactly(3)) + ->method('closeCursor'); + + $this->query->expects($this->exactly(3)) + ->method('execute') + ->will($this->returnValue([])); $this->folderMapper->delete($folder); } @@ -155,13 +261,32 @@ class FolderMapperTest extends MapperTestUtility public function testGetPurgeDeleted() { - $rows = $this->twoRows; - $deleteOlderThan = 110; $sql = 'SELECT * FROM `*PREFIX*news_folders` ' . 'WHERE `deleted_at` > 0 ' . 'AND `deleted_at` < ? '; - $this->setMapperResult($sql, [$deleteOlderThan], $rows); - $result = $this->folderMapper->getToDelete($deleteOlderThan); + + + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(3)) + ->method('fetch') + ->willReturnOnConsecutiveCalls(['id' => 4], ['id' => 5]); + + $this->query->expects($this->exactly(1)) + ->method('bindValue') + ->withConsecutive([1, 110, 1]); + + $this->query->expects($this->exactly(1)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->will($this->returnValue([])); + + $result = $this->folderMapper->getToDelete(110); $this->assertEquals($this->folders, $result); } @@ -170,13 +295,33 @@ class FolderMapperTest extends MapperTestUtility public function testGetPurgeDeletedUser() { - $rows = $this->twoRows; $deleteOlderThan = 110; $sql = 'SELECT * FROM `*PREFIX*news_folders` ' . 'WHERE `deleted_at` > 0 ' . 'AND `deleted_at` < ? ' . 'AND `user_id` = ?'; - $this->setMapperResult($sql, [$deleteOlderThan, $this->user], $rows); + + + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(3)) + ->method('fetch') + ->willReturnOnConsecutiveCalls(['id' => 4], ['id' => 5]); + + $this->query->expects($this->exactly(2)) + ->method('bindValue') + ->withConsecutive([1, 110, 1], [2, 'hh', 2]); + + $this->query->expects($this->exactly(1)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->will($this->returnValue([])); + $result = $this->folderMapper->getToDelete( $deleteOlderThan, $this->user ); @@ -187,12 +332,30 @@ class FolderMapperTest extends MapperTestUtility public function testGetAllPurgeDeletedUser() { - $rows = $this->twoRows; - $sql = 'SELECT * FROM `*PREFIX*news_folders` ' . 'WHERE `deleted_at` > 0 ' . 'AND `user_id` = ?'; - $this->setMapperResult($sql, [$this->user], $rows); + + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->exactly(3)) + ->method('fetch') + ->willReturnOnConsecutiveCalls(['id' => 4], ['id' => 5]); + + $this->query->expects($this->exactly(1)) + ->method('bindValue') + ->withConsecutive([1, 'hh', 2]); + + $this->query->expects($this->exactly(1)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->will($this->returnValue([])); + $result = $this->folderMapper->getToDelete(null, $this->user); $this->assertEquals($this->folders, $result); @@ -204,7 +367,24 @@ class FolderMapperTest extends MapperTestUtility $userId = 'john'; $sql = 'DELETE FROM `*PREFIX*news_folders` WHERE `user_id` = ?'; - $this->setMapperResult($sql, [$userId]); + $this->db->expects($this->exactly(1)) + ->method('prepare') + ->with($sql, null, null) + ->will(($this->returnValue($this->query))); + + $this->query->expects($this->never()) + ->method('fetch'); + + $this->query->expects($this->exactly(1)) + ->method('bindValue') + ->withConsecutive([1, $userId, 2]); + + $this->query->expects($this->exactly(0)) + ->method('closeCursor'); + + $this->query->expects($this->once()) + ->method('execute') + ->will($this->returnValue([])); $this->folderMapper->deleteUser($userId); } diff --git a/tests/Unit/Db/MapperTestUtility.php b/tests/Unit/Db/MapperTestUtility.php index b414b43e3..695738179 100644 --- a/tests/Unit/Db/MapperTestUtility.php +++ b/tests/Unit/Db/MapperTestUtility.php @@ -23,20 +23,27 @@ namespace OCA\News\Tests\Unit\Db; +use Doctrine\DBAL\Driver\PDOStatement; use OCP\IDBConnection; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; + /** * Simple utility class for testing mappers */ abstract class MapperTestUtility extends TestCase { + + /** + * @var MockObject|IDBConnection + */ protected $db; - private $query; - private $queryAt; - private $prepareAt; - private $fetchAt; - private $iterators; + + /** + * @var MockObject|PDOStatement + */ + protected $query; /** @@ -48,187 +55,10 @@ abstract class MapperTestUtility extends TestCase parent::setUp(); $this->db = $this->getMockBuilder(IDBConnection::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->query = $this->createMock(\PDOStatement::class); - $this->queryAt = 0; - $this->prepareAt = 0; - $this->iterators = []; - $this->fetchAt = 0; - } - - /** - * Checks if an array is associative - * - * @param array $array - * @return bool true if associative - */ - private function isAssocArray(array $array) - { - return array_values($array) !== $array; - } - - /** - * Returns the correct PDO constant based on the value type - * - * @param $value - * @return PDO constant - */ - private function getPDOType($value) - { - switch (gettype($value)) { - case 'integer': - return \PDO::PARAM_INT; - case 'boolean': - return \PDO::PARAM_BOOL; - default: - return \PDO::PARAM_STR; - } - } - - /** - * Create mocks and set expected results for database queries - * - * @param string $sql the sql query that you expect to receive - * @param array $arguments the expected arguments for the prepare query - * method - * @param array $returnRows the rows that should be returned for the result - * of the database query. If not provided, it wont - * be assumed that fetch will be called on the - * result - */ - protected function setMapperResult($sql, $arguments=array(), $returnRows=array(), - $limit=null, $offset=null, $expectClose=false - ) { - if($limit === null && $offset === null) { - $this->db->expects($this->at($this->prepareAt)) - ->method('prepare') - ->with($this->equalTo($sql)) - ->will(($this->returnValue($this->query))); - } elseif($limit !== null && $offset === null) { - $this->db->expects($this->at($this->prepareAt)) - ->method('prepare') - ->with($this->equalTo($sql), $this->equalTo($limit)) - ->will(($this->returnValue($this->query))); - } elseif($limit === null && $offset !== null) { - $this->db->expects($this->at($this->prepareAt)) - ->method('prepare') - ->with( - $this->equalTo($sql), - $this->equalTo(null), - $this->equalTo($offset) - ) - ->will(($this->returnValue($this->query))); - } else { - $this->db->expects($this->at($this->prepareAt)) - ->method('prepare') - ->with( - $this->equalTo($sql), - $this->equalTo($limit), - $this->equalTo($offset) - ) - ->will(($this->returnValue($this->query))); - } - - $this->iterators[] = new ArgumentIterator($returnRows); - - $iterators = $this->iterators; - $fetchAt = $this->fetchAt; + ->disableOriginalConstructor() + ->getMock(); - $this->query->expects($this->any()) - ->method('fetch') - ->will( - $this->returnCallback( - function () use ($iterators, $fetchAt) { - $iterator = $iterators[$fetchAt]; - $result = $iterator->next(); - - if($result === false) { - $fetchAt++; - } - - $this->queryAt++; - - return $result; - } - ) - ); - - if ($this->isAssocArray($arguments)) { - foreach($arguments as $key => $argument) { - $pdoConstant = $this->getPDOType($argument); - $this->query->expects($this->at($this->queryAt)) - ->method('bindValue') - ->with( - $this->equalTo($key), - $this->equalTo($argument), - $this->equalTo($pdoConstant) - ); - $this->queryAt++; - } - } else { - $index = 1; - foreach($arguments as $argument) { - $pdoConstant = $this->getPDOType($argument); - $this->query->expects($this->at($this->queryAt)) - ->method('bindValue') - ->with( - $this->equalTo($index), - $this->equalTo($argument), - $this->equalTo($pdoConstant) - ); - $index++; - $this->queryAt++; - } - } - - $this->query->expects($this->at($this->queryAt)) - ->method('execute') - ->will( - $this->returnCallback( - function ($sql, $p=null, $o=null, $s=null) { - - } - ) - ); - $this->queryAt++; - - - - if ($expectClose) { - $closing = $this->at($this->queryAt); - } else { - $closing = $this->any(); - } - $this->query->expects($closing)->method('closeCursor'); - $this->queryAt++; - - $this->prepareAt++; - $this->fetchAt++; - } - - -} - - -class ArgumentIterator -{ - - private $arguments; - - public function __construct($arguments) - { - $this->arguments = $arguments; - } - - public function next() - { - $result = array_shift($this->arguments); - if($result === null) { - return false; - } else { - return $result; - } + $this->query = $this->getMockBuilder(\PDOStatement::class) + ->getMock(); } } |