Drupal modules for browsing and managing Fedora-based digital repositories.
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.
 
 
 
 

216 lines
7.2 KiB

<?php
namespace Drupal\Tests\islandora\Functional;
use Drupal\Core\Url;
use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
/**
* Tests the RelatedLinkHeader view alter.
*
* @group islandora
*/
class AddMediaToNodeTest extends IslandoraFunctionalTestBase {
use EntityReferenceTestTrait;
/**
* Node to hold the media.
*
* @var \Drupal\node\NodeInterface
*/
protected $node;
/**
* Term to belong to the media.
*
* @var \Drupal\taxonomy\TermInterface
*/
protected $preservationMasterTerm;
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
$this->node = $this->container->get('entity_type.manager')->getStorage('node')->create([
'type' => 'test_type',
'title' => 'Referencer',
]);
$this->node->save();
$this->preservationMasterTerm = $this->container->get('entity_type.manager')->getStorage('taxonomy_term')->create([
'name' => 'Preservation Master',
'vid' => $this->testVocabulary->id(),
'field_external_uri' => [['uri' => "http://pcdm.org/use#PreservationMasterFile"]],
]);
$this->preservationMasterTerm->save();
}
/**
* @covers \Drupal\islandora\Controller\MediaSourceController::putToNode
*/
public function testAddMediaToNode() {
// Hack out the guzzle client.
$client = $this->getSession()->getDriver()->getClient()->getClient();
$add_to_node_url = Url::fromRoute(
'islandora.media_source_put_to_node',
[
'node' => $this->node->id(),
'media_type' => $this->testMediaType->id(),
'taxonomy_term' => $this->preservationMasterTerm->id(),
]
)
->setAbsolute()
->toString();
$bad_node_url = Url::fromRoute(
'islandora.media_source_put_to_node',
[
'node' => 123456,
'media_type' => $this->testMediaType->id(),
'taxonomy_term' => $this->preservationMasterTerm->id(),
]
)
->setAbsolute()
->toString();
$file_contents = file_get_contents(__DIR__ . '/../../fixtures/test_file.txt');
// Test different permissions scenarios.
$options = [
'http_errors' => FALSE,
'headers' => [
'Content-Type' => 'text/plain',
'Content-Location' => 'public://test_file.txt',
],
'body' => $file_contents,
];
// 403 if you don't have permissions to update the node.
$account = $this->drupalCreateUser([
'access content',
]);
$this->drupalLogin($account);
$options['auth'] = [$account->getUsername(), $account->pass_raw];
$response = $client->request('PUT', $add_to_node_url, $options);
$this->assertTrue($response->getStatusCode() == 403, "Expected 403, received {$response->getStatusCode()}");
// Bad node URL should return 404, regardless of permissions.
// Just making sure our custom access function doesn't obfuscate responses.
$response = $client->request('PUT', $bad_node_url, $options);
$this->assertTrue($response->getStatusCode() == 404, "Expected 404, received {$response->getStatusCode()}");
// 403 if you don't have permissions to create Media.
$account = $this->drupalCreateUser([
'bypass node access',
]);
$this->drupalLogin($account);
$options['auth'] = [$account->getUsername(), $account->pass_raw];
$response = $client->request('PUT', $add_to_node_url, $options);
$this->assertTrue($response->getStatusCode() == 403, "Expected 403, received {$response->getStatusCode()}");
// Now with proper credentials, test responses given to malformed requests.
$account = $this->drupalCreateUser([
'bypass node access',
'create media',
]);
$this->drupalLogin($account);
// Request without Content-Type header should fail with 400.
$options = [
'auth' => [$account->getUsername(), $account->pass_raw],
'http_errors' => FALSE,
'headers' => [
'Content-Location' => 'public://test_file.txt',
],
'body' => $file_contents,
];
$response = $client->request('PUT', $add_to_node_url, $options);
$this->assertTrue($response->getStatusCode() == 400, "Expected 400, received {$response->getStatusCode()}");
// Request without Content-Location header should fail with 400.
$options = [
'auth' => [$account->getUsername(), $account->pass_raw],
'http_errors' => FALSE,
'headers' => [
'Content-Type' => 'text/plain',
],
'body' => $file_contents,
];
$response = $client->request('PUT', $add_to_node_url, $options);
$this->assertTrue($response->getStatusCode() == 400, "Expected 400, received {$response->getStatusCode()}");
// Request without body should fail with 400.
$options = [
'auth' => [$account->getUsername(), $account->pass_raw],
'http_errors' => FALSE,
'headers' => [
'Content-Type' => 'text/plain',
'Content-Location' => 'public://test_file.txt',
],
];
$response = $client->request('PUT', $add_to_node_url, $options);
$this->assertTrue($response->getStatusCode() == 400, "Expected 400, received {$response->getStatusCode()}");
// Test properly formed requests with bad parameters in the route.
$options = [
'auth' => [$account->getUsername(), $account->pass_raw],
'http_errors' => FALSE,
'headers' => [
'Content-Type' => 'text/plain',
'Content-Location' => 'public://test_file.txt',
],
'body' => $file_contents,
];
// Bad node id should return 404 even with proper permissions.
$response = $client->request('PUT', $bad_node_url, $options);
$this->assertTrue($response->getStatusCode() == 404, "Expected 404, received {$response->getStatusCode()}");
// Bad media type in url should return 404.
$bad_media_type_url = Url::fromRoute(
'islandora.media_source_put_to_node',
[
'node' => $this->node->id(),
'media_type' => 'derp',
'taxonomy_term' => $this->preservationMasterTerm->id(),
]
)
->setAbsolute()
->toString();
$response = $client->request('PUT', $bad_media_type_url, $options);
$this->assertTrue($response->getStatusCode() == 404, "Expected 404, received {$response->getStatusCode()}");
// Bad taxonomy term in url should return 404.
$bad_term_url = Url::fromRoute(
'islandora.media_source_put_to_node',
[
'node' => $this->node->id(),
'media_type' => $this->testMediaType->id(),
'taxonomy_term' => 123456,
]
)
->setAbsolute()
->toString();
$response = $client->request('PUT', $bad_term_url, $options);
$this->assertTrue($response->getStatusCode() == 404, "Expected 404, received {$response->getStatusCode()}");
// Should be successful with proper url, options, and permissions.
$options = [
'auth' => [$account->getUsername(), $account->pass_raw],
'http_errors' => FALSE,
'headers' => [
'Content-Type' => 'text/plain',
'Content-Location' => 'public://test_file.txt',
],
'body' => $file_contents,
];
$response = $client->request('PUT', $add_to_node_url, $options);
$this->assertTrue($response->getStatusCode() == 201, "Expected 201, received {$response->getStatusCode()}");
$this->assertTrue(!empty($response->getHeader("Location")), "Response must include Location header");
}
}