diff --git a/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php b/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php index 3024a060744..a91069a60b7 100644 --- a/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php @@ -45,7 +45,7 @@ class MysqlTest extends CakeTestCase { public $fixtures = array( 'core.apple', 'core.article', 'core.articles_tag', 'core.attachment', 'core.comment', 'core.sample', 'core.tag', 'core.user', 'core.post', 'core.author', 'core.data_test', - 'core.binary_test' + 'core.binary_test', 'app.address' ); /** @@ -3579,4 +3579,40 @@ public function testTruncateStatements() { ->with("TRUNCATE TABLE `$schema`.`tbl_articles`"); $this->Dbo->truncate('articles'); } + +/** + * Test nested transaction + * + * @return void + */ + public function testNestedTransaction() { + $obj = new ReflectionMethod($this->Dbo, '_supportNestedTransaction'); + $obj->setAccessible(true); + $this->skipIf($obj->invoke($this->Dbo) === false, 'The MySQL server do not support nested transaction'); + + $this->loadFixtures('Address'); + $model = ClassRegistry::init('Address'); + $model->hasOne = $model->hasMany = $model->belongsTo = $model->hasAndBelongsToMany = array(); + $model->cacheQueries = false; + $this->Dbo->cacheMethods = false; + + $this->assertTrue($this->Dbo->begin()); + $this->assertNotEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->begin()); + $this->assertTrue($model->delete(1)); + $this->assertEmpty($model->read(null, 1)); + $this->assertTrue($this->Dbo->rollback()); + $this->assertNotEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->begin()); + $this->assertTrue($model->delete(1)); + $this->assertEmpty($model->read(null, 1)); + $this->assertTrue($this->Dbo->commit()); + $this->assertEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->rollback()); + $this->assertNotEmpty($model->read(null, 1)); + } + } diff --git a/lib/Cake/Test/Case/Model/Datasource/Database/PostgresTest.php b/lib/Cake/Test/Case/Model/Datasource/Database/PostgresTest.php index 54b331f48f4..4a6b7897ebd 100644 --- a/lib/Cake/Test/Case/Model/Datasource/Database/PostgresTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/Database/PostgresTest.php @@ -909,4 +909,39 @@ public function testTruncateStatements() { $this->Dbo->truncate('articles'); } +/** + * Test nested transaction + * + * @return void + */ + public function testNestedTransaction() { + $obj = new ReflectionMethod($this->Dbo, '_supportNestedTransaction'); + $obj->setAccessible(true); + $this->skipIf($obj->invoke($this->Dbo) === false, 'The Postgres server do not support nested transaction'); + + $this->loadFixtures('Article'); + $model = new Article(); + $model->hasOne = $model->hasMany = $model->belongsTo = $model->hasAndBelongsToMany = array(); + $model->cacheQueries = false; + $this->Dbo->cacheMethods = false; + + $this->assertTrue($this->Dbo->begin()); + $this->assertNotEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->begin()); + $this->assertTrue($model->delete(1)); + $this->assertEmpty($model->read(null, 1)); + $this->assertTrue($this->Dbo->rollback()); + $this->assertNotEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->begin()); + $this->assertTrue($model->delete(1)); + $this->assertEmpty($model->read(null, 1)); + $this->assertTrue($this->Dbo->commit()); + $this->assertEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->rollback()); + $this->assertNotEmpty($model->read(null, 1)); + } + } diff --git a/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php b/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php index f53257bff11..1e4ed7e4678 100644 --- a/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/Database/SqliteTest.php @@ -383,4 +383,39 @@ public function testUuidPrimaryKeyInsertion() { $this->assertTrue(Validation::uuid($result['Uuid']['id']), 'Not a uuid'); } +/** + * Test nested transaction + * + * @return void + */ + public function testNestedTransaction() { + $obj = new ReflectionMethod($this->Dbo, '_supportNestedTransaction'); + $obj->setAccessible(true); + $this->skipIf($obj->invoke($this->Dbo) === false, 'The Sqlite version do not support nested transaction'); + + $this->loadFixtures('User'); + $model = new User(); + $model->hasOne = $model->hasMany = $model->belongsTo = $model->hasAndBelongsToMany = array(); + $model->cacheQueries = false; + $this->Dbo->cacheMethods = false; + + $this->assertTrue($this->Dbo->begin()); + $this->assertNotEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->begin()); + $this->assertTrue($model->delete(1)); + $this->assertEmpty($model->read(null, 1)); + $this->assertTrue($this->Dbo->rollback()); + $this->assertNotEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->begin()); + $this->assertTrue($model->delete(1)); + $this->assertEmpty($model->read(null, 1)); + $this->assertTrue($this->Dbo->commit()); + $this->assertEmpty($model->read(null, 1)); + + $this->assertTrue($this->Dbo->rollback()); + $this->assertNotEmpty($model->read(null, 1)); + } + }