PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/web/core/modules/file/tests/src/Functional/FileListingTest.php

https://gitlab.com/mohamed_hussein/prodt
PHP | 240 lines | 145 code | 37 blank | 58 comment | 1 complexity | aa57a1739a116d9b52165b4ab5a5f8e4 MD5 | raw file
  1. <?php
  2. namespace Drupal\Tests\file\Functional;
  3. use Drupal\node\Entity\Node;
  4. use Drupal\file\Entity\File;
  5. use Drupal\entity_test\Entity\EntityTestConstraints;
  6. /**
  7. * Tests file listing page functionality.
  8. *
  9. * @group file
  10. */
  11. class FileListingTest extends FileFieldTestBase {
  12. /**
  13. * Modules to enable.
  14. *
  15. * @var array
  16. */
  17. protected static $modules = ['views', 'file', 'image', 'entity_test'];
  18. /**
  19. * {@inheritdoc}
  20. */
  21. protected $defaultTheme = 'classy';
  22. /**
  23. * An authenticated user.
  24. *
  25. * @var \Drupal\user\UserInterface
  26. */
  27. protected $baseUser;
  28. protected function setUp(): void {
  29. parent::setUp();
  30. // This test expects unused managed files to be marked as a temporary file.
  31. $this->config('file.settings')
  32. ->set('make_unused_managed_files_temporary', TRUE)
  33. ->save();
  34. $this->adminUser = $this->drupalCreateUser([
  35. 'access files overview',
  36. 'bypass node access',
  37. ]);
  38. $this->baseUser = $this->drupalCreateUser();
  39. $this->createFileField('file', 'node', 'article', [], ['file_extensions' => 'txt png']);
  40. }
  41. /**
  42. * Calculates total count of usages for a file.
  43. *
  44. * @param $usage array
  45. * Array of file usage information as returned from file_usage subsystem.
  46. *
  47. * @return int
  48. * Total usage count.
  49. */
  50. protected function sumUsages($usage) {
  51. $count = 0;
  52. foreach ($usage as $module) {
  53. foreach ($module as $entity_type) {
  54. foreach ($entity_type as $entity) {
  55. $count += $entity;
  56. }
  57. }
  58. }
  59. return $count;
  60. }
  61. /**
  62. * Tests file overview with different user permissions.
  63. */
  64. public function testFileListingPages() {
  65. $file_usage = $this->container->get('file.usage');
  66. // Users without sufficient permissions should not see file listing.
  67. $this->drupalLogin($this->baseUser);
  68. $this->drupalGet('admin/content/files');
  69. $this->assertSession()->statusCodeEquals(403);
  70. // Log in with user with right permissions and test listing.
  71. $this->drupalLogin($this->adminUser);
  72. for ($i = 0; $i < 5; $i++) {
  73. $nodes[] = $this->drupalCreateNode(['type' => 'article']);
  74. }
  75. $this->drupalGet('admin/content/files');
  76. $this->assertSession()->statusCodeEquals(200);
  77. $this->assertSession()->pageTextContains('No files available.');
  78. $this->drupalGet('admin/content/files');
  79. $this->assertSession()->statusCodeEquals(200);
  80. // Create a file with no usage.
  81. $file = $this->createFile();
  82. $this->drupalGet('admin/content/files/usage/' . $file->id());
  83. $this->assertSession()->statusCodeEquals(200);
  84. $this->assertSession()->titleEquals('File usage information for ' . $file->getFilename() . ' | Drupal');
  85. foreach ($nodes as &$node) {
  86. $this->drupalGet('node/' . $node->id() . '/edit');
  87. $file = $this->getTestFile('image');
  88. $edit = [
  89. 'files[file_0]' => \Drupal::service('file_system')->realpath($file->getFileUri()),
  90. ];
  91. $this->submitForm($edit, 'Save');
  92. $node = Node::load($node->id());
  93. }
  94. $this->drupalGet('admin/content/files');
  95. foreach ($nodes as $node) {
  96. $file = File::load($node->file->target_id);
  97. $this->assertSession()->pageTextContains($file->getFilename());
  98. $this->assertSession()->linkByHrefExists($file->createFileUrl());
  99. $this->assertSession()->linkByHrefExists('admin/content/files/usage/' . $file->id());
  100. }
  101. $this->assertSession()->elementTextNotContains('css', 'table.views-table', 'Temporary');
  102. $this->assertSession()->elementTextContains('css', 'table.views-table', 'Permanent');
  103. // Use one file two times and check usage information.
  104. $orphaned_file = $nodes[1]->file->target_id;
  105. $used_file = $nodes[0]->file->target_id;
  106. $nodes[1]->file->target_id = $used_file;
  107. $nodes[1]->save();
  108. $this->drupalGet('admin/content/files');
  109. $file = File::load($orphaned_file);
  110. $usage = $this->sumUsages($file_usage->listUsage($file));
  111. $this->assertSession()->responseContains('admin/content/files/usage/' . $file->id() . '">' . $usage);
  112. $file = File::load($used_file);
  113. $usage = $this->sumUsages($file_usage->listUsage($file));
  114. $this->assertSession()->responseContains('admin/content/files/usage/' . $file->id() . '">' . $usage);
  115. $result = $this->xpath("//td[contains(@class, 'views-field-status') and contains(text(), :value)]", [':value' => 'Temporary']);
  116. $this->assertCount(1, $result, 'Unused file marked as temporary.');
  117. // Test file usage page.
  118. foreach ($nodes as $node) {
  119. $file = File::load($node->file->target_id);
  120. $usage = $file_usage->listUsage($file);
  121. $this->drupalGet('admin/content/files/usage/' . $file->id());
  122. $this->assertSession()->statusCodeEquals(200);
  123. $this->assertSession()->pageTextContains($node->getTitle());
  124. // Verify that registering entity type is found on usage page.
  125. $this->assertSession()->pageTextContains('node');
  126. // Verify that registering module is found on usage page.
  127. $this->assertSession()->pageTextContains('file');
  128. foreach ($usage as $module) {
  129. foreach ($module as $entity_type) {
  130. foreach ($entity_type as $entity) {
  131. // Verify that usage count is found on usage page.
  132. $this->assertSession()->pageTextContains($entity);
  133. }
  134. }
  135. }
  136. $this->assertSession()->linkByHrefExists('node/' . $node->id(), 0, 'Link to registering entity found on usage page.');
  137. }
  138. }
  139. /**
  140. * Tests file listing usage page for entities with no canonical link template.
  141. */
  142. public function testFileListingUsageNoLink() {
  143. // Login with user with right permissions and test listing.
  144. $this->drupalLogin($this->adminUser);
  145. // Create a bundle and attach a File field to the bundle.
  146. $bundle = $this->randomMachineName();
  147. entity_test_create_bundle($bundle, NULL, 'entity_test_constraints');
  148. $this->createFileField('field_test_file', 'entity_test_constraints', $bundle, [], ['file_extensions' => 'txt png']);
  149. // Create file to attach to entity.
  150. $file = File::create([
  151. 'filename' => 'druplicon.txt',
  152. 'uri' => 'public://druplicon.txt',
  153. 'filemime' => 'text/plain',
  154. ]);
  155. $file->setPermanent();
  156. file_put_contents($file->getFileUri(), 'hello world');
  157. $file->save();
  158. // Create entity and attach the created file.
  159. $entity_name = $this->randomMachineName();
  160. $entity = EntityTestConstraints::create([
  161. 'uid' => 1,
  162. 'name' => $entity_name,
  163. 'type' => $bundle,
  164. 'field_test_file' => [
  165. 'target_id' => $file->id(),
  166. ],
  167. ]);
  168. $entity->save();
  169. // Create node entity and attach the created file.
  170. $node = $this->drupalCreateNode(['type' => 'article', 'file' => $file]);
  171. $node->save();
  172. // Load the file usage page for the created and attached file.
  173. $this->drupalGet('admin/content/files/usage/' . $file->id());
  174. $this->assertSession()->statusCodeEquals(200);
  175. // Entity name should be displayed, but not linked if Entity::toUrl
  176. // throws an exception
  177. $this->assertSession()->pageTextContains($entity_name);
  178. $this->assertSession()->linkNotExists($entity_name, 'Linked entity name not added to file usage listing.');
  179. $this->assertSession()->linkExists($node->getTitle());
  180. }
  181. /**
  182. * Creates and saves a test file.
  183. *
  184. * @return \Drupal\Core\Entity\EntityInterface
  185. * A file entity.
  186. */
  187. protected function createFile() {
  188. // Create a new file entity.
  189. $file = File::create([
  190. 'uid' => 1,
  191. 'filename' => 'druplicon.txt',
  192. 'uri' => 'public://druplicon.txt',
  193. 'filemime' => 'text/plain',
  194. 'created' => 1,
  195. 'changed' => 1,
  196. ]);
  197. $file->setPermanent();
  198. file_put_contents($file->getFileUri(), 'hello world');
  199. // Save it, inserting a new record.
  200. $file->save();
  201. return $file;
  202. }
  203. }