View source
<?php
namespace Drupal\Tests\media_library\FunctionalJavascript;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\file\Entity\File;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\media\Entity\Media;
use Drupal\Tests\content_moderation\Traits\ContentModerationTestTrait;
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
use Drupal\Tests\TestFileCreationTrait;
class ContentModerationTest extends WebDriverTestBase {
use ContentModerationTestTrait;
use EntityReferenceTestTrait;
use MediaTypeCreationTrait;
use TestFileCreationTrait;
protected static $modules = [
'content_moderation',
'field',
'media',
'media_library',
'node',
'views',
];
protected $defaultTheme = 'classy';
protected $userAdmin;
protected $userViewer;
protected $userViewOwnUnpublished;
protected $userViewAnyUnpublished;
protected function setUp() {
parent::setUp();
$this
->createMediaType('image', [
'id' => 'image',
]);
$this
->drupalCreateContentType([
'type' => 'article',
'name' => 'Article',
]);
$this
->createEntityReferenceField('node', 'article', 'field_media', 'Media', 'media', 'default', [
'target_bundles' => [
'image',
],
], FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
$form_display = \Drupal::service('entity_display.repository')
->getFormDisplay('node', 'article', 'default');
$form_display
->setComponent('field_media', [
'type' => 'media_library_widget',
])
->save();
$workflow = $this
->createEditorialWorkflow();
$workflow
->getTypePlugin()
->addEntityTypeAndBundle('media', 'image');
$workflow
->save();
$image = File::create([
'uri' => $this
->getTestFiles('image')[0]->uri,
]);
$image
->setPermanent();
$image
->save();
$draft_media = Media::create([
'name' => 'Hoglet',
'bundle' => 'image',
'field_media_image' => $image,
'moderation_state' => 'draft',
]);
$draft_media
->save();
$published_media = Media::create([
'name' => 'Panda',
'bundle' => 'image',
'field_media_image' => $image,
'moderation_state' => 'published',
]);
$published_media
->save();
$archived_media = Media::create([
'name' => 'Mammoth',
'bundle' => 'image',
'field_media_image' => $image,
'moderation_state' => 'archived',
]);
$archived_media
->save();
$this->userAdmin = $this
->drupalCreateUser([
'access administration pages',
'access content',
'access media overview',
'edit own article content',
'create article content',
'administer media',
]);
$this->userViewer = $this
->drupalCreateUser([
'access administration pages',
'access content',
'access media overview',
'edit own article content',
'create article content',
'view media',
'create media',
]);
$this->userViewOwnUnpublished = $this
->drupalCreateUser([
'access administration pages',
'access content',
'access media overview',
'edit own article content',
'create article content',
'view media',
'view own unpublished media',
'create media',
]);
$this->userViewAnyUnpublished = $this
->drupalCreateUser([
'access administration pages',
'access content',
'access media overview',
'edit own article content',
'create article content',
'view media',
'create media',
'view any unpublished content',
]);
}
public function testAdministrationPage() {
$this
->drupalLogin($this->rootUser);
$this
->drupalGet('admin/content/media');
$this
->assertAllMedia();
$this
->drupalLogin($this->userAdmin);
$this
->drupalGet('admin/content/media');
$this
->assertAllMedia();
$this
->drupalLogin($this->userViewer);
$this
->drupalGet('admin/content/media');
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewOwnUnpublished);
$this
->drupalGet('admin/content/media');
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewAnyUnpublished);
$this
->drupalGet('admin/content/media');
$this
->assertAllMedia();
foreach (Media::loadMultiple() as $media) {
$media
->setOwner($this->userViewOwnUnpublished);
$media
->save();
}
$this
->drupalLogin($this->rootUser);
$this
->drupalGet('admin/content/media');
$this
->assertAllMedia();
$this
->drupalLogin($this->userAdmin);
$this
->drupalGet('admin/content/media');
$this
->assertAllMedia();
$this
->drupalLogin($this->userViewer);
$this
->drupalGet('admin/content/media');
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewOwnUnpublished);
$this
->drupalGet('admin/content/media');
$this
->assertAllMedia();
$this
->drupalLogin($this->userViewAnyUnpublished);
$this
->drupalGet('admin/content/media');
$this
->assertAllMedia();
}
public function testWidget() {
$assert_session = $this
->assertSession();
$this
->drupalLogin($this->rootUser);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userAdmin);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewer);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewOwnUnpublished);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewAnyUnpublished);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
foreach (Media::loadMultiple() as $media) {
$media
->setOwner($this->userViewOwnUnpublished);
$media
->save();
}
$this
->drupalLogin($this->rootUser);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userAdmin);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewer);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewOwnUnpublished);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
$this
->drupalLogin($this->userViewAnyUnpublished);
$this
->drupalGet('node/add/article');
$assert_session
->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertOnlyPublishedMedia();
}
protected function assertAllMedia() {
$assert_session = $this
->assertSession();
$assert_session
->pageTextContains('Hoglet');
$assert_session
->pageTextContains('Panda');
$assert_session
->pageTextContains('Mammoth');
}
protected function assertOnlyPublishedMedia() {
$assert_session = $this
->assertSession();
$assert_session
->pageTextNotContains('Hoglet');
$assert_session
->pageTextContains('Panda');
$assert_session
->pageTextNotContains('Mammoth');
}
}