| 
<?php/**
 * Copyright (c) 2004-2015, EMESA BV
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are PROHIBITED without prior written permission from
 * the author. This product may NOT be used anywhere and on any computer
 * except the server platform of EMESA BV. If you received this code
 * accidentally and without intent to use it, please report this
 * incident to the author by email.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
 /**
 * ${DESCRIPTION}
 *
 * @author Victor Bolshov <[email protected]>
 * @phpcs
 */
 
 
 namespace tinyorm\test;
 
 
 use tinyorm\Db;
 
 class TxManagerTest extends BaseTestCase
 {
 /**
 * @var Db
 */
 protected $connection2;
 protected function setUp()
 {
 parent::setUp();
 $this->connection2 = clone $this->connection;
 $this->connection2->setName("Conn 2");
 }
 
 function testGroupCommit()
 {
 $txm = new \tinyorm\TxManager();
 $txm->registerConnection($this->connection)
 ->registerConnection($this->connection2);
 
 $result = $txm->atomic(function () {
 $this->connection->exec("INSERT INTO test (c_unique) VALUES ('val1')");
 $this->connection2->exec("INSERT INTO test (c_unique) VALUES ('val2')");
 return true;
 });
 
 $this->assertEquals(true, $result);
 // 3: BEGIN; INSERT; COMMIT;
 $this->assertEquals(3, $this->connection->getQueryCount());
 $this->assertEquals(3, $this->connection2->getQueryCount());
 $this->assertRowCount("test", 2);
 }
 
 function testNestedTransactionsCommit()
 {
 $txm = new \tinyorm\TxManager();
 $txm->registerConnection($this->connection)
 ->registerConnection($this->connection2);
 
 $result = $txm->atomic(function () use ($txm) {
 $this->connection->exec("INSERT INTO test (c_unique) VALUES ('val1')");
 $this->connection2->exec("INSERT INTO test (c_unique) VALUES ('val2')");
 return $txm->atomic(function () {
 $this->connection->exec("INSERT INTO test (c_unique) VALUES ('val3')");
 $this->connection2->exec("INSERT INTO test (c_unique) VALUES ('val4')");
 return true;
 });
 });
 
 $this->assertEquals(true, $result);
 // 4: BEGIN; INSERT; INSERT; COMMIT;
 $this->assertEquals(4, $this->connection->getQueryCount());
 $this->assertEquals(4, $this->connection2->getQueryCount());
 $this->assertRowCount("test", 4);
 }
 
 function testNestedTransactionsRollback()
 {
 $txm = new \tinyorm\TxManager();
 $txm->registerConnection($this->connection)
 ->registerConnection($this->connection2);
 
 try {
 $txm->atomic(function () use ($txm) {
 $this->connection->exec("INSERT INTO test (c_unique) VALUES ('val1')");
 $this->connection2->exec("INSERT INTO test (c_unique) VALUES ('val2')");
 return $txm->atomic(function () {
 $this->connection->exec("INSERT INTO test (c_unique) VALUES ('val3')");
 //                    $this->connection2->exec("INSERT INTO test (c_unique) VALUES ('val3')");
 throw new \Exception("TEST");
 });
 });
 $this->fail("Exception expected");
 } catch (\Exception $e) {
 $this->assertEquals(\Exception::class, get_class($e));
 $this->assertEquals("TEST", $e->getMessage());
 }
 
 // 4: BEGIN; INSERT; INSERT; ROLLBACK;
 $this->assertEquals(4, $this->connection->getQueryCount());
 // 3: BEGIN; INSERT; ROLLBACK;
 $this->assertEquals(3, $this->connection2->getQueryCount());
 $this->assertRowCount("test", 0);
 }
 
 function testGroupCommitOnlyAffectInstancesParticipatingInTransaction()
 {
 $txm = new \tinyorm\TxManager();
 $txm->registerConnection($this->connection)
 ->registerConnection($this->connection2);
 
 $result = $txm->atomic(function () {
 $this->connection->exec("INSERT INTO test (c_unique) VALUES ('val1')");
 return true;
 });
 
 $this->assertEquals(true, $result);
 // 3: BEGIN; INSERT; COMMIT;
 $this->assertEquals(3, $this->connection->getQueryCount());
 // 0: the 2nd connection should not issue a single query.
 $this->assertEquals(0, $this->connection2->getQueryCount());
 $this->assertRowCount("test", 1);
 }
 
 function testGroupRollback()
 {
 $txm = new \tinyorm\TxManager();
 $txm->registerConnection($this->connection)
 ->registerConnection($this->connection2);
 
 try {
 $txm->atomic(function () {
 $this->connection->exec("INSERT INTO test (c_unique) VALUES ('val1')");
 $this->connection2->exec("INSERT INTO test (c_unique) VALUES ('val2')");
 throw new \Exception("TEST");
 });
 $this->fail("Expected exception throw");
 } catch (\Exception $e) {
 // 3: BEGIN; INSERT; ROLLBACK;
 $this->assertEquals(3, $this->connection->getQueryCount());
 $this->assertEquals(3, $this->connection2->getQueryCount());
 $this->assertRowCount("test", 0);
 }
 }
 }
 
 |