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
        /** @var DMSDocumentSet $set */
127
        $set = $this->objFromFixture('DMSDocumentSet', 'ds6');
128
        /** @var FieldList $fields */
129
        $fields = new FieldList(new TabSet('Root'));
130
        /** @var FieldList $fields */
131
        $set->addQueryFields($fields);
132
        $keyValuePairs = $fields->dataFieldByName('KeyValuePairs');
133
        $this->assertNotNull(
134
            $keyValuePairs,
135
            'addQueryFields() includes KeyValuePairs composite field'
136
        );
137
        $this->assertNotNull(
138
            $keyValuePairs->fieldByName('KeyValuePairs[Title]'),
139
            'addQueryFields() includes KeyValuePairs composite field'
140
        );
141
    }
142
143
    /**
144
     * Ensure that the "direction" dropdown field has user friendly field labels
145
     */
146
    public function testQueryBuilderDirectionFieldHasFriendlyLabels()
147
    {
148
        $fields = $this->objFromFixture('DMSDocumentSet', 'ds1')->getCMSFields();
149
150
        $dropdown = $fields->fieldByName('Root.QueryBuilder')->FieldList()->filterByCallback(function ($field) {
151
            return $field instanceof FieldGroup;
152
        })->first()->fieldByName('SortByDirection');
153
154
        $this->assertInstanceOf('DropdownField', $dropdown);
0 ignored issues
show
The method assertInstanceOf() 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...
155
        $source = $dropdown->getSource();
156
        $this->assertContains('Ascending', $source);
157
        $this->assertContains('Descending', $source);
158
    }
159
160
    /**
161
     * Ensure that the configurable shortcode handler key is a hidden field in the CMS
162
     */
163
    public function testShortcodeHandlerKeyFieldExists()
164
    {
165
        Config::inst()->update('DMS', 'shortcode_handler_key', 'unit-test');
166
167
        $set = DMSDocumentSet::create(array('Title' => 'TestSet'));
168
        $set->write();
169
170
        $fields = $set->getCMSFields();
171
        $field = $fields->fieldByName('Root.Main.DMSShortcodeHandlerKey');
172
173
        $this->assertInstanceOf('HiddenField', $field);
174
        $this->assertSame('unit-test', $field->Value());
175
    }
176
177
    /**
178
     * Ensure that if the module is available, the orderable rows GridField component is added
179
     */
180
    public function testDocumentsAreOrderable()
181
    {
182
        if (!class_exists('GridFieldSortableRows')) {
183
            $this->markTestSkipped('Test requires undefinedoffset/sortablegridfield installed.');
184
        }
185
186
        $fields = $this->objFromFixture('DMSDocumentSet', 'ds1')->getCMSFields();
187
188
        $gridField = $fields->fieldByName('Root.Main.Documents');
189
        $this->assertInstanceOf('GridField', $gridField);
190
191
        $this->assertInstanceOf(
192
            'GridFieldSortableRows',
193
            $gridField->getConfig()->getComponentByType('GridFieldSortableRows')
194
        );
195
    }
196
197
    /**
198
     * Test that extra documents are added after write
199
     */
200
    public function testSaveLinkedDocuments()
201
    {
202
        /** @var DMSDocumentSet $set */
203
        $set = $this->objFromFixture('DMSDocumentSet', 'dsSaveLinkedDocuments');
204
        // Assert initially docs
205
        $this->assertEquals(1, $set->getDocuments()->count(), 'Set has 1 document');
206
        // Now apply the query and see if 2 extras were added with CreatedByID filter
207
        $set->KeyValuePairs = '{"Filename":"extradoc3"}';
208
        $set->saveLinkedDocuments();
209
        $this->assertEquals(2, $set->getDocuments()->count(), 'Set has 2 documents');
210
    }
211
212
    /**
213
     * Tests that an exception is thrown if no title entered for a DMSDocumentSet.
214
     * @expectedException ValidationException
215
     */
216
    public function testExceptionOnNoTitleGiven()
217
    {
218
        DMSDocumentSet::create(array('Title' => ''))->write();
219
    }
220
221
    /**
222
     * Ensure that when editing in a page context that the "page" field is removed, or is labelled "Show on page"
223
     * otherwise
224
     */
225
    public function testPageFieldRemovedWhenEditingInPageContext()
226
    {
227
        $set = $this->objFromFixture('DMSDocumentSet', 'ds1');
228
229
        $fields = $set->getCMSFields();
230
        $this->assertInstanceOf('DropdownField', $fields->fieldByName('Root.Main.PageID'));
231
232
        $pageController = new CMSPageEditController;
233
        $pageController->pushCurrent();
234
235
        $fields = $set->getCMSFields();
236
        $this->assertNull($fields->fieldByName('Root.Main.PageID'));
237
    }
238
}
239