media_mpx-8.x-1.x-dev/tests/src/FunctionalJavascript/Plugin/views/filter/AvailabilityTest.php

tests/src/FunctionalJavascript/Plugin/views/filter/AvailabilityTest.php
<?php

namespace Drupal\Tests\media_mpx\FunctionalJavascript\Plugin\views\filter;

use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\media\Entity\Media;
use Drupal\media\Entity\MediaType;
use Drupal\media_mpx\Entity\Account;
use Drupal\media_mpx\Entity\User;
use Drupal\media_mpx_test\JsonResponse;

/**
 * Test the Availability filter that we provide.
 *
 * @group media_mpx
 */
class AvailabilityTest extends WebDriverTestBase {

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  const SHORT_DATE_FORMAT = 'm/d/Y - H:i';

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'media_mpx',
    'media_mpx_test',
    'field_ui',
    'views',
    'views_ui',
    'datetime',
  ];

  /**
   * Creates a view of media that uses the Availability filter.
   */
  public function testViewsIntegration() {
    /** @var \Drupal\media_mpx_test\MockClientFactory $factory */
    $factory = $this->container->get('media_mpx.client_factory');
    $factory->getMockHandler()->append([
      new JsonResponse(200, [], 'signin-success.json'),
      new JsonResponse(200, [], 'media-object.json'),
    ]);

    $user = User::create([
      'label' => 'JavaScript test user',
      'id' => 'mpx_testing_example_com',
      'username' => 'mpx/testing@example.com',
      'password' => 'SECRET',
    ]);
    $user->save();
    $account = Account::create([
      'label' => 'JavaScript test account',
      'id' => 'mpx_account',
      'user' => $user->id(),
      'account' => 'http://example.com/account/1',
      'public_id' => 'public-id',
    ]);
    $account->save();

    /** @var \Drupal\media\MediaTypeInterface $media_type */
    $media_type = MediaType::create([
      'id' => 'mpx',
      'label' => 'mpx media type',
      'source' => 'media_mpx_media',
    ]);
    $media_type->save();
    $source_field = $media_type->getSource()->createSourceField($media_type);
    $source_field->getFieldStorageDefinition()->save();
    $source_field->save();

    // This saves us having to mock thumbnail http requests.
    $media_type->setQueueThumbnailDownloadsStatus(TRUE);
    $media_type
      ->set('source_configuration', [
        'source_field' => $source_field->getName(),
        'account' => $account->id(),
      ])
      ->save();

    // Add new available and expiration fields.
    $available_date_storage = $this->container->get('entity_type.manager')
      ->getStorage('field_storage_config')
      ->create([
        'entity_type' => 'media',
        'field_name' => 'field_available_date',
        'type' => 'timestamp',
      ]);
    $available_date_storage->save();
    $expiration_date_storage = $this->container->get('entity_type.manager')
      ->getStorage('field_storage_config')
      ->create([
        'entity_type' => 'media',
        'field_name' => 'field_expiration_date',
        'type' => 'timestamp',
      ]);
    $expiration_date_storage->save();
    $available_date_field = $this->container->get('entity_type.manager')
      ->getStorage('field_config')
      ->create([
        'field_storage' => $available_date_storage,
        'bundle' => 'mpx',
        'label' => 'Available date',
        'required' => FALSE,
      ]);
    $available_date_field->save();
    $expiration_date_field = $this->container->get('entity_type.manager')
      ->getStorage('field_config')
      ->create([
        'field_storage' => $expiration_date_storage,
        'bundle' => 'mpx',
        'label' => 'Expiration date',
        'required' => FALSE,
      ]);
    $expiration_date_field->save();

    // Set the field map.
    $media_type->setFieldMap([
      'Media:availableDate' => 'field_available_date',
      'Media:expirationDate' => 'field_expiration_date',
    ]);
    $media_type->save();

    // Create some mpx media entities to test with.
    $upcoming_media = Media::create([
      'bundle' => 'mpx',
      'name' => $this->randomGenerator->name(),
      $source_field->getName() => 'http://data.media.theplatform.com/media/data/Media/2602559',
      'field_available_date' => strtotime('+1 day'),
      'field_expiration_date' => strtotime('+1 month'),
    ]);
    $upcoming_media->save();
    $available_media = Media::create([
      'bundle' => 'mpx',
      'name' => $this->randomGenerator->name(),
      $source_field->getName() => 'http://data.media.theplatform.com/media/data/Media/2602559',
      'field_available_date' => strtotime('-1 month'),
      'field_expiration_date' => strtotime('+1 month'),
    ]);
    $available_media->save();
    $expired_media = Media::create([
      'bundle' => 'mpx',
      'name' => $this->randomGenerator->name(),
      $source_field->getName() => 'http://data.media.theplatform.com/media/data/Media/2602559',
      'field_available_date' => strtotime('-1 month'),
      'field_expiration_date' => strtotime('-1 day'),
    ]);
    $expired_media->save();

    $page = $this->getSession()->getPage();
    $assert_session = $this->assertSession();
    $this->drupalLogin($this->rootUser);
    $this->drupalGet('admin/structure/media/manage/mpx');
    $this->assertSession()->fieldValueEquals('field_map[Media:availableDate]', 'field_available_date');
    $this->assertSession()->fieldValueEquals('field_map[Media:expirationDate]', 'field_expiration_date');

    // Create a view that lists all media.
    $this->drupalGet('admin/structure/views/add');
    $page->fillField('edit-label', 'mpx_media');
    $page->selectFieldOption('edit-show-wizard-key', 'media');
    $assert_session->assertWaitOnAjaxRequest();
    $page->findField('edit-page-create')->check();
    $page->selectFieldOption('page[style][style_plugin]', 'table');
    $assert_session->assertWaitOnAjaxRequest();
    $page->pressButton('Save and edit');

    // Add the available and expiration dates to the view.
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#views-add-field'));
    $this->click('#views-add-field');
    $assert_session->assertWaitOnAjaxRequest();
    $page->fillField('override[controls][options_search]', 'available');
    $page->checkField('name[media__field_available_date.field_available_date]');
    // The Save and continue button has a weird structure.
    $page->find('css', 'div > button.button.button--primary.js-form-submit.form-submit.ui-button.ui-corner-all.ui-widget')->click();
    $assert_session->assertWaitOnAjaxRequest();

    // Set the availability field options.
    $page->fillField('options[label]', 'Availability');
    $page->selectFieldOption('options[type]', 'media_mpx_availability');
    $assert_session->assertWaitOnAjaxRequest();
    $page->selectFieldOption('options[settings][date_format]', 'short');
    // The Apply and continue button has a weird structure.
    $page->find('css', 'div > button.button.button--primary.js-form-submit.form-submit.ui-button.ui-corner-all.ui-widget')->click();
    $assert_session->assertWaitOnAjaxRequest();

    // Setup an availability filter.
    $this->click('#views-add-filter');
    $assert_session->assertWaitOnAjaxRequest();
    $page->fillField('override[controls][options_search]', 'availability');
    $page->checkField('name[media_field_data.media_mpx_availability_mpx]');
    // The Save and continue button has a weird structure.
    $page->find('css', 'div > button.button.button--primary.js-form-submit.form-submit.ui-button.ui-corner-all.ui-widget')->click();
    $assert_session->assertWaitOnAjaxRequest();

    $page->checkField('options[expose_button][checkbox][checkbox]');
    $assert_session->assertWaitOnAjaxRequest();
    $page->fillField('options[expose][label]', 'Availability');
    // The Save and continue button has a weird structure.
    $page->find('css', 'div > button.button.button--primary.js-form-submit.form-submit.ui-button.ui-corner-all.ui-widget')->click();
    $assert_session->assertWaitOnAjaxRequest();

    // Save the view.
    $page->pressButton('edit-actions-submit');

    // Finally view the view and assert it's behavior.
    $this->drupalGet('mpx-media');
    // All should be listed by default.
    $assert_session->pageTextContains($upcoming_media->label());
    $assert_session->pageTextContains($available_media->label());
    $assert_session->pageTextContains($expired_media->label());
    // Check the formatter output.
    $assert_session->pageTextContains(sprintf('Upcoming %s', date(self::SHORT_DATE_FORMAT, $upcoming_media->field_available_date->value)));
    $assert_session->pageTextContains(sprintf('Available until %s', date(self::SHORT_DATE_FORMAT, $available_media->field_expiration_date->value)));
    $assert_session->pageTextContains(sprintf('Expired on %s', date(self::SHORT_DATE_FORMAT, $expired_media->field_expiration_date->value)));
    // Select available or upcoming, only expired should be missing.
    $page->selectFieldOption('media_mpx_availability_mpx', 'available_upcoming');
    $page->pressButton('Apply');
    $assert_session->pageTextContains($upcoming_media->label());
    $assert_session->pageTextContains($available_media->label());
    $assert_session->pageTextNotContains($expired_media->label());
    // Select available, only available should be visible.
    $page->selectFieldOption('media_mpx_availability_mpx', 'available');
    $page->pressButton('Apply');
    $assert_session->pageTextContains($available_media->label());
    $assert_session->pageTextNotContains($upcoming_media->label());
    $assert_session->pageTextNotContains($expired_media->label());
    // Select expired, only expired should be visible.
    $page->selectFieldOption('media_mpx_availability_mpx', 'expired');
    $page->pressButton('Apply');
    $assert_session->pageTextContains($expired_media->label());
    $assert_session->pageTextNotContains($upcoming_media->label());
    $assert_session->pageTextNotContains($available_media->label());
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc