Completed
Push — master ( 5bea2f...19eca5 )
by Franco
03:11 queued 40s
created

tests/DMSDocumentSetTest.php (1 issue)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
class DMSDocumentSetTest extends SapphireTest
4
{
5
    protected static $fixture_file = 'dmstest.yml';
6
7
    /**
8
     * Ensure that getDocuments is extensible
9
     */
10 View Code Duplication
    public function testGetDocumentsIsExtensible()
11
    {
12
        DMSDocumentSet::add_extension('StubRelatedDocumentExtension');
13
14
        $set = new DMSDocumentSet;
15
        $documents = $set->getDocuments();
16
17
        $this->assertCount(1, $documents);
18
        $this->assertSame('Extended', $documents->first()->Filename);
19
    }
20
21
    /**
22
     * Test that the GridField for documents isn't shown until you've saved the set
23
     */
24
    public function testGridFieldShowsWhenSetIsSaved()
25
    {
26
        $set = DMSDocumentSet::create();
27
28
        // Not in database yet
29
        $fields = $set->getCMSFields();
30
        $this->assertNull($fields->fieldByName('Root.Main.Documents'));
31
        $gridFieldNotice = $fields->fieldByName('Root.Main.GridFieldNotice');
32
        $this->assertNotNull($gridFieldNotice);
33
        $this->assertContains('Managing documents will be available', $gridFieldNotice->getContent());
34
35
        // In the database
36
        $set->Title = 'Testing';
37
        $set->write();
38
        $fields = $set->getCMSFields();
39
        $this->assertNotNull($fields->fieldByName('Root.Main.Documents'));
40
        $this->assertNull($fields->fieldByName('Root.Main.GridFieldNotice'));
41
    }
42
43
    public function testRelations()
44
    {
45
        $s1 = $this->objFromFixture('SiteTree', 's1');
46
        $s2 = $this->objFromFixture('SiteTree', 's2');
47
        $s4 = $this->objFromFixture('SiteTree', 's4');
48
49
        $ds1 = $this->objFromFixture('DMSDocumentSet', 'ds1');
50
        $ds2 = $this->objFromFixture('DMSDocumentSet', 'ds2');
51
        $ds3 = $this->objFromFixture('DMSDocumentSet', 'ds3');
52
53
        $this->assertCount(0, $s4->getDocumentSets(), 'Page 4 has no document sets associated');
54
        $this->assertCount(2, $s1->getDocumentSets(), 'Page 1 has 2 document sets');
55
        $this->assertEquals(array($ds1->ID, $ds2->ID), $s1->getDocumentSets()->column('ID'));
56
    }
57
58
    /**
59
     * Test that various components exist in the GridField config. See {@link DMSDocumentSet::getCMSFields} for context.
60
     */
61
    public function testDocumentGridFieldConfig()
62
    {
63
        $set = $this->objFromFixture('DMSDocumentSet', 'ds1');
64
        $fields = $set->getCMSFields();
65
        $gridField = $fields->fieldByName('Root.Main.Documents');
66
        $this->assertTrue((bool) $gridField->hasClass('documents'));
67
68
        /** @var GridFieldConfig $config */
69
        $config = $gridField->getConfig();
70
71
        $this->assertNotNull($addNew = $config->getComponentByType('DMSGridFieldAddNewButton'));
72
        $this->assertSame($set->ID, $addNew->getDocumentSetId());
73
74
        if (class_exists('GridFieldPaginatorWithShowAll')) {
75
            $this->assertNotNull($config->getComponentByType('GridFieldPaginatorWithShowAll'));
76
        } else {
77
            $paginator = $config->getComponentByType('GridFieldPaginator');
78
            $this->assertNotNull($paginator);
79
            $this->assertSame(15, $paginator->getItemsPerPage());
80
        }
81
82
        $sortableAssertion = class_exists('GridFieldSortableRows') ? 'assertNotNull' : 'assertNull';
83
        $this->$sortableAssertion($config->getComponentByType('GridFieldSortableRows'));
84
    }
85
86
    /**
87
     * Ensure that the display fields for the documents GridField can be returned
88
     */
89
    public function testGetDocumentDisplayFields()
90
    {
91
        $document = $this->objFromFixture('DMSDocumentSet', 'ds1');
92
        $this->assertInternalType('array', $document->getDocumentDisplayFields());
93
94
        Config::inst()->update('DMSDocument', 'display_fields', array('apple' => 'Apple', 'orange' => 'Orange'));
95
        $displayFields = $document->getDocumentDisplayFields();
96
        $this->assertContains('Apple', $displayFields);
97
        $this->assertContains('Orange', $displayFields);
98
        $this->assertArrayHasKey('ManuallyAdded', $displayFields);
99
        $this->assertContains('Added', $displayFields);
100
    }
101
102
    /**
103
     * Tests to ensure that the callback for formatting ManuallyAdded will return a nice label for the user
104
     */
105
    public function testNiceFormattingForManuallyAddedInGridField()
106
    {
107
        $fieldFormatting = $this->objFromFixture('DMSDocumentSet', 'ds1')
108
            ->getCMSFields()
109
            ->fieldByName('Root.Main.Documents')
110
            ->getConfig()
111
            ->getComponentByType('GridFieldDataColumns')
112
            ->getFieldFormatting();
113
114
        $this->assertArrayHasKey('ManuallyAdded', $fieldFormatting);
115
        $this->assertTrue(is_callable($fieldFormatting['ManuallyAdded']));
116
117
        $this->assertSame('Manually', $fieldFormatting['ManuallyAdded'](1));
118
        $this->assertSame('Query Builder', $fieldFormatting['ManuallyAdded'](0));
119
    }
120
121
    /**
122
     * Test that query fields can be added to the gridfield
123
     */
124
    public function testAddQueryFields()
125
    {
126
127
        /** @var DMSDocumentSet $set */
128
        $set = $this->objFromFixture('DMSDocumentSet', 'ds6');
129
        /** @var FieldList $fields */
130
        $fields = new FieldList(new TabSet('Root'));
131
        /** @var FieldList $fields */
132
        $set->addQueryFields($fields);
133
        $keyValuePairs = $fields->dataFieldByName('KeyValuePairs');
134
        $this->assertNotNull(
135
            $keyValuePairs,
136
            'addQueryFields() includes KeyValuePairs composite field'
137
        );
138
        $this->assertNotNull(
139
            $keyValuePairs->fieldByName('KeyValuePairs[Title]'),
140
            'addQueryFields() includes KeyValuePairs composite field'
141
        );
142
    }
143
144
    public function testAddQueryFieldsIsExtensible()
145
    {
146
147
        DMSDocumentSet::add_extension('StubDocumentSetMockExtension');
148
149
        $fields = new FieldList(new TabSet('Root'));
150
        $set = new DMSDocumentSet;
151
        $set->addQueryFields($fields);
152
153
        $this->assertNotNull(
0 ignored issues
show
The method assertNotNull() does not seem to exist on object<DMSDocumentSetTest>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
154
            $fields->dataFieldByName('ExtendedField'),
155
            'addQueryFields() is extendible as it included the field from the extension'
156
        );
157
    }
158
159
    /**
160
     * Ensure that the configurable shortcode handler key is a hidden field in the CMS
161
     */
162
    public function testShortcodeHandlerKeyFieldExists()
163
    {
164
        Config::inst()->update('DMS', 'shortcode_handler_key', 'unit-test');
165
166
        $set = DMSDocumentSet::create(array('Title' => 'TestSet'));
167
        $set->write();
168
169
        $fields = $set->getCMSFields();
170
        $field = $fields->fieldByName('Root.Main.DMSShortcodeHandlerKey');
171
172
        $this->assertInstanceOf('HiddenField', $field);
173
        $this->assertSame('unit-test', $field->Value());
174
    }
175
176
    /**
177
     * Ensure that if the module is available, the orderable rows GridField component is added
178
     */
179
    public function testDocumentsAreOrderable()
180
    {
181
        if (!class_exists('GridFieldSortableRows')) {
182
            $this->markTestSkipped('Test requires undefinedoffset/sortablegridfield installed.');
183
        }
184
185
        $fields = $this->objFromFixture('DMSDocumentSet', 'ds1')->getCMSFields();
186
187
        $gridField = $fields->fieldByName('Root.Main.Documents');
188
        $this->assertInstanceOf('GridField', $gridField);
189
190
        $this->assertInstanceOf(
191
            'GridFieldSortableRows',
192
            $gridField->getConfig()->getComponentByType('GridFieldSortableRows')
193
        );
194
    }
195
196
    /**
197
     * Test that extra documents are added after write
198
     */
199
    public function testSaveLinkedDocuments()
200
    {
201
        /** @var DMSDocumentSet $set */
202
        $set = $this->objFromFixture('DMSDocumentSet', 'dsSaveLinkedDocuments');
203
        // Assert initially docs
204
        $this->assertEquals(1, $set->getDocuments()->count(), 'Set has 1 document');
205
        // Now apply the query and see if 2 extras were added with CreatedByID filter
206
        $set->KeyValuePairs = '{"Filename":"extradoc3"}';
207
        $set->saveLinkedDocuments();
208
        $this->assertEquals(2, $set->getDocuments()->count(), 'Set has 2 documents');
209
    }
210
211
    /**
212
     * Tests that an exception is thrown if no title entered for a DMSDocumentSet.
213
     * @expectedException ValidationException
214
     */
215
    public function testExceptionOnNoTitleGiven()
216
    {
217
        DMSDocumentSet::create(array('Title' => ''))->write();
218
    }
219
220
    /**
221
     * Ensure that when editing in a page context that the "page" field is removed, or is labelled "Show on page"
222
     * otherwise
223
     */
224
    public function testPageFieldRemovedWhenEditingInPageContext()
225
    {
226
        $set = $this->objFromFixture('DMSDocumentSet', 'ds1');
227
228
        $fields = $set->getCMSFields();
229
        $this->assertInstanceOf('DropdownField', $fields->fieldByName('Root.Main.PageID'));
230
231
        $pageController = new CMSPageEditController;
232
        $pageController->pushCurrent();
233
234
        $fields = $set->getCMSFields();
235
        $this->assertNull($fields->fieldByName('Root.Main.PageID'));
236
    }
237
}
238