View source
<?php
namespace Drupal\Tests\lightning_media\ExistingSiteJavascript;
use Drupal\FunctionalJavascriptTests\JSWebAssert;
use weitzman\DrupalTestTraits\ExistingSiteWebDriverTestBase;
class CkEditorMediaBrowserTest extends ExistingSiteWebDriverTestBase {
private $media = [];
private $assert;
private $uid = 0;
public function setUp() {
parent::setUp();
$this
->addMedia([
'bundle' => 'tweet',
'name' => 'Code Wisdom 1',
'embed_code' => 'https://twitter.com/CodeWisdom/status/707945860936691714',
]);
$this
->addMedia([
'bundle' => 'tweet',
'embed_code' => 'https://twitter.com/CodeWisdom/status/826500049760821248',
]);
$this
->addMedia([
'bundle' => 'tweet',
'embed_code' => 'https://twitter.com/CodeWisdom/status/826460810121773057',
]);
$account = $this
->createUser();
$account
->addRole('media_creator');
$account
->save();
$this
->assertNotEmpty($account->passRaw);
$this
->visit('/user/login');
$this->assert = new JSWebAssert($this
->getSession());
$this->assert
->fieldExists('name')
->setValue($account
->getAccountName());
$this->assert
->fieldExists('pass')
->setValue($account->passRaw);
$this->assert
->buttonExists('Log in')
->press();
$this->uid = $account
->id();
}
public function tearDown() {
while ($this->media) {
array_pop($this->media)
->delete();
}
parent::tearDown();
}
public function testExposedFilters() {
$this
->visit('/node/add/page');
$this
->open();
$this
->getSession()
->switchToIFrame('entity_browser_iframe_media_browser');
$this
->assertCount(3, $this
->getItems());
$this->assert
->fieldExists('Type')
->selectOption('Image');
$this
->applyFilters();
$this
->assertEmpty($this
->getItems());
$this->assert
->fieldExists('Type')
->selectOption('- Any -');
$this
->applyFilters();
$this
->assertCount(3, $this
->getItems());
$this->assert
->fieldExists('Keywords')
->setValue('Code Wisdom 1');
$this
->applyFilters();
$this
->assertCount(1, $this
->getItems());
$this->assert
->fieldExists('Keywords')
->setValue('');
$this
->applyFilters();
$this
->assertCount(3, $this
->getItems());
}
public function testUnlimitedCardinality() {
$session = $this
->getSession();
$this
->visit('/node/add/page');
$this
->open();
$session
->switchToIFrame('entity_browser_iframe_media_browser');
$items = $this
->getItems();
$this
->assertGreaterThanOrEqual(3, count($items));
$this->assert
->fieldExists('Select this item', $items[0])
->check();
$items[0]
->click();
$this->assert
->fieldExists('Select this item', $items[1])
->check();
$items[1]
->click();
$this->assert
->elementsCount('css', '[data-selectable].selected', 1);
$this->assert
->elementNotExists('css', '[data-selectable].disabled');
}
public function testEditEmbed() {
$session = $this
->getSession();
$node = $this
->createNode([
'type' => 'page',
'title' => 'Blorf',
'uid' => $this->uid,
'body' => [
'value' => '',
'format' => 'rich_text',
],
]);
$this
->visit('/node/' . $node
->id() . '/edit');
$this
->open();
$session
->switchToIFrame('entity_browser_iframe_media_browser');
$items = $this
->getItems();
$this
->assertGreaterThanOrEqual(3, count($items));
$this->assert
->fieldExists('Select this item', $items[0])
->check();
$this->assert
->buttonExists('Place')
->press();
$session
->switchToIFrame(NULL);
$this->assert
->assertWaitOnAjaxRequest();
$embed_dialog = $this->assert
->elementExists('css', 'form.entity-embed-dialog');
$this->assert
->buttonExists('Embed', $embed_dialog)
->press();
$this->assert
->assertWaitOnAjaxRequest();
$this->assert
->buttonExists('Save')
->press();
$this
->visit('/node/' . $node
->id() . '/edit');
$this
->open();
$this->assert
->assertWaitOnAjaxRequest();
$this->assert
->elementExists('css', 'form.entity-embed-dialog');
}
public function testImageEmbed() {
$session = $this
->getSession();
$file_storage = $this->container
->get('entity_type.manager')
->getStorage('file');
$uri = uniqid('public://') . '.png';
$uri = $this
->getRandomGenerator()
->image($uri, '640x480', '800x600');
$image = $file_storage
->create([
'uri' => $uri,
]);
$file_storage
->save($image);
$media = $this
->addMedia([
'bundle' => 'image',
'name' => 'Foobar',
'image' => $image
->id(),
]);
$media->image->alt = 'I am the greetest';
$this
->assertSame(SAVED_UPDATED, $media
->save());
$this
->visit('/node/add/page');
$this
->open();
$session
->switchToIFrame('entity_browser_iframe_media_browser');
$this->assert
->fieldExists('Type')
->selectOption('Image');
$this
->applyFilters();
$items = $this
->getItems();
$this
->assertGreaterThanOrEqual(1, count($items));
$items[0]
->click();
$this->assert
->buttonExists('Place')
->press();
$session
->switchToIFrame(NULL);
$this->assert
->assertWaitOnAjaxRequest();
$embed_dialog = $this->assert
->elementExists('css', 'form.entity-embed-dialog');
$this->assert
->optionExists('Image style', 'Cropped: Freeform', $embed_dialog);
$this->assert
->fieldValueEquals('Alternate text', 'I am the greetest', $embed_dialog);
$this->assert
->fieldValueEquals('attributes[title]', 'Foobar', $embed_dialog);
}
public function testDocumentEmbed() {
$session = $this
->getSession();
$file_storage = $this->container
->get('entity_type.manager')
->getStorage('file');
$uri = uniqid('public://') . '.txt';
file_put_contents($uri, $this
->getRandomGenerator()
->paragraphs());
$file = $file_storage
->create([
'uri' => $uri,
]);
$file_storage
->save($file);
$this
->addMedia([
'bundle' => 'document',
'field_document' => $file
->id(),
]);
$this
->visit('/node/add/page');
$this
->open();
$session
->switchToIFrame('entity_browser_iframe_media_browser');
$this->assert
->fieldExists('Type')
->selectOption('Document');
$this
->applyFilters();
$items = $this
->getItems();
$this
->assertGreaterThanOrEqual(1, count($items));
$items[0]
->click();
$this->assert
->buttonExists('Place')
->press();
$session
->switchToIFrame(NULL);
$this->assert
->assertWaitOnAjaxRequest();
$embed_dialog = $this->assert
->elementExists('css', 'form.entity-embed-dialog');
$this->assert
->fieldNotExists('Image style', $embed_dialog);
$this->assert
->fieldNotExists('Alternative text', $embed_dialog);
$this->assert
->fieldNotExists('attributes[title]', $embed_dialog);
}
private function addMedia(array $values) {
$storage = $this->container
->get('entity_type.manager')
->getStorage('media');
$values += [
'name' => $this
->randomString(),
];
$media = $storage
->create($values);
$media
->set('field_media_in_library', TRUE)
->setPublished();
$this
->assertSame(SAVED_NEW, $storage
->save($media));
array_push($this->media, $media);
return $media;
}
private function getItems() {
return $this
->getSession()
->getPage()
->findAll('css', '[data-selectable]');
}
private function applyFilters() {
$this->assert
->elementExists('css', '.views-exposed-form .form-actions input[type = "submit"]')
->press();
$this->assert
->assertWaitOnAjaxRequest();
sleep(2);
}
private function open() {
$session = $this
->getSession();
$status = $session
->wait(10000, 'Object.keys( CKEDITOR.instances ).length > 0');
$this
->assertTrue($status);
$editors = $session
->evaluateScript('Object.keys( CKEDITOR.instances )');
$this
->assertInternalType('array', $editors);
$editors = array_filter($editors);
$this
->assertNotEmpty($editors);
$editor = reset($editors);
$status = $session
->wait(10000, "CKEDITOR.instances['{$editor}'].status === 'ready'");
$this
->assertTrue($status);
$status = $session
->evaluateScript("CKEDITOR.instances['{$editor}'].execCommand('editdrupalentity', { id: 'media_browser' });");
$this
->assertNotEmpty($status);
sleep(3);
}
}