You are here

public function DomainAliasNegotiatorTest::testDomainAliasNegotiator in Domain Access 8

Tests the handling of aliased requests.

File

domain_alias/tests/src/Functional/DomainAliasNegotiatorTest.php, line 24

Class

DomainAliasNegotiatorTest
Tests domain alias request negotiation.

Namespace

Drupal\Tests\domain_alias\Functional

Code

public function testDomainAliasNegotiator() {

  // No domains should exist.
  $this
    ->domainTableIsEmpty();

  // Create two new domains programmatically.
  $this
    ->domainCreateTestDomains(2);

  // Since we cannot read the service request, we place a block
  // which shows the current domain information.
  $this
    ->drupalPlaceBlock('domain_server_block');

  // To get around block access, let the anon user view the block.
  user_role_grant_permissions(RoleInterface::ANONYMOUS_ID, [
    'administer domains',
  ]);

  // Set the storage handles.
  $domain_storage = \Drupal::entityTypeManager()
    ->getStorage('domain');
  $alias_storage = \Drupal::entityTypeManager()
    ->getStorage('domain_alias');

  // Set known prefixes that work with our tests. This will give us domains
  // 'example.com' and 'one.example.com' aliased to 'two.example.com' and
  // 'three.example.com'.
  $prefixes = [
    'two',
    'three',
  ];

  // Test the response of each home page.

  /** @var \Drupal\domain\Entity\Domain $domain */
  foreach ($domain_storage
    ->loadMultiple() as $domain) {
    $alias_domains[] = $domain;
    $this
      ->drupalGet($domain
      ->getPath());
    $this
      ->assertRaw($domain
      ->label(), 'Loaded the proper domain.');
    $this
      ->assertRaw('Exact match', 'Direct domain match.');
  }

  // Now, test an alias for each domain.
  foreach ($alias_domains as $index => $alias_domain) {
    $prefix = $prefixes[$index];

    // Set a known pattern.
    $pattern = $prefix . '.' . $this->baseHostname;
    $this
      ->domainAliasCreateTestAlias($alias_domain, $pattern);
    $alias = $alias_storage
      ->loadByPattern($pattern);

    // Set the URL for the request. Note that this is not saved, it is just
    // URL generation.
    $alias_domain
      ->set('hostname', $pattern);
    $alias_domain
      ->setPath();
    $url = $alias_domain
      ->getPath();
    $this
      ->drupalGet($url);
    $this
      ->assertRaw($alias_domain
      ->label(), 'Loaded the proper domain.');
    $this
      ->assertRaw('ALIAS:', 'No direct domain match.');
    $this
      ->assertRaw($alias
      ->getPattern(), 'Alias match.');

    // Test redirections.
    // @TODO: This could be much more elegant: the redirects break assertRaw()
    $alias
      ->set('redirect', 301);
    $alias
      ->save();
    $this
      ->drupalGet($url);
    $alias
      ->set('redirect', 302);
    $alias
      ->save();
    $this
      ->drupalGet($url);
  }

  // Test a wildcard alias.
  // @TODO: Refactor this test to merge with the above.
  $alias_domain = $domain_storage
    ->loadDefaultDomain();
  $pattern = '*.' . $this->baseHostname;
  $this
    ->domainAliasCreateTestAlias($alias_domain, $pattern);
  $alias = $alias_storage
    ->loadByPattern($pattern);

  // Set the URL for the request. Note that this is not saved, it is just
  // URL generation.
  $alias_domain
    ->set('hostname', 'four.' . $this->baseHostname);
  $alias_domain
    ->setPath();
  $url = $alias_domain
    ->getPath();
  $this
    ->drupalGet($url);
  $this
    ->assertRaw($alias_domain
    ->label(), 'Loaded the proper domain.');
  $this
    ->assertRaw('ALIAS:', 'No direct domain match.');
  $this
    ->assertRaw($alias
    ->getPattern(), 'Alias match.');

  // Test redirections.
  // @TODO: This could be much more elegant: the redirects break assertRaw()
  $alias
    ->set('redirect', 301);
  $alias
    ->save();
  $this
    ->drupalGet($url);
  $alias
    ->set('redirect', 302);
  $alias
    ->save();
  $this
    ->drupalGet($url);

  // Revoke the permission change.
  user_role_revoke_permissions(RoleInterface::ANONYMOUS_ID, [
    'administer domains',
  ]);
}