Completed
Push — master ( d001a9...e5c7d1 )
by Robbie
27s queued 18s
created

tests/DMSDocumentSetTest.php (8 issues)

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
        // Test that the notification field exists
143
        $this->assertNotNull($fields->fieldByName('Root.QueryBuilder.GridFieldNotice'));
144
145
        // Test that Tags__ID field exists
146
        $this->assertContains(
147
            'Tags can be set in the taxonomy area,',
148
            $keyValuePairs->fieldByName('KeyValuePairs[Tags__ID]')->RightTitle()
149
        );
150
    }
151
152
    /**
153
     * Ensure that the "direction" dropdown field has user friendly field labels
154
     */
155
    public function testQueryBuilderDirectionFieldHasFriendlyLabels()
156
    {
157
        $fields = $this->objFromFixture('DMSDocumentSet', 'ds1')->getCMSFields();
158
159
        $dropdown = $fields->fieldByName('Root.QueryBuilder')->FieldList()->filterByCallback(function ($field) {
160
            return $field instanceof FieldGroup;
161
        })->first()->fieldByName('SortByDirection');
162
163
        $this->assertInstanceOf('DropdownField', $dropdown);
164
        $source = $dropdown->getSource();
165
        $this->assertContains('Ascending', $source);
166
        $this->assertContains('Descending', $source);
167
    }
168
169
    /**
170
     * Ensure that the configurable shortcode handler key is a hidden field in the CMS
171
     */
172
    public function testShortcodeHandlerKeyFieldExists()
173
    {
174
        Config::inst()->update('DMS', 'shortcode_handler_key', 'unit-test');
175
176
        $set = DMSDocumentSet::create(array('Title' => 'TestSet'));
177
        $set->write();
178
179
        $fields = $set->getCMSFields();
180
        $field = $fields->fieldByName('Root.Main.DMSShortcodeHandlerKey');
181
182
        $this->assertInstanceOf('HiddenField', $field);
183
        $this->assertSame('unit-test', $field->Value());
184
    }
185
186
    /**
187
     * Ensure that if the module is available, the orderable rows GridField component is added
188
     */
189
    public function testDocumentsAreOrderable()
190
    {
191
        if (!class_exists('GridFieldSortableRows')) {
192
            $this->markTestSkipped('Test requires undefinedoffset/sortablegridfield installed.');
193
        }
194
195
        $fields = $this->objFromFixture('DMSDocumentSet', 'ds1')->getCMSFields();
196
197
        $gridField = $fields->fieldByName('Root.Main.Documents');
198
        $this->assertInstanceOf('GridField', $gridField);
199
200
        $this->assertInstanceOf(
201
            'GridFieldSortableRows',
202
            $gridField->getConfig()->getComponentByType('GridFieldSortableRows')
203
        );
204
    }
205
206
    /**
207
     * Test that extra documents are added after write
208
     */
209
    public function testSaveLinkedDocuments()
210
    {
211
        /** @var DMSDocumentSet $set */
212
        $set = $this->objFromFixture('DMSDocumentSet', 'dsSaveLinkedDocuments');
213
        // Assert initially docs
214
        $this->assertEquals(1, $set->getDocuments()->count(), 'Set has 1 document');
215
        // Now apply the query and see if 2 extras were added with CreatedByID filter
216
        $set->KeyValuePairs = '{"Filename":"extradoc3"}';
217
        $set->saveLinkedDocuments();
218
        $this->assertEquals(2, $set->getDocuments()->count(), 'Set has 2 documents');
219
    }
220
221
    /**
222
     * Tests that an exception is thrown if no title entered for a DMSDocumentSet.
223
     * @expectedException ValidationException
224
     */
225
    public function testExceptionOnNoTitleGiven()
226
    {
227
        DMSDocumentSet::create(array('Title' => ''))->write();
228
    }
229
230
    /**
231
     * Ensure that when editing in a page context that the "page" field is removed, or is labelled "Show on page"
232
     * otherwise
233
     */
234
    public function testPageFieldRemovedWhenEditingInPageContext()
235
    {
236
        $set = $this->objFromFixture('DMSDocumentSet', 'ds1');
237
238
        $fields = $set->getCMSFields();
239
        $this->assertInstanceOf('DropdownField', $fields->fieldByName('Root.Main.PageID'));
240
241
        $pageController = new CMSPageEditController;
242
        $pageController->pushCurrent();
243
244
        $fields = $set->getCMSFields();
245
        $this->assertNull($fields->fieldByName('Root.Main.PageID'));
246
    }
247
248
    /**
249
     * Tests all crud permissions
250
     */
251
    public function testPermissions()
252
    {
253
        if ($member = Member::currentUser()) {
254
            $member->logout();
255
        }
256
257
        $set = $this->objFromFixture('DMSDocumentSet', 'ds1');
258
259
        $this->assertFalse($set->canCreate());
0 ignored issues
show
The method assertFalse() 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...
260
        $this->assertFalse($set->canDelete());
0 ignored issues
show
The method assertFalse() 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...
261
        $this->assertFalse($set->canEdit());
0 ignored issues
show
The method assertFalse() 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...
262
        $this->assertFalse($set->canView());
0 ignored issues
show
The method assertFalse() 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...
263
264
        $this->logInWithPermission('CMS_ACCESS_DMSDocumentAdmin');
265
        $this->assertTrue($set->canCreate());
0 ignored issues
show
The method assertTrue() 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...
266
        $this->assertTrue($set->canDelete());
0 ignored issues
show
The method assertTrue() 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...
267
        $this->assertTrue($set->canEdit());
0 ignored issues
show
The method assertTrue() 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...
268
        $this->assertTrue($set->canView());
0 ignored issues
show
The method assertTrue() 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...
269
    }
270
}
271