Passed
Push — master ( 2f57a8...0391a7 )
by
unknown
02:27
created

testDeleteFilteredRecords()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 42
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 21
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 42
rs 9.584
1
<?php
2
3
namespace TractorCow\Fluent\Tests\Model\Delete;
4
5
use SilverStripe\Core\Injector\Injector;
6
use SilverStripe\Dev\SapphireTest;
7
use SilverStripe\ORM\DB;
8
use SilverStripe\ORM\ValidationException;
9
use TractorCow\Fluent\Model\Delete\DeletePolicy;
10
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
11
use TractorCow\Fluent\Model\Domain;
12
use TractorCow\Fluent\Model\Locale;
13
use TractorCow\Fluent\State\FluentState;
14
use TractorCow\Fluent\Tests\Model\Delete\Fixtures\FilteredRecord;
15
use TractorCow\Fluent\Tests\Model\Delete\Fixtures\LocalisedRecord;
16
use TractorCow\Fluent\Tests\Model\Delete\Fixtures\Record;
17
18
class DeleteRecordPolicyTest extends SapphireTest
19
{
20
    protected static $fixture_file = '../LocaleTest.yml';
21
22
    protected static $extra_dataobjects = [
23
        Record::class,
24
        LocalisedRecord::class,
25
        FilteredRecord::class,
26
    ];
27
28
    protected function setUp()
29
    {
30
        parent::setUp();
31
32
        // Clear cache
33
        Locale::clearCached();
34
        Domain::clearCached();
35
36
        // Set default
37
        FluentState::singleton()
38
            ->setLocale('es_US')
39
            ->setIsDomainMode(false);
40
    }
41
42
    /**
43
     * @throws ValidationException
44
     */
45
    public function testDelete()
46
    {
47
        $record = new Record();
48
        $record->Title = 'OK';
49
        $record->write();
50
51
        $this->assertEquals(
52
            1,
53
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_Record"')->value()
54
        );
55
56
        /** @var DeleteRecordPolicy $policy */
57
        $policy = Injector::inst()->create(DeletePolicy::class, $record);
58
        $this->assertInstanceOf(DeleteRecordPolicy::class, $policy);
59
        $this->assertEmpty($policy->getDependantPolicies());
60
61
        // Delete
62
        $blocked = $policy->delete($record);
63
64
        // Item is deleted
65
        $this->assertEquals(
66
            0,
67
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_Record"')->value()
68
        );
69
        $this->assertFalse($blocked);
70
    }
71
72
    /**
73
     * @throws ValidationException
74
     */
75
    public function testDeleteLocalisedRecords()
76
    {
77
        // Write in en-US
78
        $record = new LocalisedRecord();
79
        $record->Title = 'us spanish content';
80
        $record->write();
81
        $recordID = $record->ID;
82
83
        // Write in en-nz
84
        FluentState::singleton()->withState(function (FluentState $newState) use ($recordID) {
85
            $newState->setLocale('en_NZ');
86
            $record = LocalisedRecord::get()->byID($recordID);
87
            $record->Title = 'nz content';
88
            $record->write();
89
        });
90
91
        // We should have 1 base record, 2 localised records
92
        $this->assertEquals(
93
            2,
94
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_LocalisedRecord_Localised"')->value()
95
        );
96
        $this->assertEquals(
97
            1,
98
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_LocalisedRecord"')->value()
99
        );
100
101
        // Delete in base locale should reduce a _Localised count
102
        $record->delete();
103
        $this->assertEquals(
104
            1,
105
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_LocalisedRecord_Localised"')->value()
106
        );
107
        $this->assertEquals(
108
            1,
109
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_LocalisedRecord"')->value()
110
        );
111
112
        // Delete in en-nz should remove all _Localised and base
113
        FluentState::singleton()->withState(function (FluentState $newState) use ($recordID) {
114
            $newState->setLocale('en_NZ');
115
            $record = LocalisedRecord::get()->byID($recordID);
116
            $record->delete();
117
        });
118
119
        $this->assertEquals(
120
            0,
121
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_LocalisedRecord_Localised"')->value()
122
        );
123
        $this->assertEquals(
124
            0,
125
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_LocalisedRecord"')->value()
126
        );
127
    }
128
129
    /**
130
     * @throws ValidationException
131
     */
132
    public function testDeleteFilteredRecords()
133
    {
134
        // Add to 2 locales
135
        $record = new FilteredRecord();
136
        $record->Title = 'Content';
137
        $record->write();
138
        $record->FilteredLocales()->add(Locale::get()->find('Locale', 'en_NZ'));
0 ignored issues
show
Bug introduced by
The method FilteredLocales() does not exist on TractorCow\Fluent\Tests\...Fixtures\FilteredRecord. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

138
        $record->/** @scrutinizer ignore-call */ 
139
                 FilteredLocales()->add(Locale::get()->find('Locale', 'en_NZ'));
Loading history...
139
        $record->FilteredLocales()->add(Locale::get()->find('Locale', 'es_US'));
140
        $recordID = $record->ID;
141
142
        // mapping table has 2 records
143
        $this->assertEquals(
144
            2,
145
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_FilteredRecord_FilteredLocales"')->value()
146
        );
147
148
        // Deleting in current locale (es_US) should reduce mapping table to 1
149
        $record->delete();
150
151
        // We should have 1 base record, 2 localised records
152
        $this->assertEquals(
153
            1,
154
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_FilteredRecord_FilteredLocales"')->value()
155
        );
156
        $this->assertEquals(
157
            1,
158
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_FilteredRecord"')->value()
159
        );
160
161
        // Delete in en_nz should remove the last filteredlocale mapping table, and also the base record
162
        FluentState::singleton()->withState(function (FluentState $newState) use ($recordID) {
163
            $newState->setLocale('en_NZ');
164
            $record = FilteredRecord::get()->byID($recordID);
165
            $record->delete();
166
        });
167
        $this->assertEquals(
168
            0,
169
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_FilteredRecord_FilteredLocales"')->value()
170
        );
171
        $this->assertEquals(
172
            0,
173
            DB::query('SELECT COUNT("ID") FROM "FluentDeleteTest_FilteredRecord"')->value()
174
        );
175
    }
176
}
177