/sapphire/tests/filesystem/FolderTest.php

https://github.com/benbruscella/vpcounselling.com · PHP · 255 lines · 166 code · 49 blank · 40 comment · 7 complexity · d78ffe35ebdf1a07c92f95643bc25948 MD5 · raw file

  1. <?php
  2. /**
  3. * @author Ingo Schommer (ingo at silverstripe dot com)
  4. * @todo There's currently no way to save outside of assets/ folder
  5. *
  6. * @package sapphire
  7. * @subpackage tests
  8. */
  9. class FolderTest extends SapphireTest {
  10. static $fixture_file = 'sapphire/tests/filesystem/FileTest.yml';
  11. function testCreateFromNameAndParentIDSetsFilename() {
  12. $folder1 = $this->objFromFixture('Folder', 'folder1');
  13. $newFolder = new Folder();
  14. $newFolder->Name = 'CreateFromNameAndParentID';
  15. $newFolder->ParentID = $folder1->ID;
  16. $newFolder->write();
  17. $this->assertEquals($folder1->Filename . 'CreateFromNameAndParentID/', $newFolder->Filename);
  18. }
  19. function testAllChildrenIncludesFolders() {
  20. $folder1 = $this->objFromFixture('Folder', 'folder1');
  21. $subfolder1 = $this->objFromFixture('Folder', 'folder1-subfolder1');
  22. $file1 = $this->objFromFixture('File', 'file1-folder1');
  23. $children = $folder1->allChildren();
  24. $this->assertEquals(2, $children->Count());
  25. $this->assertContains($subfolder1->ID, $children->column('ID'));
  26. $this->assertContains($file1->ID, $children->column('ID'));
  27. }
  28. function testFindOrMake() {
  29. $path = '/FolderTest/testFindOrMake/';
  30. $folder = Folder::findOrMake($path);
  31. $this->assertEquals(ASSETS_DIR . $path,$folder->getRelativePath(),
  32. 'Nested path information is correctly saved to database (with trailing slash)'
  33. );
  34. $this->assertTrue(file_exists(ASSETS_PATH . $path), 'File');
  35. $parentFolder = DataObject::get_one('Folder', '"Name" = \'FolderTest\'');
  36. $this->assertNotNull($parentFolder);
  37. $this->assertEquals($parentFolder->ID, $folder->ParentID);
  38. $path = '/FolderTest/testFindOrMake'; // no trailing slash
  39. $folder = Folder::findOrMake($path);
  40. $this->assertEquals(ASSETS_DIR . $path . '/',$folder->getRelativePath(),
  41. 'Path information is correctly saved to database (without trailing slash)'
  42. );
  43. $path = '/assets/'; // relative to "assets/" folder, should produce "assets/assets/"
  44. $folder = Folder::findOrMake($path);
  45. $this->assertEquals(ASSETS_DIR . $path,$folder->getRelativePath(),
  46. 'A folder named "assets/" within "assets/" is allowed'
  47. );
  48. }
  49. /**
  50. * @see FileTest->testSetNameChangesFilesystemOnWrite()
  51. */
  52. function testSetNameChangesFilesystemOnWrite() {
  53. $folder1 = $this->objFromFixture('Folder', 'folder1');
  54. $subfolder1 = $this->objFromFixture('Folder', 'folder1-subfolder1');
  55. $file1 = $this->objFromFixture('File', 'file1-folder1');
  56. $oldPathFolder1 = $folder1->getFullPath();
  57. $oldPathSubfolder1 = $subfolder1->getFullPath();
  58. $oldPathFile1 = $file1->getFullPath();
  59. // Before write()
  60. $folder1->Name = 'FileTest-folder1-renamed';
  61. $this->assertFileExists($oldPathFolder1, 'Old path is still present');
  62. $this->assertFileNotExists($folder1->getFullPath(), 'New path is updated in memory, not written before write() is called');
  63. $this->assertFileExists($oldPathFile1, 'Old file is still present');
  64. // TODO setters currently can't update in-memory
  65. // $this->assertFileNotExists($file1->getFullPath(), 'New path on contained files is updated in memory, not written before write() is called');
  66. // $this->assertFileNotExists($subfolder1->getFullPath(), 'New path on subfolders is updated in memory, not written before write() is called');
  67. $folder1->write();
  68. // After write()
  69. // Reload state
  70. clearstatcache();
  71. DataObject::flush_and_destroy_cache();
  72. $folder1 = DataObject::get_by_id('Folder', $folder1->ID);
  73. $file1 = DataObject::get_by_id('File', $file1->ID);
  74. $subfolder1 = DataObject::get_by_id('Folder', $subfolder1->ID);
  75. $this->assertFileNotExists($oldPathFolder1, 'Old path is removed after write()');
  76. $this->assertFileExists($folder1->getFullPath(), 'New path is created after write()');
  77. $this->assertFileNotExists($oldPathFile1, 'Old file is removed after write()');
  78. $this->assertFileExists($file1->getFullPath(), 'New file path is created after write()');
  79. $this->assertFileNotExists($oldPathSubfolder1, 'Subfolder is removed after write()');
  80. $this->assertFileExists($subfolder1->getFullPath(), 'New subfolder path is created after write()');
  81. // Clean up after ourselves - tearDown() doesn't like renamed fixtures
  82. $folder1->delete(); // implicitly deletes subfolder as well
  83. }
  84. /**
  85. * @see FileTest->testSetParentIDChangesFilesystemOnWrite()
  86. */
  87. function testSetParentIDChangesFilesystemOnWrite() {
  88. $folder1 = $this->objFromFixture('Folder', 'folder1');
  89. $folder2 = $this->objFromFixture('Folder', 'folder2');
  90. $oldPathFolder1 = $folder1->getFullPath();
  91. // set ParentID
  92. $folder1->ParentID = $folder2->ID;
  93. // Before write()
  94. $this->assertFileExists($oldPathFolder1, 'Old path is still present');
  95. $this->assertFileNotExists($folder1->getFullPath(), 'New path is updated in memory, not written before write() is called');
  96. $folder1->write();
  97. // After write()
  98. clearstatcache();
  99. $this->assertFileNotExists($oldPathFolder1, 'Old path is removed after write()');
  100. $this->assertFileExists($folder1->getFullPath(), 'New path is created after write()');
  101. }
  102. /**
  103. * @see FileTest->testLinkAndRelativeLink()
  104. */
  105. function testLinkAndRelativeLink() {
  106. $folder = $this->objFromFixture('Folder', 'folder1');
  107. $this->assertEquals(ASSETS_DIR . '/FileTest-folder1/', $folder->RelativeLink());
  108. $this->assertEquals(Director::baseURL() . ASSETS_DIR . '/FileTest-folder1/', $folder->Link());
  109. }
  110. /**
  111. * @see FileTest->testGetRelativePath()
  112. */
  113. function testGetRelativePath() {
  114. $rootfolder = $this->objFromFixture('Folder', 'folder1');
  115. $this->assertEquals('assets/FileTest-folder1/', $rootfolder->getRelativePath(), 'Folder in assets/');
  116. }
  117. /**
  118. * @see FileTest->testGetFullPath()
  119. */
  120. function testGetFullPath() {
  121. $rootfolder = $this->objFromFixture('Folder', 'folder1');
  122. $this->assertEquals(ASSETS_PATH . '/FileTest-folder1/', $rootfolder->getFullPath(), 'File in assets/ folder');
  123. }
  124. function testDeleteAlsoRemovesFilesystem() {
  125. $path = '/FolderTest/DeleteAlsoRemovesFilesystemAndChildren';
  126. $folder = Folder::findOrMake($path);
  127. $this->assertFileExists(ASSETS_PATH . $path);
  128. $folder->delete();
  129. $this->assertFileNotExists(ASSETS_PATH . $path);
  130. }
  131. function testDeleteAlsoRemovesSubfoldersInDatabaseAndFilesystem() {
  132. $path = '/FolderTest/DeleteAlsoRemovesSubfoldersInDatabaseAndFilesystem';
  133. $subfolderPath = $path . '/subfolder';
  134. $folder = Folder::findOrMake($path);
  135. $subfolder = Folder::findOrMake($subfolderPath);
  136. $subfolderID = $subfolder->ID;
  137. $folder->delete();
  138. $this->assertFileNotExists(ASSETS_PATH . $path);
  139. $this->assertFileNotExists(ASSETS_PATH . $subfolderPath, 'Subfolder removed from filesystem');
  140. $this->assertFalse(DataObject::get_by_id('Folder', $subfolderID), 'Subfolder removed from database');
  141. }
  142. function testDeleteAlsoRemovesContainedFilesInDatabaseAndFilesystem() {
  143. $path = '/FolderTest/DeleteAlsoRemovesContainedFilesInDatabaseAndFilesystem';
  144. $folder = Folder::findOrMake($path);
  145. $file = $this->objFromFixture('File', 'gif');
  146. $file->ParentID = $folder->ID;
  147. $file->write();
  148. $fileID = $file->ID;
  149. $fileAbsPath = $file->getFullPath();
  150. $this->assertFileExists($fileAbsPath);
  151. $folder->delete();
  152. $this->assertFileNotExists($fileAbsPath, 'Contained files removed from filesystem');
  153. $this->assertFalse(DataObject::get_by_id('File', $fileID), 'Contained files removed from database');
  154. }
  155. /**
  156. * @see FileTest->testDeleteDatabaseOnly()
  157. */
  158. function testDeleteDatabaseOnly() {
  159. $subfolder = $this->objFromFixture('Folder', 'subfolder');
  160. $subfolderID = $subfolder->ID;
  161. $subfolderFile = $this->objFromFixture('File', 'subfolderfile');
  162. $subfolderFileID = $subfolderFile->ID;
  163. $subfolder->deleteDatabaseOnly();
  164. DataObject::flush_and_destroy_cache();
  165. $this->assertFileExists($subfolder->getFullPath());
  166. $this->assertFalse(DataObject::get_by_id('Folder', $subfolderID));
  167. $this->assertFileExists($subfolderFile->getFullPath());
  168. $this->assertFalse(DataObject::get_by_id('File', $subfolderFileID));
  169. }
  170. function setUp() {
  171. parent::setUp();
  172. if(!file_exists(ASSETS_PATH)) mkdir(ASSETS_PATH);
  173. // Create a test folders for each of the fixture references
  174. $folderIDs = $this->allFixtureIDs('Folder');
  175. foreach($folderIDs as $folderID) {
  176. $folder = DataObject::get_by_id('Folder', $folderID);
  177. if(!file_exists(BASE_PATH."/$folder->Filename")) mkdir(BASE_PATH."/$folder->Filename");
  178. }
  179. // Create a test files for each of the fixture references
  180. $fileIDs = $this->allFixtureIDs('File');
  181. foreach($fileIDs as $fileID) {
  182. $file = DataObject::get_by_id('File', $fileID);
  183. $fh = fopen(BASE_PATH."/$file->Filename", "w");
  184. fwrite($fh, str_repeat('x',1000000));
  185. fclose($fh);
  186. }
  187. }
  188. function tearDown() {
  189. $testPath = ASSETS_PATH . '/FolderTest';
  190. if(file_exists($testPath)) Filesystem::removeFolder($testPath);
  191. /* Remove the test files that we've created */
  192. $fileIDs = $this->allFixtureIDs('File');
  193. foreach($fileIDs as $fileID) {
  194. $file = DataObject::get_by_id('File', $fileID);
  195. if($file && file_exists(BASE_PATH."/$file->Filename")) unlink(BASE_PATH."/$file->Filename");
  196. }
  197. // Remove the test folders that we've crated
  198. $folderIDs = $this->allFixtureIDs('Folder');
  199. foreach($folderIDs as $folderID) {
  200. $folder = DataObject::get_by_id('Folder', $folderID);
  201. // Might have been removed during test
  202. if($folder && file_exists(BASE_PATH."/$folder->Filename")) Filesystem::removeFolder(BASE_PATH."/$folder->Filename");
  203. }
  204. parent::tearDown();
  205. }
  206. }