Completed
Push — master ( f4c8b4...9b7bf9 )
by Daniel
16s queued 11s
created

testPublishingPageWithModifiedLinksRewritesLinks()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 54
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 32
nc 1
nop 0
dl 0
loc 54
rs 9.6716
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace SilverStripe\CMS\Tests\Model;
4
5
use SilverStripe\CMS\Model\SiteTree;
6
use SilverStripe\Control\Director;
7
use SilverStripe\Control\HTTP;
8
use SilverStripe\Dev\SapphireTest;
9
use SilverStripe\Versioned\Versioned;
10
11
/**
12
 * Tests {@see SiteTreeLinkTracking} broken links feature: LinkTracking
13
 */
14
class SiteTreeBacklinksTest extends SapphireTest
15
{
16
    protected static $fixture_file = "SiteTreeBacklinksTest.yml";
17
18
    protected static $required_extensions = [
19
        SiteTree::class => [
20
            SiteTreeBacklinksTest_DOD::class,
21
        ],
22
    ];
23
24
    public function setUp()
25
    {
26
        parent::setUp();
27
28
        // Log in as admin so that we don't run into permission issues.  That's not what we're
29
        // testing here.
30
        $this->logInWithPermission('ADMIN');
31
    }
32
33
    public function testSavingPageWithLinkAddsBacklink()
34
    {
35
        // load page 1
36
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
37
38
        // assert backlink to page 2 doesn't exist
39
        $page2 = $this->objFromFixture(SiteTree::class, 'page2');
40
        $this->assertNotContains(
41
            $page2->ID,
42
            $page1->BackLinkTracking()->column('ID'),
43
            'Assert backlink to page 2 doesn\'t exist'
44
        );
45
46
        // add hyperlink to page 1 on page 2
47
        $page2->Content .= '<p><a href="[sitetree_link,id=' . $page1->ID . ']">Testing page 1 link</a></p>';
48
        $page2->write();
49
50
        // load page 1
51
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
52
53
        // assert backlink to page 2 exists
54
        $this->assertContains($page2->ID, $page1->BackLinkTracking()->column('ID'), 'Assert backlink to page 2 exists');
55
    }
56
57
    public function testRemovingLinkFromPageRemovesBacklink()
58
    {
59
        // load page 1
60
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
61
62
        // assert backlink to page 3 exits
63
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
64
        $this->assertContains($page3->ID, $page1->BackLinkTracking()->column('ID'), 'Assert backlink to page 3 exists');
65
66
        // remove hyperlink to page 1
67
        $page3->Content = '<p>No links anymore!</p>';
68
        $page3->write();
69
70
        // load page 1
71
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
72
73
        // assert backlink to page 3 exists
74
        $this->assertNotContains(
75
            $page3->ID,
76
            $page1->BackLinkTracking()->column('ID'),
77
            'Assert backlink to page 3 doesn\'t exist'
78
        );
79
    }
80
81
    public function testChangingUrlOnDraftSiteRewritesLink()
82
    {
83
        // load page 1
84
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
85
86
        // assert backlink to page 3 exists
87
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
88
        $this->assertContains($page3->ID, $page1->BackLinkTracking()->column('ID'), 'Assert backlink to page 3 exists');
89
90
        // assert hyperlink to page 1's current url exists on page 3
91
        $links = HTTP::getLinksIn($page3->obj('Content')->forTemplate());
92
        $this->assertContains(
93
            Director::baseURL() . 'page1/',
94
            $links,
95
            'Assert hyperlink to page 1\'s current url exists on page 3'
96
        );
97
98
        // change url of page 1
99
        $page1->URLSegment = 'new-url-segment';
100
        $page1->write();
101
102
        // load page 3
103
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
104
105
        // assert hyperlink to page 1's new url exists
106
        $links = HTTP::getLinksIn($page3->obj('Content')->forTemplate());
107
        $this->assertContains(
108
            Director::baseURL() . 'new-url-segment/',
109
            $links,
110
            'Assert hyperlink to page 1\'s new url exists on page 3'
111
        );
112
    }
113
114
    public function testChangingUrlOnLiveSiteRewritesLink()
115
    {
116
        // publish page 1 & 3
117
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
118
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
119
        $this->assertTrue($page1->publishRecursive());
120
        $this->assertTrue($page3->publishRecursive());
121
122
        // load pages from live
123
        $page1live = Versioned::get_one_by_stage(SiteTree::class, 'Live', '"SiteTree"."ID" = ' . $page1->ID);
124
        $page3live = Versioned::get_one_by_stage(SiteTree::class, 'Live', '"SiteTree"."ID" = ' . $page3->ID);
125
126
        // assert backlink to page 3 exists
127
        $this->assertContains(
128
            $page3live->ID,
129
            $page1live->BackLinkTracking()->column('ID'),
130
            'Assert backlink to page 3 exists'
131
        );
132
133
        // assert hyperlink to page 1's current url exists on page 3
134
        $links = HTTP::getLinksIn($page3live->obj('Content')->forTemplate());
135
        $this->assertContains(
136
            Director::baseURL() . 'page1/',
137
            $links,
138
            'Assert hyperlink to page 1\'s current url exists on page 3'
139
        );
140
141
        // change url of page 1
142
        $page1live->URLSegment = 'new-url-segment';
143
        $page1live->writeToStage('Live');
144
145
        // load page 3 from live
146
        $page3live = Versioned::get_one_by_stage(SiteTree::class, 'Live', '"SiteTree"."ID" = ' . $page3->ID);
147
148
        // assert hyperlink to page 1's new url exists
149
        Versioned::set_stage(Versioned::LIVE);
150
        $links = HTTP::getLinksIn($page3live->obj('Content')->forTemplate());
151
        $this->assertContains(
152
            Director::baseURL() . 'new-url-segment/',
153
            $links,
154
            'Assert hyperlink to page 1\'s new url exists on page 3'
155
        );
156
    }
157
158
    public function testPublishingPageWithModifiedUrlRewritesLink()
159
    {
160
        // publish page 1 & 3
161
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
162
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
163
164
        $this->assertTrue($page1->publishRecursive());
165
        $this->assertTrue($page3->publishRecursive());
166
167
        // load page 3 from live
168
        $page3live = Versioned::get_one_by_stage(SiteTree::class, 'Live', '"SiteTree"."ID" = ' . $page3->ID);
169
170
        // assert hyperlink to page 1's current url exists
171
        $links = HTTP::getLinksIn($page3live->obj('Content')->forTemplate());
172
        $this->assertContains(
173
            Director::baseURL() . 'page1/',
174
            $links,
175
            'Assert hyperlink to page 1\'s current url exists on page 3'
176
        );
177
178
        // rename url of page 1 on stage
179
        $page1->URLSegment = 'new-url-segment';
180
        $page1->write();
181
182
        // assert hyperlink to page 1's current publish url exists
183
        $page3live = Versioned::get_one_by_stage(SiteTree::class, 'Live', '"SiteTree"."ID" = ' . $page3->ID);
184
        Versioned::set_stage(Versioned::LIVE);
185
        $links = HTTP::getLinksIn($page3live->obj('Content')->forTemplate());
186
        $this->assertContains(
187
            Director::baseURL() . 'page1/',
188
            $links,
189
            'Assert hyperlink to page 1\'s current published url exists on page 3'
190
        );
191
192
193
        // publish page 1
194
        $this->assertTrue($page1->publishRecursive());
195
196
        // assert hyperlink to page 1's new published url exists
197
        $page3live = Versioned::get_one_by_stage(SiteTree::class, 'Live', '"SiteTree"."ID" = ' . $page3->ID);
198
        $links = HTTP::getLinksIn($page3live->obj('Content')->forTemplate());
199
        $this->assertContains(
200
            Director::baseURL() . 'new-url-segment/',
201
            $links,
202
            'Assert hyperlink to page 1\'s new published url exists on page 3'
203
        );
204
    }
205
206
    public function testPublishingPageWithModifiedLinksRewritesLinks()
207
    {
208
        // publish page 1 & 3
209
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
210
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
211
        $this->assertTrue($page1->publishRecursive());
212
        $this->assertTrue($page3->publishRecursive());
213
214
        // assert hyperlink to page 1's current url exists
215
        $links = HTTP::getLinksIn($page3->obj('Content')->forTemplate());
216
        $this->assertContains(
217
            Director::baseURL() . 'page1/',
218
            $links,
219
            'Assert hyperlink to page 1\'s current published url exists on page 3'
220
        );
221
222
        // change page 1 url on draft
223
        $page1->URLSegment = 'new-url-segment';
224
225
        // save page 1
226
        $page1->write();
227
228
        // assert page 3 on draft contains new page 1 url
229
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
230
        $links = HTTP::getLinksIn($page3->obj('Content')->forTemplate());
231
        $this->assertContains(
232
            Director::baseURL() . 'new-url-segment/',
233
            $links,
234
            'Assert hyperlink to page 1\'s current draft url exists on page 3'
235
        );
236
237
        // publish page 3
238
        $this->assertTrue($page3->publishRecursive());
239
240
        // assert page 3 on published site contains old page 1 url
241
        $page3live = Versioned::get_one_by_stage(SiteTree::class, 'Live', '"SiteTree"."ID" = ' . $page3->ID);
242
        Versioned::set_stage(Versioned::LIVE);
243
        $links = HTTP::getLinksIn($page3live->obj('Content')->forTemplate());
244
        $this->assertContains(
245
            Director::baseURL() . 'page1/',
246
            $links,
247
            'Assert hyperlink to page 1\'s current published url exists on page 3'
248
        );
249
250
        // publish page 1
251
        $this->assertTrue($page1->publishRecursive());
252
253
        // assert page 3 on published site contains new page 1 url
254
        $page3live = Versioned::get_one_by_stage(SiteTree::class, 'Live', '"SiteTree"."ID" = ' . $page3->ID);
255
        $links = HTTP::getLinksIn($page3live->obj('Content')->forTemplate());
256
        $this->assertContains(
257
            Director::baseURL() . 'new-url-segment/',
258
            $links,
259
            'Assert hyperlink to page 1\'s current published url exists on page 3'
260
        );
261
    }
262
263
    public function testLinkTrackingOnExtraContentFields()
264
    {
265
        /** @var SiteTree $page1 */
266
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
267
        /** @var SiteTree $page2 */
268
        $page2 = $this->objFromFixture(SiteTree::class, 'page2');
269
        $page1->publishRecursive();
270
        $page2->publishRecursive();
271
272
        // assert backlink to page 2 doesn't exist
273
        $this->assertNotContains(
274
            $page2->ID,
275
            $page1->BackLinkTracking()->column('ID'),
276
            'Assert backlink to page 2 doesn\'t exist'
277
        );
278
279
        // add hyperlink to page 1 on page 2
280
        $page2->ExtraContent .= '<p><a href="[sitetree_link,id=' . $page1->ID . ']">Testing page 1 link</a></p>';
281
        $page2->write();
282
        $page2->publishRecursive();
283
284
        // assert backlink to page 2 exists
285
        $this->assertContains($page2->ID, $page1->BackLinkTracking()->column('ID'), 'Assert backlink to page 2 exists');
286
287
        // update page1 url
288
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
289
        $page1->URLSegment = "page1-new-url";
290
        $page1->write();
291
292
        // confirm that draft link on page2 has been rewritten
293
        $page2 = $this->objFromFixture(SiteTree::class, 'page2');
294
        $this->assertEquals(
295
            '<p><a href="' . Director::baseURL() . 'page1-new-url/">Testing page 1 link</a></p>',
296
            $page2->obj('ExtraContent')->forTemplate()
297
        );
298
299
        // confirm that published link hasn't
300
        $page2Live = Versioned::get_one_by_stage(SiteTree::class, "Live", "\"SiteTree\".\"ID\" = $page2->ID");
301
        Versioned::set_stage(Versioned::LIVE);
302
        $this->assertEquals(
303
            '<p><a href="' . Director::baseURL() . 'page1/">Testing page 1 link</a></p>',
304
            $page2Live->obj('ExtraContent')->forTemplate()
305
        );
306
307
        // publish page1 and confirm that the link on the published page2 has now been updated
308
        $page1->publishRecursive();
309
        $page2Live = Versioned::get_one_by_stage(SiteTree::class, "Live", "\"SiteTree\".\"ID\" = $page2->ID");
310
        $this->assertEquals(
311
            '<p><a href="' . Director::baseURL() . 'page1-new-url/">Testing page 1 link</a></p>',
312
            $page2Live->obj('ExtraContent')->forTemplate()
313
        );
314
315
        // Edit draft again
316
        Versioned::set_stage(Versioned::DRAFT);
317
        $page2->ExtraContent = '<p>No links anymore!</p>';
318
        $page2->write();
319
320
        // assert backlink to page 2 no longer exists
321
        $this->assertNotContains(
322
            $page2->ID,
323
            $page1->BackLinkTracking()->column('ID'),
324
            'Assert backlink to page 2 has been removed'
325
        );
326
    }
327
}
328