You are here

public function DomainAccessFieldTest::testDomainAccessFields in Domain Access 8

Tests that the fields are accessed properly.

File

domain_access/tests/src/Functional/DomainAccessFieldTest.php, line 42

Class

DomainAccessFieldTest
Tests the domain access entity reference field type.

Namespace

Drupal\Tests\domain_access\Functional

Code

public function testDomainAccessFields() {
  $label = 'Send to all affiliates';

  // Test a user who can access all domain settings.
  $user1 = $this
    ->drupalCreateUser([
    'create article content',
    'publish to any domain',
  ]);
  $this
    ->drupalLogin($user1);

  // Visit the article creation page.
  $this
    ->drupalGet('node/add/article');
  $this
    ->assertResponse(200, 'Article creation found.');

  // Check for the form options.
  $domains = \Drupal::entityTypeManager()
    ->getStorage('domain')
    ->loadMultiple();
  foreach ($domains as $domain) {
    $this
      ->assertText($domain
      ->label(), 'Domain form item found.');
  }
  $this
    ->assertText($label, 'All affiliates field found.');

  // Test a user who can access some domain settings.
  $user2 = $this
    ->drupalCreateUser([
    'create article content',
    'publish to any assigned domain',
  ]);
  $active_domain = array_rand($domains, 1);
  $this
    ->addDomainsToEntity('user', $user2
    ->id(), $active_domain, DomainAccessManagerInterface::DOMAIN_ACCESS_FIELD);
  $this
    ->drupalLogin($user2);

  // Visit the article creation page.
  $this
    ->drupalGet('node/add/article');
  $this
    ->assertResponse(200, 'Article creation found.');

  // Check for the form options.
  foreach ($domains as $domain) {
    if ($domain
      ->id() == $active_domain) {
      $this
        ->assertRaw('>' . $domain
        ->label() . '</label>', 'Domain form item found.');
    }
    else {
      $this
        ->assertNoRaw('>' . $domain
        ->label() . '</label>', 'Domain form item not found.');
    }
  }
  $this
    ->assertNoText($label, 'All affiliates field not found.');

  // Test a user who can access no domain settings.
  $user3 = $this
    ->drupalCreateUser([
    'create article content',
  ]);
  $this
    ->drupalLogin($user3);

  // Visit the article creation page.
  $this
    ->drupalGet('node/add/article');
  $this
    ->assertResponse(200, 'Article creation found.');

  // Check for the form options.
  foreach ($domains as $domain) {
    $this
      ->assertNoText($domain
      ->label(), 'Domain form item not found.');
  }
  $this
    ->assertNoText($label, 'All affiliates field not found.');

  // Attempt saving the node.
  // The domain/domain affiliates fields are not accessible to this user.
  // The save will fail with an EntityStorageException until
  // https://www.drupal.org/node/2609252 is fixed.
  $edit = [];
  $edit['title[0][value]'] = $this
    ->randomMachineName(8);
  $edit['body[0][value]'] = $this
    ->randomMachineName(16);
  $this
    ->drupalGet('node/add/article');
  $this
    ->submitForm($edit, 'Save');

  // Check that the node exists in the database.
  $node = $this
    ->drupalGetNodeByTitle($edit['title[0][value]']);
  $this
    ->assertNotNull($node, 'Node found in database.');

  // Test a user who can assign users to domains.
  $user4 = $this
    ->drupalCreateUser([
    'administer users',
    'assign editors to any domain',
  ]);
  $this
    ->drupalLogin($user4);

  // Visit the account creation page.
  $this
    ->drupalGet('admin/people/create');
  $this
    ->assertResponse(200, 'User creation found.');

  // Check for the form options.
  foreach ($domains as $domain) {
    $this
      ->assertText($domain
      ->label(), 'Domain form item found.');
  }

  // Test a user who can assign users to some domains.
  $user5 = $this
    ->drupalCreateUser([
    'administer users',
    'assign domain editors',
  ]);
  $active_domain = array_rand($domains, 1);
  $this
    ->addDomainsToEntity('user', $user5
    ->id(), $active_domain, DomainAccessManagerInterface::DOMAIN_ACCESS_FIELD);
  $this
    ->drupalLogin($user5);

  // Visit the account creation page.
  $this
    ->drupalGet('admin/people/create');
  $this
    ->assertResponse(200, 'User creation found.');

  // Check for the form options.
  foreach ($domains as $domain) {
    if ($domain
      ->id() == $active_domain) {
      $this
        ->assertRaw('>' . $domain
        ->label() . '</label>', 'Domain form item found.');
    }
    else {
      $this
        ->assertNoRaw('>' . $domain
        ->label() . '</label>', 'Domain form item not found.');
    }
  }

  // Test a user who can access no domain settings.
  $user6 = $this
    ->drupalCreateUser([
    'administer users',
  ]);
  $this
    ->drupalLogin($user6);

  // Visit the account creation page.
  $this
    ->drupalGet('admin/people/create');
  $this
    ->assertResponse(200, 'User creation found.');

  // Check for the form options.
  foreach ($domains as $domain) {
    $this
      ->assertNoText($domain
      ->label(), 'Domain form item not found.');
  }

  // Test a user who can access all domain settings.
  $user7 = $this
    ->drupalCreateUser([
    'bypass node access',
    'publish to any domain',
  ]);
  $this
    ->drupalLogin($user7);

  // Create a new content type and test that the fields are created.
  // Create a content type programmatically.
  $type = $this
    ->drupalCreateContentType();
  $type_exists = (bool) NodeType::load($type
    ->id());
  $this
    ->assertTrue($type_exists, 'The new content type has been created in the database.');

  // The test is not passing to domain_access_node_type_insert() properly.
  domain_access_confirm_fields('node', $type
    ->id());

  // Visit the article creation page.
  $this
    ->drupalGet('node/add/' . $type
    ->id());
  $this
    ->assertResponse(200, $type
    ->id() . ' creation found.');

  // Check for the form options.
  $domains = \Drupal::entityTypeManager()
    ->getStorage('domain')
    ->loadMultiple();
  foreach ($domains as $domain) {
    $this
      ->assertText($domain
      ->label(), 'Domain form item found.');
  }
  $this
    ->assertText($label, 'All affiliates field found.');

  // Test user without access to affiliates field editing their user page.
  $user8 = $this
    ->drupalCreateUser([
    'change own username',
  ]);
  $this
    ->drupalLogin($user8);
  $user_edit_page = 'user/' . $user8
    ->id() . '/edit';
  $this
    ->drupalGet($user_edit_page);

  // Check for the form options.
  $domains = \Drupal::entityTypeManager()
    ->getStorage('domain')
    ->loadMultiple();
  foreach ($domains as $domain) {
    $this
      ->assertNoText($domain
      ->label(), 'Domain form item not found.');
  }
  $this
    ->assertNoText($label, 'All affiliates field not found.');

  // Change own username.
  $edit = [];
  $edit['name'] = $this
    ->randomMachineName();
  $this
    ->drupalGet($user_edit_page);
  $this
    ->submitForm($edit, 'Save');
}