You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.1 KiB
135 lines
4.1 KiB
<?php |
|
|
|
namespace Drupal\Tests\islandora\Functional; |
|
|
|
use Drupal\Core\Url; |
|
|
|
/** |
|
* Tests updating Media source File with PUT. |
|
* |
|
* @group islandora |
|
*/ |
|
class MediaSourceUpdateTest extends IslandoraFunctionalTestBase { |
|
|
|
/** |
|
* Media to belong to the referencer. |
|
* |
|
* @var \Drupal\media\MediaInterface |
|
*/ |
|
protected $media; |
|
|
|
/** |
|
* File to belong to the media. |
|
* |
|
* @var \Drupal\file\FileInterface |
|
*/ |
|
protected $file; |
|
|
|
/** |
|
* User. |
|
* |
|
* @var \Drupal\Core\Session\AccountInterface |
|
*/ |
|
protected $account; |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function setUp() { |
|
parent::setUp(); |
|
|
|
// Make a user with appropriate permissions. |
|
$this->account = $this->drupalCreateUser([ |
|
'view media', |
|
'create media', |
|
'update media', |
|
]); |
|
$this->drupalLogin($this->account); |
|
|
|
// Make a file for the Media. |
|
$this->file = $this->container->get('entity_type.manager')->getStorage('file')->create([ |
|
'uid' => $this->account->id(), |
|
'uri' => "public://test_file.txt", |
|
'filename' => "test_file.txt", |
|
'filemime' => "text/plain", |
|
'status' => FILE_STATUS_PERMANENT, |
|
]); |
|
$this->file->save(); |
|
|
|
// Get the source field for the media. |
|
$type_configuration = $this->testMediaType->get('source_configuration'); |
|
$source_field = $type_configuration['source_field']; |
|
|
|
// Make the media. |
|
$this->media = $this->container->get('entity_type.manager')->getStorage('media')->create([ |
|
'bundle' => $this->testMediaType->id(), |
|
'name' => 'Media', |
|
"$source_field" => [$this->file->id()], |
|
]); |
|
$this->media->save(); |
|
} |
|
|
|
/** |
|
* @covers \Drupal\islandora\Controller\MediaSourceController::put |
|
*/ |
|
public function testMediaSourceUpdate() { |
|
// Hack out the guzzle client. |
|
$client = $this->getSession()->getDriver()->getClient()->getClient(); |
|
|
|
$media_update_url = Url::fromRoute('islandora.media_source_update', ['media' => $this->media->id()]) |
|
->setAbsolute() |
|
->toString(); |
|
|
|
$file_contents = file_get_contents(__DIR__ . '/../../fixtures/test_file2.txt'); |
|
|
|
// Update without Content-Type header should fail with 400. |
|
$options = [ |
|
'auth' => [$this->account->getUsername(), $this->account->pass_raw], |
|
'http_errors' => FALSE, |
|
'body' => $file_contents, |
|
]; |
|
$response = $client->request('PUT', $media_update_url, $options); |
|
$this->assertTrue($response->getStatusCode() == 400, "Expected 400, received {$response->getStatusCode()}"); |
|
|
|
// Update without body should fail with 400. |
|
$options = [ |
|
'auth' => [$this->account->getUsername(), $this->account->pass_raw], |
|
'http_errors' => FALSE, |
|
'headers' => [ |
|
'Content-Type' => 'text/plain', |
|
], |
|
]; |
|
$response = $client->request('PUT', $media_update_url, $options); |
|
$this->assertTrue($response->getStatusCode() == 400, "Expected 400, received {$response->getStatusCode()}"); |
|
|
|
// Should be successful. |
|
$options = [ |
|
'auth' => [$this->account->getUsername(), $this->account->pass_raw], |
|
'http_errors' => FALSE, |
|
'headers' => [ |
|
'Content-Type' => 'text/plain', |
|
], |
|
'body' => $file_contents, |
|
]; |
|
$response = $client->request('PUT', $media_update_url, $options); |
|
$this->assertTrue($response->getStatusCode() == 204, "Expected 204, received {$response->getStatusCode()}"); |
|
|
|
// GET the media and compare file and metadata. |
|
$options = [ |
|
'auth' => [$this->account->getUsername(), $this->account->pass_raw], |
|
'http_errors' => FALSE, |
|
]; |
|
$url = $this->media->url('canonical', ['absolute' => TRUE]); |
|
$response = $client->request('GET', $url . '?_format=json', $options); |
|
$updated = json_decode($response->getBody(), TRUE); |
|
|
|
// Get the source field for the media. |
|
$type_configuration = $this->testMediaType->get('source_configuration'); |
|
$source_field = $type_configuration['source_field']; |
|
|
|
$updated_file_contents = file_get_contents($updated[$source_field][0]['url']); |
|
|
|
$this->assertTrue($updated_file_contents == file_get_contents(__DIR__ . '/../../fixtures/test_file2.txt'), "Updated file not the same as PUT body."); |
|
} |
|
|
|
}
|
|
|