Use PHP 7 '??' operator instead of '?:' with 'isset()' where convenient
[lhc/web/wiklou.git] / tests / phpunit / includes / libs / rdbms / database / DatabaseSQLTest.php
index 3d15b03..d9919e1 100644 (file)
@@ -53,10 +53,10 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->select(
                        $sql['tables'],
                        $sql['fields'],
-                       isset( $sql['conds'] ) ? $sql['conds'] : [],
+                       $sql['conds'] ?? [],
                        __METHOD__,
-                       isset( $sql['options'] ) ? $sql['options'] : [],
-                       isset( $sql['join_conds'] ) ? $sql['join_conds'] : []
+                       $sql['options'] ?? [],
+                       $sql['join_conds'] ?? []
                );
                $this->assertLastSql( $sqlText );
        }
@@ -266,10 +266,10 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->selectRowCount(
                        $sql['tables'],
                        $sql['field'],
-                       isset( $sql['conds'] ) ? $sql['conds'] : [],
+                       $sql['conds'] ?? [],
                        __METHOD__,
-                       isset( $sql['options'] ) ? $sql['options'] : [],
-                       isset( $sql['join_conds'] ) ? $sql['join_conds'] : []
+                       $sql['options'] ?? [],
+                       $sql['join_conds'] ?? []
                );
                $this->assertLastSql( $sqlText );
        }
@@ -363,7 +363,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $sql['values'],
                        $sql['conds'],
                        __METHOD__,
-                       isset( $sql['options'] ) ? $sql['options'] : []
+                       $sql['options'] ?? []
                );
                $this->assertLastSql( $sqlText );
        }
@@ -531,7 +531,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $sql['table'],
                        $sql['rows'],
                        __METHOD__,
-                       isset( $sql['options'] ) ? $sql['options'] : []
+                       $sql['options'] ?? []
                );
                $this->assertLastSql( $sqlText );
        }
@@ -587,9 +587,9 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $sql['varMap'],
                        $sql['conds'],
                        __METHOD__,
-                       isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
-                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : [],
-                       isset( $sql['selectJoinConds'] ) ? $sql['selectJoinConds'] : []
+                       $sql['insertOptions'] ?? [],
+                       $sql['selectOptions'] ?? [],
+                       $sql['selectJoinConds'] ?? []
                );
                $this->assertLastSql( $sqlTextNative );
 
@@ -603,9 +603,9 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $sql['varMap'],
                        $sql['conds'],
                        __METHOD__,
-                       isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
-                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : [],
-                       isset( $sql['selectJoinConds'] ) ? $sql['selectJoinConds'] : []
+                       $sql['insertOptions'] ?? [],
+                       $sql['selectOptions'] ?? [],
+                       $sql['selectJoinConds'] ?? []
                );
                $this->assertLastSqlDb( implode( '; ', [ $sqlSelect, 'BEGIN', $sqlInsert, 'COMMIT' ] ), $dbWeb );
        }
@@ -1012,10 +1012,10 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $params['table'],
                        $params['vars'],
                        $params['permute_conds'],
-                       isset( $params['extra_conds'] ) ? $params['extra_conds'] : '',
+                       $params['extra_conds'] ?? '',
                        'FNAME',
-                       isset( $params['options'] ) ? $params['options'] : [],
-                       isset( $params['join_conds'] ) ? $params['join_conds'] : []
+                       $params['options'] ?? [],
+                       $params['join_conds'] ?? []
                ) );
                $this->assertEquals( $expect, $sql );
        }
@@ -1434,6 +1434,9 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        IDatabase::TRIGGER_COMMIT => 'tCommit',
                        IDatabase::TRIGGER_ROLLBACK => 'tRollback'
                ];
+               $pcCallback = function ( IDatabase $db ) use ( $fname ) {
+                       $this->database->query( "SELECT 0", $fname );
+               };
                $callback1 = function ( $trigger = '-' ) use ( $fname, $triggerMap ) {
                        $this->database->query( "SELECT 1, {$triggerMap[$trigger]} AS t", $fname );
                };
@@ -1445,12 +1448,12 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                };
 
                $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
-               $this->database->onTransactionPreCommitOrIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionPreCommitOrIdle( $pcCallback, __METHOD__ );
                $this->database->cancelAtomic( __METHOD__ );
                $this->assertLastSql( 'BEGIN; ROLLBACK' );
 
                $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
-               $this->database->onTransactionIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback1, __METHOD__ );
                $this->database->cancelAtomic( __METHOD__ );
                $this->assertLastSql( 'BEGIN; ROLLBACK' );
 
@@ -1460,27 +1463,27 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->assertLastSql( 'BEGIN; ROLLBACK; SELECT 1, tRollback AS t' );
 
                $this->database->startAtomic( __METHOD__ . '_outer' );
-               $this->database->onTransactionPreCommitOrIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionPreCommitOrIdle( $pcCallback, __METHOD__ );
                $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
-               $this->database->onTransactionPreCommitOrIdle( $callback2, __METHOD__ );
+               $this->database->onTransactionPreCommitOrIdle( $pcCallback, __METHOD__ );
                $this->database->cancelAtomic( __METHOD__ );
-               $this->database->onTransactionPreCommitOrIdle( $callback3, __METHOD__ );
+               $this->database->onTransactionPreCommitOrIdle( $pcCallback, __METHOD__ );
                $this->database->endAtomic( __METHOD__ . '_outer' );
                $this->assertLastSql( implode( "; ", [
                        'BEGIN',
                        'SAVEPOINT wikimedia_rdbms_atomic1',
                        'ROLLBACK TO SAVEPOINT wikimedia_rdbms_atomic1',
-                       'SELECT 1, - AS t',
-                       'SELECT 3, - AS t',
+                       'SELECT 0',
+                       'SELECT 0',
                        'COMMIT'
                ] ) );
 
                $this->database->startAtomic( __METHOD__ . '_outer' );
-               $this->database->onTransactionIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback1, __METHOD__ );
                $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
-               $this->database->onTransactionIdle( $callback2, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback2, __METHOD__ );
                $this->database->cancelAtomic( __METHOD__ );
-               $this->database->onTransactionIdle( $callback3, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback3, __METHOD__ );
                $this->database->endAtomic( __METHOD__ . '_outer' );
                $this->assertLastSql( implode( "; ", [
                        'BEGIN',
@@ -1637,7 +1640,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->startAtomic( __METHOD__ . '_outer' );
                $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
                $this->database->startAtomic( __METHOD__ . '_inner' );
-               $this->database->onTransactionIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback1, __METHOD__ );
                $this->database->onTransactionPreCommitOrIdle( $callback2, __METHOD__ );
                $this->database->onTransactionResolution( $callback3, __METHOD__ );
                $this->database->endAtomic( __METHOD__ . '_inner' );
@@ -1655,7 +1658,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->startAtomic( __METHOD__ . '_outer' );
                $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
                $this->database->startAtomic( __METHOD__ . '_inner', IDatabase::ATOMIC_CANCELABLE );
-               $this->database->onTransactionIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback1, __METHOD__ );
                $this->database->onTransactionPreCommitOrIdle( $callback2, __METHOD__ );
                $this->database->onTransactionResolution( $callback3, __METHOD__ );
                $this->database->endAtomic( __METHOD__ . '_inner' );
@@ -1673,7 +1676,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->startAtomic( __METHOD__ . '_outer' );
                $atomicId = $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
                $this->database->startAtomic( __METHOD__ . '_inner' );
-               $this->database->onTransactionIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback1, __METHOD__ );
                $this->database->onTransactionPreCommitOrIdle( $callback2, __METHOD__ );
                $this->database->onTransactionResolution( $callback3, __METHOD__ );
                $this->database->cancelAtomic( __METHOD__, $atomicId );
@@ -1688,7 +1691,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->startAtomic( __METHOD__ . '_outer' );
                $atomicId = $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
                $this->database->startAtomic( __METHOD__ . '_inner' );
-               $this->database->onTransactionIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback1, __METHOD__ );
                $this->database->onTransactionPreCommitOrIdle( $callback2, __METHOD__ );
                $this->database->onTransactionResolution( $callback3, __METHOD__ );
                try {
@@ -1709,7 +1712,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->startAtomic( __METHOD__ . '_outer' );
                $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
                $this->database->startAtomic( __METHOD__ . '_inner' );
-               $this->database->onTransactionIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback1, __METHOD__ );
                $this->database->onTransactionPreCommitOrIdle( $callback2, __METHOD__ );
                $this->database->onTransactionResolution( $callback3, __METHOD__ );
                $this->database->cancelAtomic( __METHOD__ . '_inner' );
@@ -1726,7 +1729,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->startAtomic( __METHOD__ . '_outer' );
                $this->database->startAtomic( __METHOD__, IDatabase::ATOMIC_CANCELABLE );
                $this->database->startAtomic( __METHOD__ . '_inner' );
-               $this->database->onTransactionIdle( $callback1, __METHOD__ );
+               $this->database->onTransactionCommitOrIdle( $callback1, __METHOD__ );
                $this->database->onTransactionPreCommitOrIdle( $callback2, __METHOD__ );
                $this->database->onTransactionResolution( $callback3, __METHOD__ );
                $wrapper->trxStatus = Database::STATUS_TRX_ERROR;
@@ -1890,15 +1893,31 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->database->setFlag( Database::DBO_TRX );
 
-               // Implicit transaction gets silently rolled back
+               // Implicit transaction does not get silently rolled back
                $this->database->begin( __METHOD__, Database::TRANSACTION_INTERNAL );
                call_user_func( $doError );
-               $this->database->delete( 'x', [ 'field' => 1 ], __METHOD__ );
-               $this->database->commit( __METHOD__, Database::FLUSHING_INTERNAL );
-               // phpcs:ignore
-               $this->assertLastSql( 'BEGIN; DELETE FROM error WHERE 1; ROLLBACK; BEGIN; DELETE FROM x WHERE field = \'1\'; COMMIT' );
+               try {
+                       $this->database->delete( 'x', [ 'field' => 1 ], __METHOD__ );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( DBTransactionError $e ) {
+                       $this->assertEquals(
+                               'Cannot execute query from ' . __METHOD__ . ' while transaction status is ERROR.',
+                               $e->getMessage()
+                       );
+               }
+               try {
+                       $this->database->commit( __METHOD__, Database::FLUSHING_INTERNAL );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( DBTransactionError $e ) {
+                       $this->assertEquals(
+                               'Cannot execute query from ' . __METHOD__ . ' while transaction status is ERROR.',
+                               $e->getMessage()
+                       );
+               }
+               $this->database->rollback( __METHOD__, Database::FLUSHING_INTERNAL );
+               $this->assertLastSql( 'BEGIN; DELETE FROM error WHERE 1; ROLLBACK' );
 
-               // ... unless there were prior writes
+               // Likewise if there were prior writes
                $this->database->begin( __METHOD__, Database::TRANSACTION_INTERNAL );
                $this->database->delete( 'x', [ 'field' => 1 ], __METHOD__ );
                call_user_func( $doError );
@@ -1983,7 +2002,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
        public function testPrematureClose1() {
                $fname = __METHOD__;
                $this->database->begin( __METHOD__ );
-               $this->database->onTransactionIdle( function () use ( $fname ) {
+               $this->database->onTransactionCommitOrIdle( function () use ( $fname ) {
                        $this->database->query( 'SELECT 1', $fname );
                } );
                $this->database->delete( 'x', [ 'field' => 3 ], __METHOD__ );
@@ -2001,7 +2020,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                try {
                        $fname = __METHOD__;
                        $this->database->startAtomic( __METHOD__ );
-                       $this->database->onTransactionIdle( function () use ( $fname ) {
+                       $this->database->onTransactionCommitOrIdle( function () use ( $fname ) {
                                $this->database->query( 'SELECT 1', $fname );
                        } );
                        $this->database->delete( 'x', [ 'field' => 3 ], __METHOD__ );