acquia_dam-1.0.0-rc1/tests/src/FunctionalJavascript/SiteStudioIntegrationTest.php
tests/src/FunctionalJavascript/SiteStudioIntegrationTest.php
<?php declare(strict_types=1); namespace Drupal\Tests\acquia_dam\FunctionalJavascript; use Drupal\cohesion\Drush\DX8CommandHelpers; use Drupal\Core\Logger\RfcLogLevel; use Drupal\Core\Url; /** * Tests integration with Acquia Site Studio. * * @group acquia_dam * @requires module cohesion */ final class SiteStudioIntegrationTest extends AcquiaDamWebDriverTestBase { /** * {@inheritdoc} */ protected static $configSchemaCheckerExclusions = [ 'cohesion.settings', 'core.entity_view_display.node.site_studio.default', ]; /** * {@inheritdoc} */ protected $defaultTheme = 'cohesion_theme'; /** * {@inheritdoc} */ protected static $modules = [ 'path', 'text', 'node', 'views', 'cohesion', 'cohesion_templates', 'cohesion_elements', 'media_library', // Undocumented dependencies. 'cohesion_base_styles', 'cohesion_custom_styles', 'cohesion_website_settings', // Install dblog to assist with debugging. 'dblog', ]; /** * {@inheritdoc} */ protected function tearDown(): void { $log = \Drupal::database() ->select('watchdog', 'w') ->fields('w') ->condition('severity', RfcLogLevel::ERROR, '<=') ->execute() ->fetchAll(); if (count($log) > 0) { var_export($log); } parent::tearDown(); } /** * {@inheritdoc} */ protected function setUp(): void { if (empty(getenv('SITESTUDIO_API_KEY')) || empty(getenv('SITESTUDIO_ORG_KEY'))) { $this->markTestSkipped('Cannot test without Site Studio key.'); } parent::setUp(); \Drupal::configFactory()->getEditable('cohesion.settings') ->set('api_key', getenv('SITESTUDIO_API_KEY')) ->set('organization_key', getenv('SITESTUDIO_ORG_KEY')) ->set('image_browser', [ 'config' => [ 'type' => 'medialib_imagebrowser', 'dx8_entity_browser' => 'media_browser', 'cohesion_media_lib_types' => [], ], 'content' => [ 'type' => 'medialib_imagebrowser', 'dx8_entity_browser' => 'media_browser', 'cohesion_media_lib_types' => [], ], ]) ->save(TRUE); $errors = DX8CommandHelpers::import(); self::assertFalse($errors); } /** * Tests creating a PDF component for Site Studio. * * @param string $asset_type * Type of the asset. * @param string $asset_id * ID of the asset. * @param string $asset_name * Name of the asset. * * @dataProvider assetList */ public function testCreateComponent(string $asset_type, string $asset_id, string $asset_name): void { $this->grantSiteRegistrationToken(); $this->createSiteStudioAccessUser(); $this->grantCurrentUserDamToken(); $this->drupalGet(Url::fromRoute('entity.cohesion_component.add_form')); // Wait for machine-name.js to append its elements. $this->getSession()->getPage()->fillField('label', "$asset_type Component"); $this->assertSession()->waitForElementVisible('css', '#edit-label-machine-name-suffix .admin-link'); $this->getSession()->getPage()->selectFieldOption('Category', 'cpt_cat_category'); $this->getSession()->getPage()->find('css', 'button[aria-label="Add form fields"]')->click(); $this->assertSession()->waitForElement('css', '#ssa-sidebar-browser'); // Wait for sidebar to finish loading. $this->assertSession()->waitForElementRemoved('css', '#ssa-sidebar-browser dev[role="status"]'); $this->getSession()->getPage() ->find('css', 'li[data-ssa-name="Entity browser"]') ->find('css', 'button[aria-label="Add to canvas"]') ->click(); $this->getSession()->getPage() ->find('css', 'ol[data-canvas-key="componentForm"]') ->find('css', 'li[data-type="Entity browser"]') ->doubleClick(); $this->assertSession()->waitForElement('css', '.ssa-modal-sidebar-editor'); $this->assertSession()->waitForElement('css', 'iframe[title="Edit component"]'); $this->getSession()->executeScript(<<<JS document.querySelector('iframe[title="Edit component"]').name = 'edit_component' JS); $this->getSession()->switchToIFrame('edit_component'); $this->assertSession()->waitForText('Entity browser type'); $this->getSession()->getPage()->selectFieldOption('Entity browser type', 'Media library'); $this->getSession()->getPage() ->find('css', 'coh-checkbox-toggle[model="model[\'model\'][\'value\'][\'bundles\'][\'acquia_dam_' . strtolower($asset_type) . '_asset\']"]') ->find('css', 'span.checkbox-toggle-off') ->click(); $this->getSession()->getPage()->pressButton('Apply'); $this->getSession()->switchToIFrame(); $this->assertSession()->waitForElementRemoved('css', 'iframe[title="Edit component"]'); $component_entity_browser = $this->assertSession()->waitForElement('css', 'coh-entity-browser'); $this->assertSession()->waitForElement('css', '.coh-file-browser-button'); $component_entity_browser->pressButton('Browse'); $this->assertSession()->assertWaitOnAjaxRequest(); $this->assertSession()->waitForElement('css', 'iframe[title="Entity browser"]'); $this->getSession()->executeScript(<<<JS document.querySelector('iframe[title="Entity browser"]').name = 'entity_browser' JS); $this->getSession()->switchToIFrame('entity_browser'); $this->assertSession()->waitForElement('css', '#media-library-wrapper'); $this->assertSession()->assertWaitOnAjaxRequest(); $media_select_checkbox = $this->assertSession()->elementExists('css', '[value="' . $asset_id . '"]'); $media_select_checkbox->check(); $this->getSession()->getPage()->pressButton('Insert selected'); $this->getSession()->switchToIFrame(); $this->assertSession()->waitForElementRemoved('css', 'iframe[title="Entity browser"]'); $this->assertSession()->waitForElement('css', 'img[alt="' . $asset_name . '"]'); $this->getSession()->getPage()->find('css', 'button[aria-label="Add content"]')->click(); $this->assertSession()->waitForElement('css', '#ssa-sidebar-browser'); // Wait for sidebar to finish loading. $this->assertSession()->waitForElementRemoved('css', '#ssa-sidebar-browser dev[role="status"]'); $this->getSession()->getPage() ->find('css', 'li[data-ssa-name="Entity browser"]') ->find('css', 'button[type="button"]') ->click(); $this->getSession()->getPage() ->find('css', 'ol[data-canvas-key="canvas"]') ->find('css', 'li[data-type="Entity browser"]') ->doubleClick(); $this->assertSession()->waitForElement('css', '.ssa-modal-sidebar-editor'); $this->assertSession()->waitForElement('css', 'iframe[title="Edit component"]'); $this->getSession()->executeScript(<<<JS document.querySelector('iframe[title="Edit component"]').name = 'edit_component' JS); $this->getSession()->switchToIFrame('edit_component'); $this->assertSession()->waitForText('Settings'); $this->assertSession()->waitForElement('css', '.coh-actions-bar'); $this->getSession()->getPage() ->find('css', '.coh-actions-bar') ->find('css', '.coh-toggle-variable-mode-btn') ->click(); $this->assertSession()->waitForText('Entity browser'); $this->getSession()->getPage()->find('css', 'input[ng-model="dir.variableModeModel"]')->setValue('[field.entity-browser]'); $this->getSession()->getPage()->pressButton('Apply'); $this->getSession()->switchToIFrame(); $this->assertSession()->waitForElementRemoved('css', 'iframe[title="Edit component"]'); $this->getSession()->getPage()->pressButton('Save and continue'); $this->assertSession()->pageTextContains("Created the Component $asset_type Component."); } /** * Tests using the PDF component. * * @param string $asset_type * Type of the asset. * @param string $asset_id * ID of the asset. * @param string $asset_name * Name of the asset. * @param string $expected_html * The expected HTML for the comparison. * * @dataProvider assetList() */ public function testCreateAndUseComponent(string $asset_type, string $asset_id, string $asset_name, string $expected_html) { $this->testCreateComponent($asset_type, $asset_id, $asset_name); $this->drupalGet('/node/add/site_studio'); $this->getSession()->getPage()->fillField('Title', "$asset_type Site Studio Node"); $this->assertSession()->waitForElement('css', '.ssa-layout-canvas button[aria-label="Add content"]'); $this->getSession()->getPage() ->find('css', 'button[aria-label="Add content"]') ->click(); $this->assertSession()->waitForElement('css', 'li[data-ssa-name="' . $asset_type . ' Component"]'); $this->getSession()->getPage() ->find('css', 'li[data-ssa-name="' . $asset_type . ' Component"]') ->find('css', 'button[aria-label="Add to canvas"]') ->click(); $this->assertSession()->waitForElement('css', 'ol[data-canvas-key="canvas"]'); $this->getSession()->getPage() ->find('css', 'ol[data-canvas-key="canvas"]') ->find('css', 'li[data-type="' . $asset_type . ' Component"]') ->doubleClick(); $this->assertSession()->waitForElement('css', '.ssa-modal-sidebar-editor'); $this->assertSession()->waitForElement('css', 'iframe[title="Edit component"]'); $this->getSession()->executeScript(<<<JS document.querySelector('iframe[title="Edit component"]').name = 'edit_component' JS); $this->getSession()->switchToIFrame('edit_component'); $this->assertSession()->waitForText("$asset_type Component"); $this->getSession()->getPage()->pressButton('Browse'); $this->assertSession()->assertWaitOnAjaxRequest(); $this->assertSession()->waitForElement('css', 'iframe[title="Entity browser"]'); $this->getSession()->executeScript(<<<JS document.querySelector('iframe[title="Entity browser"]').name = 'entity_browser' JS); $this->getSession()->switchToIFrame('entity_browser'); $this->assertSession()->waitForElement('css', '#media-library-wrapper'); $this->assertSession()->assertWaitOnAjaxRequest(); $media_select_checkbox = $this->assertSession()->elementExists('css', '[value="' . $asset_id . '"]'); $media_select_checkbox->check(); $this->getSession()->getPage()->pressButton('Insert selected'); $this->getSession()->switchToWindow(); $this->assertSession()->assertWaitOnAjaxRequest(); $this->assertSession()->waitForElement('css', 'img[alt="' . $asset_name . '"]'); // @note: must switch to parent frame to switch back to edit_component. $this->getSession()->switchToIFrame(); $this->getSession()->switchToIFrame('edit_component'); $this->getSession()->getPage()->pressButton('Apply'); $this->getSession()->switchToIFrame(); $this->assertSession()->waitForElementRemoved('css', 'iframe[title="Edit component"]'); $this->getSession()->getPage()->pressButton('Save'); $this->assertSession()->waitForText("Site Studio $asset_type Site Studio Node has been created"); $this->assertSession()->responseContains($expected_html); } /** * Data for the node creation. */ public static function assetList() { return [ ['Video', 'efb03f75-3c42-497b-baa9-5ec79d1f56af', 'SD-Social Promo.mp4', '<iframe src="https://test.widen.net/view/video/mnmc58hipn/SD-Social-Promo.mp4" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" frameborder="0" allowtransparency="true" scrolling="no" style="position:absolute;top:0;left:0;width:100%;height:100%;"></iframe>', ], ['PDF', '0324b0b2-5293-4aa0-b0aa-c85b003395e2', 'Explorer owner\'s manual.pdf', '<a href="https://test.widen.net/view/pdf/8a1ouvfchk/Explorer-owners-manual.pdf?t.download=true" target="_blank">', ], ['Spinset', 'eec6d92b-6452-4ab6-894a-b4d0826e65ba', 'eudaimonia_spin.zip', '<a href="https://test.widen.net/view/spinset/yjezd5iwh5/eudaimonia_spin.zip" target="_blank">eudaimonia_spin.zip</a>', ], ['Image', '56ff14de-02cd-41b5-9a73-c917eab19abf', 'Wheel Illustration.ai', '<img src="https://laser.widen.net/content/9e4e810c-147b-4ac2-85a9-cf64f8fa61e0/web/Wheel%20Illustration.ai" width="157" height="120" alt="Wheel Illustration.ai" loading="lazy">', ], ]; } /** * Test for creating image template in the site studio. */ public function testImageComponents() { // Site studio breaks with more content in the iframe without the module // admin toolbar so restricting it using permission. $this->createSiteStudioTemplateAccessUser(); $this->drupalGet('/admin/cohesion/templates/content_templates/media/media_acquia_dam_image_asset_ful/edit'); $this->assertSession()->waitForElement('css', '.ssa-layout-canvas button[aria-label="Add content"]'); $this->getSession()->getPage() ->find('css', 'button[aria-label="Add content"]') ->click(); $this->assertSession()->waitForElement('css', '#ssa-sidebar-browser'); // Wait for sidebar to finish loading. $this->assertSession()->waitForElementRemoved('css', '#ssa-sidebar-browser dev[role="status"]'); $this->assertSession()->waitForText('Media Elements'); $this->getSession()->getPage() ->find('css', 'li[data-ssa-name="Picture"]') ->find('css', 'button[type="button"]') ->click(); $this->getSession()->getPage() ->find('css', 'ol[data-canvas-key="canvas"]') ->find('css', 'li[data-type="Picture"]') ->doubleClick(); $this->assertSession()->waitForElement('css', '.ssa-modal-sidebar-editor'); $this->assertSession()->waitForElement('css', 'iframe[title="Edit component"]'); $this->getSession()->executeScript(<<<JS document.querySelector('iframe[title="Edit component"]').name = 'edit_component' JS); $this->getSession()->switchToIFrame('edit_component'); $this->assertSession()->waitForText('Settings'); $this->assertSession()->waitForElement('css', '.coh-actions-bar'); $this->getSession()->getPage() ->find('css', '.coh-actions-bar') ->find('css', '.coh-toggle-variable-mode-btn') ->click(); $inputs = $this->getSession()->getPage()->findAll('xpath', '//input[contains(@id,"settings-styles-xl-pictureImagesArray")]'); self::assertCount(2, $inputs); $inputs[0]->setValue('[media:asset-path]'); $inputs[1]->setValue('thumbnail'); $this->getSession()->getPage()->pressButton('Apply'); $this->getSession()->switchToIFrame(); $this->assertSession()->waitForElementRemoved('css', 'iframe[title="Edit component"]'); $this->getSession()->getPage() ->find('css', 'input[id="edit-set-default"]') ->click(); $this->getSession()->getPage()->pressButton('Save and continue'); $this->assertSession()->pageTextContains("Your styles have been updated."); $this->testCreateAndUseComponent('Image', '56ff14de-02cd-41b5-9a73-c917eab19abf', 'Wheel Illustration.ai', '<img class="coh-image coh-image-responsive-xl" src="https://laser.widen.net/content/9e4e810c-147b-4ac2-85a9-cf64f8fa61e0/web/Wheel%20Illustration.ai?w=100&h=100">'); } /** * Creates and logs in a Site Studio user. */ public function createSiteStudioAccessUser(): void { $user = $this->drupalCreateUser([ // Permission for generating machine names. 'access content', // Content permissions. 'administer nodes', 'bypass node access', // Site Studio permissions. 'administer cohesion', 'administer cohesion settings', 'administer base styles', 'administer components', 'administer component content', 'administer component categories', // These permissions are explicitly checked in callbacks and are not // superseded by any administer permission. 'access elements', 'access fields', 'access helpers', 'access components', 'access tokens', 'access drupal core elements group', ]); $this->drupalLogin($user); } /** * Creates and logs in a Site Studio user. */ public function createSiteStudioTemplateAccessUser(): void { $user = $this->drupalCreateUser([ // Permission for generating machine names. 'access content', // Content permissions. 'administer nodes', 'bypass node access', // Site Studio permissions. 'administer cohesion', 'administer cohesion settings', 'administer base styles', 'administer components', 'administer component content', 'administer component categories', // These permissions are explicitly checked in callbacks and are not // superseded by any administer permission. 'access elements', 'access fields', 'access helpers', 'access components', 'access tokens', // Template permissions. 'administer content templates', 'access media elements group', ]); $this->drupalLogin($user); } }