[TASK] EXT:dbal: Harden unit tests for expression chunks 03/34703/4
authorAndreas Fernandez <andreas.fernandez@aspedia.de>
Thu, 27 Nov 2014 16:51:20 +0000 (17:51 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sun, 30 Nov 2014 19:30:40 +0000 (20:30 +0100)
The unit tests for the new expression chunking do not cover every
possible case. The tests are improved to avoid further regressions
in the new expression chunking. For a better understanding, the
expected WHERE conditions are written in the comments of some
non-obvious tests.

Resolves: #63373
Related: #63345, #61654
Releases: master, 6.2
Change-Id: I9e94fa315afc023e84854017230cd008e211059e
Reviewed-on: http://review.typo3.org/34703
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Markus Klein <klein.t3@reelworx.at>
Tested-by: Markus Klein <klein.t3@reelworx.at>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Frans Saris <franssaris@gmail.com>
Tested-by: Frans Saris <franssaris@gmail.com>
typo3/sysext/dbal/Tests/Unit/Database/DatabaseConnectionOracleTest.php

index 7e57bc6..b22e22e 100644 (file)
@@ -929,6 +929,13 @@ class DatabaseConnectionOracleTest extends AbstractTestCase {
                        $whereExpr[] = '"uid" NOT IN (' . implode(',', $chunk) . ')';
                }
 
+               /**
+                * $expectedWhere:
+                * (
+                *        "uid" NOT IN (1,2,3,4,...,1000)
+                *    AND "uid" NOT IN (1001,1002,...,1250)
+                * )
+                */
                $expectedWhere = '(' . implode(' AND ', $whereExpr) . ')';
                $expectedQuery = 'SELECT * FROM "tt_content" WHERE ' . $expectedWhere;
                $this->assertEquals($expectedQuery, $this->cleanSql($result));
@@ -953,6 +960,13 @@ class DatabaseConnectionOracleTest extends AbstractTestCase {
                        $whereExpr[] = '"uid" IN (' . implode(',', $chunk) . ')';
                }
 
+               /**
+                * $expectedWhere:
+                * (
+                *        "uid" IN (1,2,3,4,...,1000)
+                *     OR "uid" IN (1001,1002,...,1250)
+                * )
+                */
                $expectedWhere = '(' . implode(' OR ', $whereExpr) . ')';
                $expectedQuery = 'SELECT * FROM "tt_content" WHERE ' . $expectedWhere;
                $this->assertEquals($expectedQuery, $this->cleanSql($result));
@@ -983,7 +997,7 @@ class DatabaseConnectionOracleTest extends AbstractTestCase {
                $mockSpecificsOci8->expects($this->any())->method('getSpecific')->will($this->returnValue($listMaxExpressions));
 
                $items = range(0, 1250);
-               $where = 'uid = 1981 AND uid IN(' . implode(',', $items) . ')';
+               $where = 'uid = 1981 AND uid IN(' . implode(',', $items) . ') OR uid = 42';
                $result = $this->subject->SELECTquery('uid, pid', 'tt_content', $where);
 
                $chunks = array_chunk($items, $listMaxExpressions);
@@ -992,7 +1006,55 @@ class DatabaseConnectionOracleTest extends AbstractTestCase {
                        $whereExpr[] = '"uid" IN (' . implode(',', $chunk) . ')';
                }
 
-               $expectedWhere = '"uid" = 1981 AND (' . implode(' OR ', $whereExpr) . ')';
+               /**
+                * $expectedWhere:
+                * "uid" = 1981 AND (
+                *        "uid" IN (1,2,3,4,...,1000)
+                *     OR "uid" IN (1001,1002,...,1250)
+                * ) OR "uid" = 42
+                */
+               $expectedWhere = '"uid" = 1981 AND (' . implode(' OR ', $whereExpr) . ') OR "uid" = 42';
+               $expectedQuery = 'SELECT "uid", "pid" FROM "tt_content" WHERE ' . $expectedWhere;
+               $this->assertEquals($expectedQuery, $this->cleanSql($result));
+       }
+
+       /**
+        * @test
+        */
+       public function multipleExpressiosInWhereClauseAreBracedCorrectly() {
+               $listMaxExpressions = 1000;
+
+               $mockSpecificsOci8 = $this->getAccessibleMock('TYPO3\\CMS\\Dbal\\Database\\Specifics\\Oci8', array(), array(), '', FALSE);
+               $mockSpecificsOci8->expects($this->any())->method('getSpecific')->will($this->returnValue($listMaxExpressions));
+
+               $INitems = range(0, 1250);
+               $NOTINItems = range(0, 1001);
+               $where = 'uid = 1981 AND uid IN(' . implode(',', $INitems) . ') OR uid = 42 AND uid NOT IN(' . implode(',', $NOTINItems) . ')';
+               $result = $this->subject->SELECTquery('uid, pid', 'tt_content', $where);
+
+               $chunks = array_chunk($INitems, $listMaxExpressions);
+               $INItemsWhereExpr = array();
+               foreach ($chunks as $chunk) {
+                       $INItemsWhereExpr[] = '"uid" IN (' . implode(',', $chunk) . ')';
+               }
+
+               $chunks = array_chunk($NOTINItems, $listMaxExpressions);
+               $NOTINItemsWhereExpr = array();
+               foreach ($chunks as $chunk) {
+                       $NOTINItemsWhereExpr[] = '"uid" NOT IN (' . implode(',', $chunk) . ')';
+               }
+
+               /**
+                * $expectedWhere:
+                * "uid" = 1981 AND (
+                *        "uid" IN (1,2,3,4,...,1000)
+                *     OR "uid" IN (1001,1002,...,1250)
+                * ) OR "uid" = 42 AND (
+                *        "uid" NOT IN (1,2,3,4,...,1000)
+                *    AND "uid" NOT IN (1001)
+                * )
+                */
+               $expectedWhere = '"uid" = 1981 AND (' . implode(' OR ', $INItemsWhereExpr) . ') OR "uid" = 42 AND (' . implode(' AND ', $NOTINItemsWhereExpr) . ')';
                $expectedQuery = 'SELECT "uid", "pid" FROM "tt_content" WHERE ' . $expectedWhere;
                $this->assertEquals($expectedQuery, $this->cleanSql($result));
        }