authman-1.x-dev/tests/src/Functional/AuthmanCrudUiTest.php

tests/src/Functional/AuthmanCrudUiTest.php
<?php

declare(strict_types = 1);

namespace Drupal\Tests\authman\Functional;

use Drupal\authman\Entity\AuthmanAuth;
use Drupal\authman\Entity\AuthmanAuthInterface;
use Drupal\authman_test_providers\Plugin\AuthmanOauth\AuthmanTestAuthorizationCode;
use Drupal\Core\Url;
use Drupal\Tests\authman\Traits\AuthmanConfigTrait;
use Drupal\Tests\BrowserTestBase;

/**
 * Tests UI CRUD.
 *
 * @group authman
 */
class AuthmanCrudUiTest extends BrowserTestBase {

  use AuthmanConfigTrait;

  /**
   * User interface.
   *
   * @var \Drupal\user\UserInterface
   */
  protected $adminUser;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'system',
    'user',
    'key',
    'key_test',
    'authman',
    'block',
    'authman_test_provider',
    'authman_test_providers',
  ];

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

  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->adminUser = $this->createUser([
      'configure authman',
      'access administration pages',
    ]);
    $this->drupalPlaceBlock('local_actions_block');

    $state = \Drupal::state();
    $state->set('key_test:client', json_encode([
      'client_id' => '407a66da-7f12-4e09-be22-209596c6991f',
      'client_secret' => 'efc0b581-d149-41bc-87b0-90d8afbd555e',
      'account_id' => '',
    ]));
    $state->set('key_test:access_token', json_encode([
      'access_token' => '',
      'refresh_token' => '',
      'token_type' => 'bearer',
      'expires' => 0,
    ]));
  }

  /**
   * Tests authman instance administration.
   */
  public function testAuthmanInstanceAdministration() {
    $this->assertThatAnonymousUserCannotAdministerAuthmanInstances();
    $authmanConfig = $this->assertThatAdminCanAddAuthmanInstances();
    $this->assertThatAdminCanViewTokenInformationForm($authmanConfig);
    $authmanConfig = $this->assertThatAdminCanEditAuthmanInstances($authmanConfig);
    $this->assertThatAdminCanDeleteAuthmanInstances($authmanConfig);
  }

  /**
   * Tests anonymous users can't access instance admin routes.
   */
  private function assertThatAnonymousUserCannotAdministerAuthmanInstances() : void {
    $instance = $this->createAuthmanConfig(
      AuthmanTestAuthorizationCode::PLUGIN_ID,
      AuthmanAuthInterface::GRANT_AUTHORIZATION_CODE,
    );
    $urls = [
      Url::fromRoute('entity.authman_auth.collection'),
      $instance->toUrl('edit-form'),
      $instance->toUrl('delete-form'),
      $instance->toUrl('information'),
      Url::fromRoute('entity.authman_auth.add_form'),
    ];
    foreach ($urls as $url) {
      $this->drupalGet($url);
      $this->assertSession()->statusCodeEquals(403);
    }
  }

  /**
   * Assert that admin can add an authman instance.
   *
   * @return \Drupal\authman\Entity\AuthmanAuthInterface
   *   The added instance.
   */
  private function assertThatAdminCanAddAuthmanInstances() : AuthmanAuthInterface {
    $this->drupalLogin($this->adminUser);
    $this->drupalGet(Url::fromRoute('system.admin_config'));
    $assert = $this->assertSession();
    $assert->linkExists('Authman instances');
    $collection_url = Url::fromRoute('entity.authman_auth.collection');
    $this->drupalGet($collection_url);
    $assert->statusCodeEquals(200);
    $assert->linkExists('Add instance');
    $this->clickLink('Add instance');
    $this->assertUrl(Url::fromRoute('entity.authman_auth.add_form'));
    $instance_name = $this->randomMachineName();
    $id = mb_strtolower($this->randomMachineName());

    foreach ([
      'id' => $id,
      'label' => $instance_name,
      'plugin' => AuthmanTestAuthorizationCode::PLUGIN_ID,
      // Keys from authman_test_provider/config/install/.
      'access_token_key' => 'authman_test_access_token',
      'client_key' => 'authman_test_client',
    ] as $field => $value) {
      $element = $assert->fieldExists($field);
      $element->setValue($value);
    }

    $change = $assert->buttonExists('Update plugin');
    $change->click();
    $field = $assert->fieldExists('grant_type');
    $field->setValue(AuthmanAuthInterface::GRANT_AUTHORIZATION_CODE);
    $field = $assert->fieldExists('plugin_configuration[plugin_form][foo]');
    $field->setValue('http://example.com');

    $assert->buttonExists('Save')->click();
    $assert->pageTextContains(sprintf('Authman instance %s has been added.', $instance_name));
    $authmanConfig = AuthmanAuth::load($id);
    $assert->addressEquals($authmanConfig->toUrl('information'));
    $this->drupalGet($collection_url);
    $assert->linkExists($instance_name);
    return $authmanConfig;
  }

  /**
   * Assert that admins can view token form.
   */
  private function assertThatAdminCanViewTokenInformationForm(AuthmanAuthInterface $authmanConfig) {
    $this->drupalGet(Url::fromRoute('entity.authman_auth.collection'));
    $assert = $this->assertSession();
    $information = $authmanConfig->toUrl('information');
    $assert->linkByHrefExists($information->toString());
    $this->drupalGet($information);
    $assert->statusCodeEquals(200);
    $assert->buttonExists('Connect');
  }

  /**
   * Assert that admin can edit instances.
   *
   * @param \Drupal\authman\Entity\AuthmanAuthInterface $authmanConfig
   *   Instance to edit.
   *
   * @return \Drupal\authman\Entity\AuthmanAuthInterface
   *   The edited instance.
   */
  private function assertThatAdminCanEditAuthmanInstances(AuthmanAuthInterface $authmanConfig) : AuthmanAuthInterface {
    $collection_url = Url::fromRoute('entity.authman_auth.collection');
    $this->drupalGet($collection_url);
    $assert = $this->assertSession();
    $edit = $authmanConfig->toUrl('edit-form');
    $assert->linkByHrefExists($edit->toString());
    $this->drupalGet($edit);
    $assert->fieldValueEquals('label', $authmanConfig->label());
    $assert->fieldValueEquals('plugin', $authmanConfig->getPluginId());
    $assert->fieldValueEquals('client_key', $authmanConfig->getClientKeyId());
    $assert->fieldValueEquals('access_token_key', $authmanConfig->getAccessTokenKeyId());
    $assert->fieldValueEquals('plugin_configuration[plugin_form][foo]', 'http://example.com');
    $new_name = $this->randomMachineName();
    $this->submitForm([
      'label' => $new_name,
    ], 'Save');
    $assert->pageTextContains(sprintf('Authman instance %s has been updated.', $new_name));
    $this->assertUrl($collection_url);
    return \Drupal::entityTypeManager()->getStorage('authman_auth')->loadUnchanged($authmanConfig->id());
  }

  /**
   * Assert that admin can delete authman instances.
   *
   * @param \Drupal\authman\Entity\AuthmanAuthInterface $authmanConfig
   *   The instance to delete.
   */
  private function assertThatAdminCanDeleteAuthmanInstances(AuthmanAuthInterface $authmanConfig) : void {
    $this->drupalGet(Url::fromRoute('entity.authman_auth.collection'));
    $assert = $this->assertSession();
    $delete = $authmanConfig->toUrl('delete-form');
    $assert->linkByHrefExists($delete->toString());
    $this->drupalGet($delete);
    $this->submitForm([], 'Delete');
    $assert->pageTextContains(sprintf('The authman instance %s has been deleted.', $authmanConfig->label()));
  }

}

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

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