View source  
  <?php
namespace Drupal\Tests\media_revisions_ui\Functional;
use Drupal\Core\Entity\EntityInterface;
use Drupal\media\Entity\Media;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
use Drupal\user\Entity\User;
class MediaRevisionsUiTest extends BrowserTestBase {
  use MediaTypeCreationTrait;
  
  public static $modules = [
    'system',
    'node',
    'media',
    'media_test_source',
    'media_revisions_ui',
    'block',
  ];
  
  protected $defaultTheme = 'stark';
  
  protected $user;
  
  protected $mediaType;
  
  protected $mediaStorage;
  
  protected function setUp() {
    parent::setUp();
    
    $entityTypeManager = $this->container
      ->get('entity_type.manager');
    $this->mediaStorage = $entityTypeManager
      ->getStorage('media');
    $this
      ->drupalPlaceBlock('local_tasks_block');
    $this->mediaType = $this
      ->createMediaType('test');
  }
  
  public function testTabAccess() {
    $media = Media::create([
      'bundle' => $this->mediaType
        ->id(),
      'name' => 'Test media',
    ]);
    $media
      ->save();
    
    $this
      ->assertRevisionsListStatusCode($this
      ->drupalCreateUser([]), $media, 403);
    $user = $this
      ->drupalCreateUser([
      'administer media',
      'view all media revisions',
    ]);
    
    $media = Media::create([
      'bundle' => $this->mediaType
        ->id(),
      'name' => 'Test media',
    ]);
    $media
      ->save();
    $this
      ->assertRevisionsListStatusCode($user, $media, 403);
    $this
      ->assertRevisionsTabNotExists($media);
    
    $this
      ->createMediaRevision($media);
    $this
      ->assertRevisionsListStatusCode($user, $media, 200);
    $this
      ->assertRevisionsTabExists($media);
    
    $revisionId = $this
      ->loadOldestRevisionId($media);
    $this->mediaStorage
      ->deleteRevision($revisionId);
    $this
      ->assertRevisionsListStatusCode($user, $media, 403);
    $this
      ->assertRevisionsTabNotExists($media);
    
    $this->mediaType
      ->setNewRevision(TRUE);
    $this->mediaType
      ->save();
    $media = Media::create([
      'bundle' => $this->mediaType
        ->id(),
      'name' => 'Test media',
    ]);
    $media
      ->save();
    $this
      ->assertRevisionsListStatusCode($user, $media, 200);
    $this
      ->assertRevisionsTabExists($media);
  }
  
  public function testRevert() {
    $media = Media::create([
      'bundle' => $this->mediaType
        ->id(),
      'name' => 'Test media',
    ]);
    $media
      ->save();
    $user = $this
      ->drupalCreateUser([
      'administer media',
      'view all media revisions',
    ]);
    $this
      ->createMediaRevision($media);
    $this
      ->assertRevisionsListStatusCode($user, $media, 200);
    $this
      ->clickLink('Revert');
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $this
      ->getSession()
      ->getPage()
      ->pressButton('Revert');
    $this
      ->assertSession()
      ->pageTextContains('Media Test media has been reverted');
  }
  
  protected function createMediaRevision(EntityInterface $media) {
    $media
      ->setName($this
      ->randomMachineName());
    $media
      ->setNewRevision();
    $media
      ->save();
    return $media;
  }
  
  protected function assertRevisionsListStatusCode(User $user, EntityInterface $media, $expectedStatusCode) {
    $this
      ->drupalLogin($user);
    $this
      ->drupalGet("/media/{$media->id()}/revisions");
    $this
      ->assertSession()
      ->statusCodeEquals($expectedStatusCode);
  }
  
  protected function assertRevisionsTabNotExists(EntityInterface $media) {
    $this
      ->drupalGet("/media/{$media->id()}/edit");
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $this
      ->assertSession()
      ->linkByHrefNotExists("/media/{$media->id()}/revisions");
  }
  
  protected function assertRevisionsTabExists(EntityInterface $media) {
    $this
      ->drupalGet("/media/{$media->id()}/edit");
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $this
      ->assertSession()
      ->linkByHrefExists("/media/{$media->id()}/revisions");
  }
  
  protected function loadOldestRevisionId(EntityInterface $media) {
    $result = $this->mediaStorage
      ->getQuery()
      ->allRevisions()
      ->condition('mid', $media
      ->id())
      ->sort('vid', 'ASC')
      ->range(NULL, 1)
      ->execute();
    return array_keys($result) ? array_keys($result)[0] : NULL;
  }
}