Passed
Push — 4.1.1 ( 01ed8a )
by Robbie
09:45
created

DataObjectDuplicationTest::testDuplicateHasOne()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 18
nc 1
nop 0
dl 0
loc 26
rs 8.8571
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\ORM\Tests;
4
5
use SilverStripe\Dev\SapphireTest;
6
7
class DataObjectDuplicationTest extends SapphireTest
8
{
9
    protected static $fixture_file = 'DataObjectDuplicationTest.yml';
10
11
    protected static $extra_dataobjects = [
12
        DataObjectDuplicationTest\Antelope::class,
13
        DataObjectDuplicationTest\Bobcat::class,
14
        DataObjectDuplicationTest\Caribou::class,
15
        DataObjectDuplicationTest\Dingo::class,
16
        DataObjectDuplicationTest\Elephant::class,
17
        DataObjectDuplicationTest\Frog::class,
18
        DataObjectDuplicationTest\Goat::class,
19
    ];
20
21
    public function testDuplicate()
22
    {
23
        /** @var DataObjectDuplicationTest\Antelope $orig */
24
        $orig = $this->objFromFixture(DataObjectDuplicationTest\Antelope::class, 'one');
25
        /** @var DataObjectDuplicationTest\Antelope $duplicate */
26
        $duplicate = $orig->duplicate();
27
        $this->assertInstanceOf(
28
            DataObjectDuplicationTest\Antelope::class,
29
            $duplicate,
30
            'Creates the correct type'
31
        );
32
        $this->assertNotEquals(
33
            $duplicate->ID,
34
            $orig->ID,
35
            'Creates a unique record'
36
        );
37
38
        // Check 'bobcats' relation duplicated
39
        $twoOne = $this->objFromFixture(DataObjectDuplicationTest\Bobcat::class, 'one');
40
        $twoTwo = $this->objFromFixture(DataObjectDuplicationTest\Bobcat::class, 'two');
41
        $this->assertListEquals(
42
            [
43
                ['Title' => 'Bobcat two'],
44
                ['Title' => 'Bobcat three'],
45
            ],
46
            $duplicate->bobcats()
47
        );
48
        $this->assertEmpty(
49
            array_intersect(
50
                $orig->bobcats()->getIDList(),
51
                $duplicate->bobcats()->getIDList()
52
            )
53
        );
54
        /** @var DataObjectDuplicationTest\Bobcat $twoTwoDuplicate */
55
        $twoTwoDuplicate = $duplicate->bobcats()->filter('Title', 'Bobcat two')->first();
56
        $this->assertNotEmpty($twoTwoDuplicate);
57
        $this->assertNotEquals($twoTwo->ID, $twoTwoDuplicate->ID);
58
59
        // Check 'bobcats.self' relation duplicated
60
        /** @var DataObjectDuplicationTest\Bobcat $twoOneDuplicate */
61
        $twoOneDuplicate = $twoTwoDuplicate->self();
62
        $this->assertNotEmpty($twoOneDuplicate);
63
        $this->assertNotEquals($twoOne->ID, $twoOneDuplicate->ID);
64
65
        // Ensure 'bobcats.seven' instance is not duplicated
66
        $sevenOne = $this->objFromFixture(DataObjectDuplicationTest\Goat::class, 'one');
67
        $sevenTwo = $this->objFromFixture(DataObjectDuplicationTest\Goat::class, 'two');
68
        $this->assertEquals($sevenOne->ID, $twoOneDuplicate->goat()->ID);
69
        $this->assertEquals($sevenTwo->ID, $twoTwoDuplicate->goat()->ID);
70
71
        // Ensure that 'caribou' many_many list exists on both, but only the mapping table is duplicated
72
        // many_many_extraFields are also duplicated
73
        $caribouList = [
74
            [
75
                'Title' => 'Caribou one',
76
                'Sort' => 4,
77
            ],
78
            [
79
                'Title' => 'Caribou two',
80
                'Sort' => 5,
81
            ],
82
        ];
83
        // Original and duplicate lists have the same content
84
        $this->assertListEquals(
85
            $caribouList,
86
            $orig->caribou()
87
        );
88
        $this->assertListEquals(
89
            $caribouList,
90
            $duplicate->caribou()
91
        );
92
        // Ids of each record are the same (only mapping content is duplicated)
93
        $this->assertEquals(
94
            $orig->caribou()->getIDList(),
95
            $duplicate->caribou()->getIDList()
96
        );
97
98
        // Ensure 'five' belongs_to is duplicated
99
        $fiveOne = $this->objFromFixture(DataObjectDuplicationTest\Elephant::class, 'one');
100
        $fiveOneDuplicate = $duplicate->elephant();
101
        $this->assertNotEmpty($fiveOneDuplicate);
102
        $this->assertEquals('Elephant one', $fiveOneDuplicate->Title);
103
        $this->assertNotEquals($fiveOne->ID, $fiveOneDuplicate->ID);
104
105
        // Ensure 'five.Child' is duplicated
106
        $sixOne = $this->objFromFixture(DataObjectDuplicationTest\Frog::class, 'one');
107
        $sixOneDuplicate = $fiveOneDuplicate->Child();
108
        $this->assertNotEmpty($sixOneDuplicate);
109
        $this->assertEquals('Frog one', $sixOneDuplicate->Title);
110
        $this->assertNotEquals($sixOne->ID, $sixOneDuplicate->ID);
111
    }
112
}
113