<?php

namespace Drupal\Tests\entity\Functional;

use Drupal\entity_module_test\Entity\EnhancedEntity;
use Drupal\entity_module_test\Entity\EnhancedEntityBundle;
use Drupal\Tests\block\Traits\BlockCreationTrait;
use Drupal\Tests\BrowserTestBase;

/**
 * Tests the collection route access check.
 *
 * @group entity
 *
 * @runTestsInSeparateProcesses
 *
 * @preserveGlobalState disabled
 */
class CollectionRouteAccessTest extends BrowserTestBase {

  use BlockCreationTrait;

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = ['entity_module_test', 'user', 'entity', 'block'];

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    parent::setUp();

    EnhancedEntityBundle::create([
      'id' => 'default',
      'label' => 'Default',
    ])->save();

    $this->placeBlock('local_tasks_block');
    $this->placeBlock('system_breadcrumb_block');
  }

  /**
   * Test the collection route access.
   */
  public function testCollectionRouteAccess() {
    $entity = EnhancedEntity::create([
      'name' => 'rev 1',
      'type' => 'default',
    ]);
    $entity->save();

    // User without any relevant permissions.
    $account = $this->drupalCreateUser(['access administration pages']);
    $this->drupalLogin($account);

    $this->drupalGet($entity->toUrl('collection'));
    $this->assertSession()->statusCodeEquals(403);

    // User with "access overview" permissions.
    $account = $this->drupalCreateUser(['access entity_test_enhanced overview']);
    $this->drupalLogin($account);

    $this->drupalGet($entity->toUrl('collection'));
    $this->assertSession()->statusCodeEquals(200);

    // User with full administration permissions.
    $account = $this->drupalCreateUser(['administer entity_test_enhanced']);
    $this->drupalLogin($account);

    $this->drupalGet($entity->toUrl('collection'));
    $this->assertSession()->statusCodeEquals(200);
  }

}
