Passed
Push — 4.1 ( dd3fbf...7ec5fa )
by Daniel
11:01
created

TransactionTest::setUpBeforeClass()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 0
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\ORM\Tests;
4
5
use SilverStripe\ORM\DB;
6
use SilverStripe\ORM\DataObject;
7
use SilverStripe\Dev\SapphireTest;
8
use SilverStripe\ORM\Tests\TransactionTest\TestObject;
9
10
class TransactionTest extends SapphireTest
11
{
12
    protected $usesDatabase = true;
13
14
    protected static $extra_dataobjects = [
15
        TransactionTest\TestObject::class,
16
    ];
17
18
    public static function setUpBeforeClass()
19
    {
20
        parent::setUpBeforeClass();
21
        if (!DB::get_conn()->supportsTransactions()) {
22
            static::markTestSkipped('Current database does not support transactions');
23
        }
24
    }
25
26
    public function testNestedTransaction()
27
    {
28
        $this->assertCount(0, TestObject::get());
29
        try {
30
            DB::get_conn()->withTransaction(function () {
31
                $obj = TransactionTest\TestObject::create();
32
                $obj->Title = 'Test';
33
                $obj->write();
34
35
                $this->assertCount(1, TestObject::get());
36
37
                DB::get_conn()->withTransaction(function () {
38
                    $obj = TransactionTest\TestObject::create();
39
                    $obj->Title = 'Test2';
40
                    $obj->write();
41
                    $this->assertCount(2, TestObject::get());
42
                });
43
44
                throw new \Exception('roll back transaction');
45
            });
46
        } catch (\Exception $e) {
47
            $this->assertEquals('roll back transaction', $e->getMessage());
48
        }
49
        $this->assertCount(0, TestObject::get());
50
    }
51
52
    public function testCreateWithTransaction()
53
    {
54
        DB::get_conn()->transactionStart();
55
        $obj = new TransactionTest\TestObject();
56
        $obj->Title = 'First page';
57
        $obj->write();
58
59
        $obj = new TransactionTest\TestObject();
60
        $obj->Title = 'Second page';
61
        $obj->write();
62
63
        //Create a savepoint here:
64
        DB::get_conn()->transactionSavepoint('rollback');
65
66
        $obj = new TransactionTest\TestObject();
67
        $obj->Title = 'Third page';
68
        $obj->write();
69
70
        $obj = new TransactionTest\TestObject();
71
        $obj->Title = 'Fourth page';
72
        $obj->write();
73
74
        //Revert to a savepoint:
75
        DB::get_conn()->transactionRollback('rollback');
76
77
        DB::get_conn()->transactionEnd();
78
79
        $first = DataObject::get(TransactionTest\TestObject::class, "\"Title\"='First page'");
80
        $second = DataObject::get(TransactionTest\TestObject::class, "\"Title\"='Second page'");
81
        $third = DataObject::get(TransactionTest\TestObject::class, "\"Title\"='Third page'");
82
        $fourth = DataObject::get(TransactionTest\TestObject::class, "\"Title\"='Fourth page'");
83
84
        //These pages should be in the system
85
        $this->assertTrue(is_object($first) && $first->exists());
86
        $this->assertTrue(is_object($second) && $second->exists());
87
88
        //These pages should NOT exist, we reverted to a savepoint:
89
        $this->assertFalse(is_object($third) && $third->exists());
90
        $this->assertFalse(is_object($fourth) && $fourth->exists());
91
    }
92
}
93