silverstripe /
silverstripe-dms
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
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'); |
||
|
0 ignored issues
–
show
|
|||
| 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'); |
||
|
0 ignored issues
–
show
$ds3 is not used, you could remove the assignment.
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently. $myVar = 'Value';
$higher = false;
if (rand(1, 6) > 3) {
$higher = true;
} else {
$higher = false;
}
Both the Loading history...
|
|||
| 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()); |
||
| 260 | $this->assertFalse($set->canDelete()); |
||
| 261 | $this->assertFalse($set->canEdit()); |
||
| 262 | $this->assertFalse($set->canView()); |
||
| 263 | |||
| 264 | $this->logInWithPermission('CMS_ACCESS_DMSDocumentAdmin'); |
||
| 265 | $this->assertTrue($set->canCreate()); |
||
| 266 | $this->assertTrue($set->canDelete()); |
||
| 267 | $this->assertTrue($set->canEdit()); |
||
| 268 | $this->assertTrue($set->canView()); |
||
| 269 | } |
||
| 270 | } |
||
| 271 |
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.
Both the
$myVarassignment in line 1 and the$higherassignment in line 2 are dead. The first because$myVaris never used and the second because$higheris always overwritten for every possible time line.