silverstripe-autotoc 

silverstripe-autotoc Git Source Tree

Root/tests/AutotocTest.php

1<?php
2
3namespace eNTiDi\Autotoc\Tests;
4
5use eNTiDi\Autotoc\Autotoc;
6use eNTiDi\Autotoc\Tests\TestObject;
7use SilverStripe\Core\Config\Config;
8use SilverStripe\Dev\SapphireTest;
9use SilverStripe\View\ArrayData;
10
11class AutotocTest extends SapphireTest
12{
13 public function setUp()
14 {
15 parent::setUp();
16
17 // Enable the Autotoc extension on TestObject
18 TestObject::add_extension('eNTiDi\Autotoc\Autotoc');
19 }
20
21 public function testBodyAutotoc()
22 {
23 $obj = new TestObject;
24 $this->assertEquals(' data-spy="scroll" data-target=".toc"', $obj->getBodyAutotoc());
25 }
26
27 public function testContentField()
28 {
29 $obj = new TestObject;
30 $obj->Content = '<p>Content</p>';
31 $obj->Test2 = '<p>Test2</p>';
32
33 // Check the default content field is Content
34 $this->assertEquals('<p>Content</p>', $obj->OriginalContentField);
35
36 // Try to change the content field
37 $obj->config()->update('content_field', 'Test2');
38 $this->assertEquals('<p>Test2</p>', $obj->OriginalContentField);
39
40 // Change it again
41 $obj->config()->update('content_field', 'Unexistent');
42 $this->assertEquals('', $obj->OriginalContentField);
43
44 // Restore original value
45 $obj->config()->update('content_field', 'Content');
46 }
47
48 public function testGetAutotoc()
49 {
50 $obj = new TestObject;
51 $toc = $obj->getAutotoc();
52 $this->assertNull($toc);
53
54 $obj->Content = file_get_contents(__DIR__.'/test1');
55 $obj->Test2 = file_get_contents(__DIR__.'/test2');
56
57 // Old TOC should still be cached
58 $toc = $obj->getAutotoc();
59 $this->assertNull($toc);
60
61 $obj->clearAutotoc();
62
63 $toc = $obj->getAutotoc();
64 $this->assertTrue($toc instanceof ArrayData);
65 $this->assertEquals(5, $toc->Children->count());
66 $this->assertStringEqualsFile(__DIR__.'/test1', $obj->OriginalContentField);
67 $this->assertStringEqualsFile(__DIR__.'/html2', $obj->ContentField);
68 $this->assertStringEqualsFile(__DIR__.'/html2', $obj->Content);
69
70 // Change the content field
71 $obj->config()->update('content_field', 'Test2');
72 $obj->clearAutotoc();
73
74 $toc = $obj->getAutotoc();
75 $this->assertNull($toc);
76 $this->assertStringEqualsFile(__DIR__.'/test2', $obj->OriginalContentField);
77 $this->assertStringEqualsFile(__DIR__.'/test2', $obj->ContentField);
78 }
79
80 public function testAugmentCallback()
81 {
82 $obj = new TestObject;
83 $obj->Content = file_get_contents(__DIR__.'/test1');
84 $obj->Test2 = file_get_contents(__DIR__.'/test2');
85
86 // Change the augmenter at class level
87 Config::inst()->update(
88 get_class($obj),
89 'augment_callback',
90 'eNTiDi\Autotoc\Tocifier::prependAnchor'
91 );
92 $obj->clearAutotoc();
93
94 $toc = $obj->getAutotoc();
95 $this->assertEquals(5, $toc->Children->count());
96 $this->assertStringEqualsFile(__DIR__.'/html1', $obj->Content);
97
98 // Change the augmenter at install level: should have higher
99 // precedence
100 $obj->config()->update(
101 'augment_callback',
102 'eNTiDi\Autotoc\Tocifier::setId'
103 );
104 $obj->clearAutotoc();
105
106 $toc = $obj->getAutotoc();
107 $this->assertEquals(5, $toc->Children->count());
108 $this->assertStringEqualsFile(__DIR__.'/html2', $obj->Content);
109 }
110
111 public function testOverriding()
112 {
113 $html = file_get_contents(__DIR__.'/test1');
114
115 // The content field is not expected to be changed dynamically:
116 // we need to set it *before* creating the test instance
117 Config::inst()->update(TestObject::class, 'content_field', 'Something');
118 $obj = new TestObject;
119 $obj->Content = $html;
120 $obj->Test2 = $html;
121 $this->assertEquals($html, $obj->Content);
122 $this->assertEquals($html, $obj->Test2);
123
124 Config::inst()->update(TestObject::class, 'content_field', 'Content');
125 $obj = new TestObject;
126 $obj->Content = $html;
127 $obj->Test2 = $html;
128 $this->assertNotEquals($html, $obj->Content);
129 $this->assertEquals($html, $obj->Test2);
130
131 Config::inst()->update(TestObject::class, 'content_field', 'Test2');
132 $obj = new TestObject;
133 $obj->Content = $html;
134 $obj->Test2 = $html;
135 // The overriding works on a class basis, so the Content field
136 // will still be overriden
137 $this->assertNotEquals($html, $obj->Content);
138 $this->assertNotEquals($html, $obj->Test2);
139 }
140}

Archive Download this file