Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/undo-ransomware/ransomware_detection.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Unit/Db/MapperTestUtility.php')
-rw-r--r--tests/Unit/Db/MapperTestUtility.php227
1 files changed, 227 insertions, 0 deletions
diff --git a/tests/Unit/Db/MapperTestUtility.php b/tests/Unit/Db/MapperTestUtility.php
new file mode 100644
index 0000000..fc4bff6
--- /dev/null
+++ b/tests/Unit/Db/MapperTestUtility.php
@@ -0,0 +1,227 @@
+<?php
+
+/**
+ * ownCloud - App Framework.
+ *
+ * @author Bernhard Posselt
+ * @author Matthias Held <matthias.held@uni-konstanz.de>
+ * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCA\RansomwareDetection\Tests\Unit\Db;
+
+use Test\TestCase;
+
+/**
+ * Simple utility class for testing mappers.
+ */
+abstract class MapperTestUtility extends TestCase
+{
+ protected $db;
+ private $query;
+ private $queryAt;
+ private $prepareAt;
+ private $fetchAt;
+ private $iterators;
+
+ /**
+ * Run this function before the actual test to either set or initialize the
+ * db. After this the db can be accessed by using $this->db.
+ */
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->db = $this->getMockBuilder(
+ '\OCP\IDBConnection'
+ )
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->query = $this->createMock('\PDOStatement');
+ $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;
+
+ $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;
+ }
+ }
+}