function DownloadTest::doPrivateFileTransferTest
Same name in other branches
- 9 core/modules/file/tests/src/Functional/DownloadTest.php \Drupal\Tests\file\Functional\DownloadTest::doPrivateFileTransferTest()
- 8.9.x core/modules/file/tests/src/Functional/DownloadTest.php \Drupal\Tests\file\Functional\DownloadTest::doPrivateFileTransferTest()
- 10 core/modules/file/tests/src/Functional/DownloadTest.php \Drupal\Tests\file\Functional\DownloadTest::doPrivateFileTransferTest()
Tests the private file transfer system.
1 call to DownloadTest::doPrivateFileTransferTest()
- DownloadTest::testPrivateFileTransferWithoutPageCache in core/
modules/ file/ tests/ src/ Functional/ DownloadTest.php - Tests the private file transfer system.
File
-
core/
modules/ file/ tests/ src/ Functional/ DownloadTest.php, line 82
Class
- DownloadTest
- Tests for download/file transfer functions.
Namespace
Drupal\Tests\file\FunctionalCode
protected function doPrivateFileTransferTest() : void {
// Set file downloads to private so handler functions get called.
// Create a file.
$contents = $this->randomMachineName(8);
$file = $this->createFile($contents . '.txt', $contents, 'private');
// Created private files without usage are by default not accessible
// for a user different from the owner, but createFile always uses uid 1
// as the owner of the files. Therefore make it permanent to allow access
// if a module allows it.
$file->setPermanent();
$file->save();
$url = $this->fileUrlGenerator
->generateAbsoluteString($file->getFileUri());
// Set file_test access header to allow the download.
file_test_reset();
file_test_set_return('download', [
'x-foo' => 'Bar',
]);
$this->drupalGet($url);
// Verify that header is set by file_test module on private download.
$this->assertSession()
->responseHeaderEquals('x-foo', 'Bar');
// Verify that page cache is disabled on private file download.
$this->assertSession()
->responseHeaderDoesNotExist('x-drupal-cache');
$this->assertSession()
->statusCodeEquals(200);
// Ensure hook_file_download is fired correctly.
$this->assertEquals($file->getFileUri(), \Drupal::state()->get('file_test.results')['download'][0][0]);
// Test that the file transferred correctly.
$this->assertSame($contents, $this->getSession()
->getPage()
->getContent(), 'Contents of the file are correct.');
$http_client = $this->getHttpClient();
// Try non-existent file.
file_test_reset();
$not_found_url = $this->fileUrlGenerator
->generateAbsoluteString('private://' . $this->randomMachineName() . '.txt');
$response = $http_client->head($not_found_url, [
'http_errors' => FALSE,
]);
$this->assertSame(404, $response->getStatusCode(), 'Correctly returned 404 response for a non-existent file.');
// Assert that hook_file_download is not called.
$this->assertEquals([], \Drupal::state()->get('file_test.results')['download']);
// Having tried a non-existent file, try the original file again to ensure
// it's returned instead of a 404 response.
// Set file_test access header to allow the download.
file_test_reset();
file_test_set_return('download', [
'x-foo' => 'Bar',
]);
$this->drupalGet($url);
// Verify that header is set by file_test module on private download.
$this->assertSession()
->responseHeaderEquals('x-foo', 'Bar');
// Verify that page cache is disabled on private file download.
$this->assertSession()
->responseHeaderDoesNotExist('x-drupal-cache');
$this->assertSession()
->statusCodeEquals(200);
// Test that the file transferred correctly.
$this->assertSame($contents, $this->getSession()
->getPage()
->getContent(), 'Contents of the file are correct.');
// Deny access to all downloads via a -1 header.
file_test_set_return('download', -1);
$response = $http_client->head($url, [
'http_errors' => FALSE,
]);
$this->assertSame(403, $response->getStatusCode(), 'Correctly denied access to a file when file_test sets the header to -1.');
// Try requesting the private file URL without a file specified.
file_test_reset();
$this->drupalGet('/system/files');
$this->assertSession()
->statusCodeEquals(404);
// Assert that hook_file_download is not called.
$this->assertEquals([], \Drupal::state()->get('file_test.results')['download']);
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.