function FileListingTest::testFileListingPages
Same name in other branches
- 9 core/modules/file/tests/src/Functional/FileListingTest.php \Drupal\Tests\file\Functional\FileListingTest::testFileListingPages()
- 8.9.x core/modules/file/tests/src/Functional/FileListingTest.php \Drupal\Tests\file\Functional\FileListingTest::testFileListingPages()
- 11.x core/modules/file/tests/src/Functional/FileListingTest.php \Drupal\Tests\file\Functional\FileListingTest::testFileListingPages()
Tests file overview with different user permissions.
File
-
core/
modules/ file/ tests/ src/ Functional/ FileListingTest.php, line 84
Class
- FileListingTest
- Tests file listing page functionality.
Namespace
Drupal\Tests\file\FunctionalCode
public function testFileListingPages() : void {
$file_usage = $this->container
->get('file.usage');
// Users without sufficient permissions should not see file listing.
$this->drupalLogin($this->baseUser);
$this->drupalGet('admin/content/files');
$this->assertSession()
->statusCodeEquals(403);
// Log in with user with right permissions and test listing.
$this->drupalLogin($this->adminUser);
for ($i = 0; $i < 5; $i++) {
$nodes[] = $this->drupalCreateNode([
'type' => 'article',
]);
}
$this->drupalGet('admin/content/files');
$this->assertSession()
->statusCodeEquals(200);
$this->assertSession()
->pageTextContains('No files available.');
$this->drupalGet('admin/content/files');
$this->assertSession()
->statusCodeEquals(200);
// Create a file with no usage.
$file = $this->createFile();
$this->drupalGet('admin/content/files/usage/' . $file->id());
$this->assertSession()
->statusCodeEquals(200);
$this->assertSession()
->titleEquals('File usage information for ' . $file->getFilename() . ' | Drupal');
foreach ($nodes as &$node) {
$this->drupalGet('node/' . $node->id() . '/edit');
$file = $this->getTestFile('image');
$edit = [
'files[file_0]' => \Drupal::service('file_system')->realpath($file->getFileUri()),
];
$this->submitForm($edit, 'Save');
$node = Node::load($node->id());
}
$this->drupalGet('admin/content/files');
foreach ($nodes as $node) {
$file = File::load($node->file->target_id);
$this->assertSession()
->pageTextContains($file->getFilename());
$this->assertSession()
->linkByHrefExists($file->createFileUrl());
$this->assertSession()
->linkByHrefExists('admin/content/files/usage/' . $file->id());
$this->assertSession()
->linkByHrefExists($file->toUrl('delete-form')
->toString());
}
$this->assertSession()
->elementTextNotContains('css', '.views-element-container table', 'Temporary');
$this->assertSession()
->elementTextContains('css', '.views-element-container table', 'Permanent');
// Use one file two times and check usage information.
$orphaned_file = $nodes[1]->file->target_id;
$used_file = $nodes[0]->file->target_id;
$nodes[1]->file->target_id = $used_file;
$nodes[1]->save();
$this->drupalGet('admin/content/files');
$file = File::load($orphaned_file);
$usage = $this->sumUsages($file_usage->listUsage($file));
$this->assertSession()
->responseContains('admin/content/files/usage/' . $file->id() . '">' . $usage);
$file = File::load($used_file);
$usage = $this->sumUsages($file_usage->listUsage($file));
$this->assertSession()
->responseContains('admin/content/files/usage/' . $file->id() . '">' . $usage);
$this->assertSession()
->elementsCount('xpath', "//td[contains(@class, 'views-field-status') and contains(text(), 'Temporary')]", 1);
// Test file usage page.
foreach ($nodes as $node) {
$file = File::load($node->file->target_id);
$usage = $file_usage->listUsage($file);
$this->drupalGet('admin/content/files/usage/' . $file->id());
$this->assertSession()
->statusCodeEquals(200);
$this->assertSession()
->pageTextContains($node->getTitle());
// Verify that registering entity type is found on usage page.
$this->assertSession()
->pageTextContains('node');
// Verify that registering module is found on usage page.
$this->assertSession()
->pageTextContains('file');
foreach ($usage as $module) {
foreach ($module as $entity_type) {
foreach ($entity_type as $entity) {
// Verify that usage count is found on usage page.
$this->assertSession()
->pageTextContains($entity);
}
}
}
$this->assertSession()
->linkByHrefExists('node/' . $node->id(), 0, 'Link to registering entity found on usage page.');
}
// Log in as another user that has access to the file list but cannot delete
// files.
$role_id = $this->drupalCreateRole([
'access files overview',
'bypass node access',
]);
$this->drupalLogin($this->drupalCreateUser(values: [
'roles' => [
$role_id,
],
]));
$this->drupalGet('admin/content/files');
foreach ($nodes as $node) {
$file = File::load($node->file->target_id);
$this->assertSession()
->pageTextContains($file->getFilename());
$this->assertSession()
->linkByHrefExists($file->createFileUrl());
$this->assertSession()
->linkByHrefExists('admin/content/files/usage/' . $file->id());
$this->assertSession()
->linkByHrefNotExists($file->toUrl('delete-form')
->toString());
}
// Give the user's role permission to delete files.
Role::load($role_id)->grantPermission('delete any file')
->save();
$this->drupalGet('admin/content/files');
foreach ($nodes as $node) {
$file = File::load($node->file->target_id);
$this->assertSession()
->pageTextContains($file->getFilename());
$this->assertSession()
->linkByHrefExists($file->createFileUrl());
$this->assertSession()
->linkByHrefExists('admin/content/files/usage/' . $file->id());
$this->assertSession()
->linkByHrefExists($file->toUrl('delete-form')
->toString());
}
// Load the page in a definite order.
$this->drupalGet('admin/content/files', [
'query' => [
'order' => 'filename',
'sort' => 'asc',
],
]);
$this->clickLink('Delete');
$file_uri = File::load(1)->getFileUri();
$this->assertSession()
->addressMatches('#file/1/delete$#');
$this->assertSession()
->pageTextContains('Are you sure you want to delete the file druplicon.txt?');
$this->assertFileExists($file_uri);
$this->assertSession()
->buttonExists('Delete')
->press();
$this->assertSession()
->pageTextContains('The file druplicon.txt has been deleted.');
$this->assertFileDoesNotExist($file_uri);
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.