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.
 
 
 
 

207 lines
7.9 KiB

<?php
namespace Drupal\Tests\islandora\Functional;
use Drupal\Core\Url;
/**
* Tests link headers get added to GET requests.
*
* @group islandora
*/
class LinkHeaderTest extends IslandoraFunctionalTestBase {
/**
* Node that has node and term entity reference fields.
*
* @var \Drupal\node\NodeInterface
*/
protected $referencer;
/**
* Another similar node, to be referenced by referencer.
*
* @var \Drupal\node\NodeInterface
*/
protected $referenced;
/**
* Media to belong to the referencer.
*
* @var \Drupal\media\MediaInterface
*/
protected $media;
/**
* File to belong to the media.
*
* @var \Drupal\file\FileInterface
*/
protected $file;
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
$account = $this->createUserAndLogin();
$this->createImageTag();
$this->createPreservationMasterTag();
// Node to be referenced via member of.
$this->referenced = $this->container->get('entity_type.manager')->getStorage('node')->create([
'type' => $this->testType->id(),
'title' => 'Referenced',
]);
$this->referenced->save();
// Node that is member of something, with an Image tag.
$this->referencer = $this->container->get('entity_type.manager')->getStorage('node')->create([
'type' => $this->testType->id(),
'title' => 'Referencer',
'field_member_of' => [$this->referenced->id()],
'field_tags' => [$this->imageTerm->id()],
]);
$this->referencer->save();
list($this->file, $this->media) = $this->makeMediaAndFile($account);
$this->media->set('field_media_of', $this->referencer);
$this->media->set('field_tags', $this->preservationMasterTerm);
$this->media->save();
}
/**
* @covers \Drupal\islandora\EventSubscriber\NodeLinkHeaderSubscriber::onResponse
*/
public function testNodeLinkHeaders() {
// Visit the referenced node, there should not be a related header since
// its entity reference field is empty.
$this->drupalGet('node/' . $this->referenced->id());
$this->assertTrue(
$this->doesNotHaveLinkHeader('related'),
"Node that has empty entity reference field must not return link header."
);
// Visit the referencer. It should return a rel="related" link header
// for referenced node and the referencing media, plus one for the tag.
$this->drupalGet('node/' . $this->referencer->id());
$this->assertTrue(
$this->validateLinkHeaderWithEntity('related', $this->referenced, 'Member Of') == 1,
"Malformed related node link header"
);
$this->assertTrue(
$this->validateLinkHeaderWithEntity('related', $this->media, $this->preservationMasterTerm->label()) == 1,
"Malformed related media link header"
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('tag', $this->imageTerm->get('field_external_uri')->first()->getValue()['uri'], $this->imageTerm->label()) == 1,
"Malformed tag link header"
);
// Check for links to REST endpoints for metadata.
$entity_url = $this->referencer->toUrl('canonical', ['absolute' => TRUE])
->toString();
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', "$entity_url?_format=json", NULL, 'application/json') == 1,
"Node must have link header pointing to json REST endpoint."
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', "$entity_url?_format=jsonld", NULL, 'application/ld+json') == 1,
"Node must have link header pointing to jsonld REST endpoint."
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', "$entity_url?_format=xml", NULL, 'application/xml') == 0,
"Node must not have link header pointing to disabled xml REST endpoint."
);
// Check that the current representation is not advertised when visitng
// a REST endpoint (e.g. the json link header doesn't appear when you're
// visiting the ?_format=json endpoint).
$this->drupalGet('node/' . $this->referencer->id(), ['query' => ['_format' => 'json']]);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', "$entity_url?_format=json", NULL, 'application/json') == 0,
"Node must not have link header pointing to json REST endpoint when vising the json REST endpoint."
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', "$entity_url?_format=jsonld", NULL, 'application/ld+json') == 1,
"Node must have link header pointing to jsonld REST endpoint when visiting the json REST endpoint."
);
}
/**
* @covers \Drupal\islandora\EventSubscriber\MediaLinkHeaderSubscriber
*/
public function testMediaLinkHeaders() {
// Get the file to check its url in the response headers.
$file_url = $this->file->url('canonical', ['absolute' => TRUE]);
$rest_url = Url::fromRoute('islandora.media_source_update', ['media' => $this->media->id()])
->setAbsolute()
->toString();
$media_url = $this->media->url('canonical', ['absolute' => TRUE]);
// Perform a GET request as anonymous.
$this->drupalGet($media_url, [], ['Cache-Control: no-cache']);
// Check link headers.
$this->assertTrue(
$this->validateLinkHeaderWithUrl('describes', $file_url, '', 'text/plain') == 1,
"Malformed 'describes' link header, expecting $file_url"
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('edit-media', $rest_url, '', '') == 0,
"Anonymous should not be able to see the edit-media link"
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('tag', $this->preservationMasterTerm->get('field_external_uri')->first()->getValue()['uri'], $this->preservationMasterTerm->label()) == 1,
"Malformed tag link header"
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', $media_url . "?_format=json", NULL, 'application/json') == 1,
"Media must have link header pointing to json REST endpoint."
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', $media_url . "?_format=jsonld", NULL, 'application/ld+json') == 1,
"Media must have link header pointing to jsonld REST endpoint."
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', $media_url . "?_format=xml", NULL, 'application/xml') == 0,
"Media must not have link header pointing to disabled xml REST endpoint."
);
// Create a test user with edit media permissions.
$account = $this->drupalCreateUser(['update media']);
$this->drupalLogin($account);
// Perform a GET request with update media permissions.
$this->drupalGet($media_url, [], ['Cache-Control: no-cache']);
// Check link headers again, the edit-media link header should be present.
$this->assertTrue(
$this->validateLinkHeaderWithUrl('describes', $file_url, '', 'text/plain') == 1,
"Malformed 'describes' link header, expecting $file_url"
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('edit-media', $rest_url, '', '') == 1,
"Malformed 'edit-media' link, expecting $rest_url"
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('tag', $this->preservationMasterTerm->get('field_external_uri')->first()->getValue()['uri'], $this->preservationMasterTerm->label()) == 1,
"Malformed tag link header"
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', $media_url . "?_format=json", NULL, 'application/json') == 1,
"Media must have link header pointing to json REST endpoint."
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', $media_url . "?_format=jsonld", NULL, 'application/ld+json') == 1,
"Media must have link header pointing to jsonld REST endpoint."
);
$this->assertTrue(
$this->validateLinkHeaderWithUrl('alternate', $media_url . "?_format=xml", NULL, 'application/xml') == 0,
"Media must not have link header pointing to disabled xml REST endpoint."
);
}
}