You are here

class AuthenticationOAuthTest in Entity Share 8.3

Functional test class for import with "OAuth" authorization.

@group entity_share @group entity_share_client

Hierarchy

Expanded class hierarchy of AuthenticationOAuthTest

File

modules/entity_share_client/tests/src/Functional/AuthenticationOAuthTest.php, line 24

Namespace

Drupal\Tests\entity_share_client\Functional
View source
class AuthenticationOAuthTest extends AuthenticationTestBase {
  use SimpleOauthTestTrait;

  /**
   * {@inheritdoc}
   */
  public static $modules = [
    'serialization',
    'simple_oauth',
  ];

  /**
   * Injected key service.
   *
   * @var \Drupal\entity_share_client\Service\KeyProvider
   */
  protected $keyService;

  /**
   * The Drupal config factory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * The client secret.
   *
   * @var string
   */
  protected $clientSecret;

  /**
   * The client (consumer) entities, one per each user.
   *
   * @var \Drupal\consumers\Entity\Consumer[]
   */
  protected $clients;

  /**
   * User role with OAuth permissions and unrestricted node access.
   *
   * @var \Drupal\user\RoleInterface
   */
  protected $clientRole;

  /**
   * User role with OAuth permissions.
   *
   * @var \Drupal\user\RoleInterface
   */
  protected $clientRolePlain;

  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->keyService = $this->container
      ->get('entity_share_client.key_provider');

    // Give admin user access to all channels (channel user already has it).
    foreach ($this->channels as $channel) {
      $authorized_users = $channel
        ->get('authorized_users');
      $authorized_users = array_merge($authorized_users, [
        $this->adminUser
          ->uuid(),
      ]);
      $channel
        ->set('authorized_users', $authorized_users);
      $channel
        ->save();
    }

    // Create Keys with users' credentials.
    $this
      ->createKey($this->adminUser);
    $this
      ->createKey($this->channelUser);
    $this->configFactory = $this->container
      ->get('config.factory');
    $simple_oauth_settings = $this->configFactory
      ->getEditable('simple_oauth.settings');
    $simple_oauth_settings
      ->set('access_token_expiration', 10);
    $simple_oauth_settings
      ->set('refresh_token_expiration', 30);
    $simple_oauth_settings
      ->save();

    // Change the initial remote configuration: it will use the admin user
    // to authenticate. We first test as administrative user because they have
    // access to all nodes, so we can in the beginning of the test pull the
    // channel and use `checkCreatedEntities()`.
    $plugin = $this
      ->createAuthenticationPlugin($this->adminUser, $this->remote);
    $this->remote
      ->mergePluginConfig($plugin);
    $this->remote
      ->save();
    $this
      ->postSetupFixture();
  }

  /**
   * {@inheritdoc}
   */
  protected function createAuthenticationPlugin(UserInterface $user, RemoteInterface $remote) {

    // Create all needed OAuth-related entities on the "server" side.
    $this
      ->serverOauthSetup();
    $plugin = $this->authPluginManager
      ->createInstance('oauth');
    $configuration = $plugin
      ->getConfiguration();

    // To properly test, delete the cached key used in the previous run.
    if ($this->keyValueStore
      ->get($configuration['uuid'] . '-' . $plugin
      ->getPluginId()) instanceof AccessTokenInterface) {
      $this->keyValueStore
        ->delete($configuration['uuid'] . '-' . $plugin
        ->getPluginId());
    }

    // Override Guzzle HTTP client options.
    // This is mandatory because otherwise in testing environment there would
    // be a redirection from POST /oauth/token to GET /oauth/token.
    // @see GuzzleHttp\RedirectMiddleware::modifyRequest().
    $request_options = [
      RequestOptions::HTTP_ERRORS => FALSE,
      RequestOptions::ALLOW_REDIRECTS => [
        'strict' => TRUE,
      ],
    ];
    $site_settings = Settings::getAll();
    $site_settings['http_client_config'] = $request_options;
    new Settings($site_settings);

    // Obtain the access token from server.
    $credentials = [
      'username' => $user
        ->getAccountName(),
      'password' => $user->passRaw,
      'client_id' => $this->clients[$user
        ->id()]
        ->uuid(),
      'client_secret' => $this->clientSecret,
      'authorization_path' => '/oauth/authorize',
      'token_path' => '/oauth/token',
    ];
    $access_token = '';
    try {
      $access_token = $plugin
        ->initializeToken($remote, $credentials);
    } catch (\Exception $e) {

      // Do nothing.
    }

    // Since this is an important part of OAuth functionality,
    // assert that it is successful.
    $this
      ->assertNotEmpty($access_token, 'The access token is not empty.');

    // Remove the username and password.
    unset($credentials['username']);
    unset($credentials['password']);
    $storage_key = $configuration['uuid'];
    $this->keyValueStore
      ->set($storage_key, $credentials);

    // Save the token.
    $this->keyValueStore
      ->set($storage_key . '-' . $plugin
      ->getPluginId(), $access_token);

    // We are using key value store for local credentials storage.
    $configuration['data'] = [
      'credential_provider' => 'entity_share',
      'storage_key' => $storage_key,
    ];
    $plugin
      ->setConfiguration($configuration);
    return $plugin;
  }

  /**
   * Test that correct entities are created with different authentications.
   */
  public function testImport() {

    // 1. Test content creation as administrative
    // user: both published and unpublished nodes should be created.
    // In this run we are also testing the access to private physical files.
    // First, assert that files didn't exist before import.
    foreach (static::$filesData as $file_data) {
      $this
        ->assertFalse(file_exists($file_data['uri']), 'The physical file ' . $file_data['filename'] . ' has been deleted.');
    }

    // Pull channel and test that all nodes and file entities are there.
    $this
      ->pullChannel('node_es_test_en');
    $this
      ->checkCreatedEntities();

    // Some stronger assertions for the uploaded private file.
    foreach (static::$filesData as $file_definition) {
      $this
        ->assertTrue(file_exists($file_definition['uri']), 'The physical file ' . $file_definition['filename'] . ' has been pulled and recreated.');
      $this
        ->assertEquals(file_get_contents($file_definition['uri']), $file_definition['file_content'], 'The content of physical file ' . $file_definition['filename'] . ' is correct.');
    }

    // 2. Test as a non-administrative user who can't access unpublished nodes.
    // Change the remote so that is uses the channel user's credentials.
    $plugin = $this
      ->createAuthenticationPlugin($this->channelUser, $this->remote);
    $this->remote
      ->mergePluginConfig($plugin);
    $this->remote
      ->save();

    // Delete all "client" entities created after the first import.
    $this
      ->resetImportedContent();

    // Also clean up all uploaded files.
    foreach (static::$filesData as $file_data) {
      $this->fileSystem
        ->delete($file_data['uri']);
    }

    // There is no need to test the physical files anymore, so we will remove
    // them from the entity array.
    unset($this->entitiesData['file']);
    unset($this->entitiesData['node']['en']['es_test_node_import_published']['field_es_test_file']);

    // Since the remote ID remains the same, we need to reset some of
    // remote manager's cached values.
    $this
      ->resetRemoteCaches();

    // Prepare the "server" content again.
    $this
      ->prepareContent();

    // Get channel info so that individual channels can be pulled next.
    $channel_infos = $this->remoteManager
      ->getChannelsInfos($this->remote);

    // Re-import data from JSON:API.
    $this
      ->reimportChannel($channel_infos);

    // Assertions.
    $entity_storage = $this->entityTypeManager
      ->getStorage('node');
    $published = $entity_storage
      ->loadByProperties([
      'uuid' => 'es_test_node_import_published',
    ]);
    $this
      ->assertEquals(count($published), 1, 'The published node was imported.');
    $not_published = $entity_storage
      ->loadByProperties([
      'uuid' => 'es_test_node_import_not_published',
    ]);
    $this
      ->assertEquals(count($not_published), 0, 'The unpublished node was not imported.');

    // 3. Test as non-administrative user, but with credentials stored using
    // Key module.
    $this
      ->setupAuthorizationPluginWithKey($this->channelUser);
    $this
      ->resetImportedContent();
    $this
      ->resetRemoteCaches();
    $this
      ->prepareContent();
    $this
      ->reimportChannel($channel_infos);

    // Assertions.
    $entity_storage = $this->entityTypeManager
      ->getStorage('node');
    $published = $entity_storage
      ->loadByProperties([
      'uuid' => 'es_test_node_import_published',
    ]);
    $this
      ->assertEquals(count($published), 1, 'The published node was imported.');
    $not_published = $entity_storage
      ->loadByProperties([
      'uuid' => 'es_test_node_import_not_published',
    ]);
    $this
      ->assertEquals(count($not_published), 0, 'The unpublished node was not imported.');
  }

  /**
   * Test behavior when access and refresh tokens are revoked.
   */
  public function testTokenExpiration() {

    // 1. Access token is valid.
    $entity_share_entrypoint_url = Url::fromRoute('entity_share_server.resource_list');
    $response = $this->remoteManager
      ->jsonApiRequest($this->remote, 'GET', $entity_share_entrypoint_url
      ->setAbsolute()
      ->toString());
    $this
      ->assertNotNull($response, 'No exception caught during request');
    $this
      ->assertEquals(200, $response
      ->getStatusCode());

    // Ensure access token has expired.
    $plugin = $this->remote
      ->getAuthPlugin();
    $configuration = $plugin
      ->getConfiguration();

    /** @var \League\OAuth2\Client\Token\AccessTokenInterface $access_token */
    $access_token = $this->keyValueStore
      ->get($configuration['uuid'] . '-' . $plugin
      ->getPluginId());
    $this
      ->assertFalse($access_token
      ->hasExpired(), 'The access token has not expired yet.');
    sleep(30);
    $this
      ->assertTrue($access_token
      ->hasExpired(), 'The access token has expired.');

    // 2. Access token has expired but refresh token is still valid.
    $this
      ->resetRemoteCaches();
    $response = $this->remoteManager
      ->jsonApiRequest($this->remote, 'GET', $entity_share_entrypoint_url
      ->setAbsolute()
      ->toString());
    $this
      ->assertNotNull($response, 'No exception caught during request');
    $this
      ->assertEquals(200, $response
      ->getStatusCode());

    // Ensure refresh token has expired.
    sleep(120);

    // 3. Both access and refresh tokens have expired, so use
    // client_credentials as a last resort.
    $this
      ->resetRemoteCaches();
    $response = $this->remoteManager
      ->jsonApiRequest($this->remote, 'GET', $entity_share_entrypoint_url
      ->setAbsolute()
      ->toString());
    $this
      ->assertNotNull($response, 'No exception caught during request');
    $this
      ->assertEquals(200, $response
      ->getStatusCode());
  }

  /**
   * Helper function: updates the existing OAuth plugin to use Key storage.
   *
   * @param \Drupal\user\UserInterface $account
   *   The user whose credentials will be used for the plugin.
   */
  private function setupAuthorizationPluginWithKey(UserInterface $account) {
    $plugin = $this->remote
      ->getAuthPlugin();
    $configuration = $plugin
      ->getConfiguration();

    // To properly test, delete the cached key used in the previous run.
    if ($this->keyValueStore
      ->get($configuration['uuid'] . '-' . $plugin
      ->getPluginId()) instanceof AccessTokenInterface) {
      $this->keyValueStore
        ->delete($configuration['uuid'] . '-' . $plugin
        ->getPluginId());
    }

    // Obtain the access token from server again, but now we are using the
    // credentials saved in the Key.
    $credentials = $this->keyService
      ->getCredentials($plugin);
    $credentials['username'] = $account
      ->getAccountName();
    $credentials['password'] = $account->passRaw;
    $request_options = [
      RequestOptions::HTTP_ERRORS => FALSE,
      RequestOptions::ALLOW_REDIRECTS => [
        'strict' => TRUE,
      ],
    ];
    $access_token = '';
    try {
      $access_token = $plugin
        ->initializeToken($this->remote, $credentials, $request_options);
    } catch (\Exception $e) {

      // Do nothing.
    }

    // Since this is an important part of OAuth functionality,
    // assert that it is successful.
    $this
      ->assertNotEmpty($access_token, 'The new access token is not empty.');

    // Save the obtained key.
    $this->keyValueStore
      ->set($configuration['uuid'] . '-' . $plugin
      ->getPluginId(), $access_token);

    // Save the new configuration of the plugin.
    $configuration['data'] = [
      'credential_provider' => 'key',
      'storage_key' => 'key_oauth_' . $account
        ->id(),
    ];
    $plugin
      ->setConfiguration($configuration);

    // Save the "Remote" config entity.
    $this->remote
      ->mergePluginConfig($plugin);
    $this->remote
      ->save();
  }

  /**
   * Helper function: creates needed server-side entities needed for OAuth.
   */
  private function serverOauthSetup() {

    // Create OAuth roles and assign these roles to users.
    $this->clientRole = Role::create([
      'id' => $this
        ->getRandomGenerator()
        ->name(8, TRUE),
      'label' => $this
        ->getRandomGenerator()
        ->word(5),
      'is_admin' => FALSE,
    ]);
    $this->clientRole
      ->grantPermission('grant simple_oauth codes');
    $this->clientRole
      ->grantPermission('entity_share_server_access_channels');
    $this->clientRole
      ->grantPermission('bypass node access');
    $this->clientRole
      ->save();
    $this->adminUser
      ->addRole($this->clientRole
      ->id());
    $this->clientRolePlain = Role::create([
      'id' => $this
        ->getRandomGenerator()
        ->name(8, TRUE),
      'label' => $this
        ->getRandomGenerator()
        ->word(5),
      'is_admin' => FALSE,
    ]);
    $this->clientRolePlain
      ->grantPermission('grant simple_oauth codes');
    $this->clientRolePlain
      ->grantPermission('entity_share_server_access_channels');
    $this->clientRolePlain
      ->save();
    $this->channelUser
      ->addRole($this->clientRolePlain
      ->id());

    // Create client secret.
    $this->clientSecret = $this
      ->getRandomGenerator()
      ->string();

    // Create OAuth consumers.
    $this
      ->createOauthConsumer($this->adminUser, $this->clientRole);
    $this
      ->createOauthConsumer($this->channelUser, $this->clientRolePlain);

    // Create private and public keys for the OAuth module.
    // Not to be confused with Key module's storage of credentials.
    $this
      ->setUpKeys();
  }

  /**
   * Create a service consumer for OAuth.
   *
   * @param \Drupal\user\UserInterface $account
   *   The user whose credentials will be used for the plugin.
   * @param \Drupal\user\RoleInterface $role
   *   The user role for OAuth consumer.
   */
  protected function createOauthConsumer(UserInterface $account, RoleInterface $role) {

    // Create a Consumer.
    $client = Consumer::create([
      'owner_id' => '',
      'user_id' => $account
        ->id(),
      'label' => $this
        ->getRandomGenerator()
        ->name(),
      'secret' => $this->clientSecret,
      'confidential' => FALSE,
      'third_party' => TRUE,
      'roles' => [
        [
          'target_id' => $role
            ->id(),
        ],
      ],
    ]);
    $client
      ->save();
    $this->clients[$account
      ->id()] = $client;
  }

  /**
   * Create a key of OAuth type.
   *
   * @param \Drupal\user\UserInterface $account
   *   The user whose credentials will be used for the plugin.
   */
  protected function createKey(UserInterface $account) {
    $this
      ->createTestKey('key_oauth_' . $account
      ->id(), 'entity_share_oauth', 'config');
    $credentials = [
      'client_id' => $this->clients[$account
        ->id()]
        ->uuid(),
      'client_secret' => $this->clientSecret,
      'authorization_path' => '/oauth/authorize',
      'token_path' => '/oauth/token',
    ];
    $output = '';
    foreach ($credentials as $name => $value) {
      $output .= "\"{$name}\": \"{$value}\"\n";
    }
    $key_value = <<<EOT
{
  {<span class="php-variable">$output</span>}}
EOT;
    $this->testKey
      ->setKeyValue($key_value);
    $this->testKey
      ->save();
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AssertHelperTrait::castSafeStrings protected static function Casts MarkupInterface objects into strings.
AssertLegacyTrait::assert protected function Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertTrue() instead.
AssertLegacyTrait::assertCacheTag protected function Asserts whether an expected cache tag was present in the last response.
AssertLegacyTrait::assertElementNotPresent protected function Asserts that the element with the given CSS selector is not present.
AssertLegacyTrait::assertElementPresent protected function Asserts that the element with the given CSS selector is present.
AssertLegacyTrait::assertEqual protected function Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertEquals() instead.
AssertLegacyTrait::assertEscaped protected function Passes if the raw text IS found escaped on the loaded page, fail otherwise.
AssertLegacyTrait::assertField protected function Asserts that a field exists with the given name or ID.
AssertLegacyTrait::assertFieldById protected function Asserts that a field exists with the given ID and value.
AssertLegacyTrait::assertFieldByName protected function Asserts that a field exists with the given name and value.
AssertLegacyTrait::assertFieldByXPath protected function Asserts that a field exists in the current page by the given XPath.
AssertLegacyTrait::assertFieldChecked protected function Asserts that a checkbox field in the current page is checked.
AssertLegacyTrait::assertFieldsByValue protected function Asserts that a field exists in the current page with a given Xpath result.
AssertLegacyTrait::assertHeader protected function Checks that current response header equals value.
AssertLegacyTrait::assertIdentical protected function Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertSame() instead.
AssertLegacyTrait::assertIdenticalObject protected function Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertEquals() instead.
AssertLegacyTrait::assertLink protected function Passes if a link with the specified label is found.
AssertLegacyTrait::assertLinkByHref protected function Passes if a link containing a given href (part) is found.
AssertLegacyTrait::assertNoCacheTag protected function Asserts whether an expected cache tag was absent in the last response.
AssertLegacyTrait::assertNoEscaped protected function Passes if the raw text is not found escaped on the loaded page.
AssertLegacyTrait::assertNoField protected function Asserts that a field does NOT exist with the given name or ID.
AssertLegacyTrait::assertNoFieldById protected function Asserts that a field does not exist with the given ID and value.
AssertLegacyTrait::assertNoFieldByName protected function Asserts that a field does not exist with the given name and value.
AssertLegacyTrait::assertNoFieldByXPath protected function Asserts that a field does not exist or its value does not match, by XPath.
AssertLegacyTrait::assertNoFieldChecked protected function Asserts that a checkbox field in the current page is not checked.
AssertLegacyTrait::assertNoLink protected function Passes if a link with the specified label is not found.
AssertLegacyTrait::assertNoLinkByHref protected function Passes if a link containing a given href (part) is not found.
AssertLegacyTrait::assertNoOption protected function Asserts that a select option does NOT exist in the current page.
AssertLegacyTrait::assertNoPattern protected function Triggers a pass if the Perl regex pattern is not found in the raw content.
AssertLegacyTrait::assertNoRaw protected function Passes if the raw text IS not found on the loaded page, fail otherwise. 1
AssertLegacyTrait::assertNotEqual protected function Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertNotEquals() instead.
AssertLegacyTrait::assertNoText protected function Passes if the page (with HTML stripped) does not contains the text. 1
AssertLegacyTrait::assertNotIdentical protected function Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertNotSame() instead.
AssertLegacyTrait::assertNoUniqueText protected function Passes if the text is found MORE THAN ONCE on the text version of the page.
AssertLegacyTrait::assertOption protected function Asserts that a select option in the current page exists.
AssertLegacyTrait::assertOptionByText protected function Asserts that a select option with the visible text exists.
AssertLegacyTrait::assertOptionSelected protected function Asserts that a select option in the current page is checked.
AssertLegacyTrait::assertPattern protected function Triggers a pass if the Perl regex pattern is found in the raw content.
AssertLegacyTrait::assertRaw protected function Passes if the raw text IS found on the loaded page, fail otherwise. 1
AssertLegacyTrait::assertResponse protected function Asserts the page responds with the specified response code. 1
AssertLegacyTrait::assertText protected function Passes if the page (with HTML stripped) contains the text. 1
AssertLegacyTrait::assertTextHelper protected function Helper for assertText and assertNoText.
AssertLegacyTrait::assertTitle protected function Pass if the page title is the given string.
AssertLegacyTrait::assertUniqueText protected function Passes if the text is found ONLY ONCE on the text version of the page.
AssertLegacyTrait::assertUrl protected function Passes if the internal browser's URL matches the given path.
AssertLegacyTrait::buildXPathQuery protected function Builds an XPath query.
AssertLegacyTrait::constructFieldXpath protected function Helper: Constructs an XPath for the given set of attributes and value.
AssertLegacyTrait::getAllOptions protected function Get all option elements, including nested options, in a select.
AssertLegacyTrait::getRawContent protected function Gets the current raw content.
AssertLegacyTrait::pass protected function Deprecated Scheduled for removal in Drupal 10.0.0. Use self::assertTrue() instead.
AssertLegacyTrait::verbose protected function
AuthenticationOAuthTest::$clientRole protected property User role with OAuth permissions and unrestricted node access.
AuthenticationOAuthTest::$clientRolePlain protected property User role with OAuth permissions.
AuthenticationOAuthTest::$clients protected property The client (consumer) entities, one per each user.
AuthenticationOAuthTest::$clientSecret protected property The client secret.
AuthenticationOAuthTest::$configFactory protected property The Drupal config factory.
AuthenticationOAuthTest::$keyService protected property Injected key service.
AuthenticationOAuthTest::$modules public static property Modules to enable. Overrides AuthenticationTestBase::$modules
AuthenticationOAuthTest::createAuthenticationPlugin protected function Helper function to create the authentication plugin. Overrides EntityShareClientFunctionalTestBase::createAuthenticationPlugin
AuthenticationOAuthTest::createKey protected function Create a key of OAuth type.
AuthenticationOAuthTest::createOauthConsumer protected function Create a service consumer for OAuth.
AuthenticationOAuthTest::serverOauthSetup private function Helper function: creates needed server-side entities needed for OAuth.
AuthenticationOAuthTest::setUp protected function Overrides EntityShareClientFunctionalTestBase::setUp
AuthenticationOAuthTest::setupAuthorizationPluginWithKey private function Helper function: updates the existing OAuth plugin to use Key storage.
AuthenticationOAuthTest::testImport public function Test that correct entities are created with different authentications.
AuthenticationOAuthTest::testTokenExpiration public function Test behavior when access and refresh tokens are revoked.
AuthenticationTestBase::$entityBundleId protected static property The tested entity type bundle. Overrides EntityShareClientFunctionalTestBase::$entityBundleId
AuthenticationTestBase::$entityLangcode protected static property The tested entity langcode. Overrides EntityShareClientFunctionalTestBase::$entityLangcode
AuthenticationTestBase::$entityTypeId protected static property The tested entity type. Overrides EntityShareClientFunctionalTestBase::$entityTypeId
AuthenticationTestBase::$filesData protected static property An array of data to generate physical files.
AuthenticationTestBase::getEntitiesDataArray protected function Helper function to get a mapping of the entities data. Overrides EntityShareClientFunctionalTestBase::getEntitiesDataArray 1
AuthenticationTestBase::getImportConfigProcessorSettings protected function Helper function to create the import config used for the test. Overrides EntityShareClientFunctionalTestBase::getImportConfigProcessorSettings
AuthenticationTestBase::postSetupFixture protected function Helper function. Overrides EntityShareClientFunctionalTestBase::postSetupFixture
AuthenticationTestBase::reimportChannel protected function Helper function: re-imports content from JSON:API.
AuthenticationTestBase::resetRemoteCaches protected function Helper function: unsets remote manager's cached data.
BlockCreationTrait::placeBlock protected function Creates a block instance based on default settings. Aliased as: drupalPlaceBlock
BrowserHtmlDebugTrait::$htmlOutputBaseUrl protected property The Base URI to use for links to the output files.
BrowserHtmlDebugTrait::$htmlOutputClassName protected property Class name for HTML output logging.
BrowserHtmlDebugTrait::$htmlOutputCounter protected property Counter for HTML output logging.
BrowserHtmlDebugTrait::$htmlOutputCounterStorage protected property Counter storage for HTML output logging.
BrowserHtmlDebugTrait::$htmlOutputDirectory protected property Directory name for HTML output logging.
BrowserHtmlDebugTrait::$htmlOutputEnabled protected property HTML output output enabled.
BrowserHtmlDebugTrait::$htmlOutputFile protected property The file name to write the list of URLs to.
BrowserHtmlDebugTrait::$htmlOutputTestId protected property HTML output test ID.
BrowserHtmlDebugTrait::formatHtmlOutputHeaders protected function Formats HTTP headers as string for HTML output logging.
BrowserHtmlDebugTrait::getHtmlOutputHeaders protected function Returns headers in HTML output format. 1
BrowserHtmlDebugTrait::htmlOutput protected function Logs a HTML output message in a text file.
BrowserHtmlDebugTrait::initBrowserOutputFile protected function Creates the directory to store browser output.
BrowserTestBase::$baseUrl protected property The base URL.
BrowserTestBase::$configImporter protected property The config importer that can be used in a test.
BrowserTestBase::$customTranslations protected property An array of custom translations suitable for drupal_rewrite_settings().
BrowserTestBase::$databasePrefix protected property The database prefix of this test run.
BrowserTestBase::$mink protected property Mink session manager.
BrowserTestBase::$minkDefaultDriverArgs protected property
BrowserTestBase::$minkDefaultDriverClass protected property 1
BrowserTestBase::$originalContainer protected property The original container.
BrowserTestBase::$originalShutdownCallbacks protected property The original array of shutdown function callbacks.
BrowserTestBase::$preserveGlobalState protected property
BrowserTestBase::$profile protected property The profile to install as a basis for testing. 39
BrowserTestBase::$root protected property The app root.
BrowserTestBase::$runTestInSeparateProcess protected property Browser tests are run in separate processes to prevent collisions between code that may be loaded by tests.
BrowserTestBase::$timeLimit protected property Time limit in seconds for the test.
BrowserTestBase::$translationFilesDirectory protected property The translation file directory for the test environment.
BrowserTestBase::cleanupEnvironment protected function Clean up the Simpletest environment.
BrowserTestBase::config protected function Configuration accessor for tests. Returns non-overridden configuration.
BrowserTestBase::cssSelectToXpath protected function Translates a CSS expression to its XPath equivalent.
BrowserTestBase::drupalGetHeader protected function Gets the value of an HTTP response header.
BrowserTestBase::drupalGetHeaders Deprecated protected function Returns all response headers.
BrowserTestBase::filePreDeleteCallback public static function Ensures test files are deletable.
BrowserTestBase::getDefaultDriverInstance protected function Gets an instance of the default Mink driver.
BrowserTestBase::getDrupalSettings protected function Gets the JavaScript drupalSettings variable for the currently-loaded page. 1
BrowserTestBase::getHttpClient protected function Obtain the HTTP client for the system under test.
BrowserTestBase::getMinkDriverArgs protected function Get the Mink driver args from an environment variable, if it is set. Can be overridden in a derived class so it is possible to use a different value for a subset of tests, e.g. the JavaScript tests. 1
BrowserTestBase::getOptions protected function Helper function to get the options of select field.
BrowserTestBase::getResponseLogHandler protected function Provides a Guzzle middleware handler to log every response received. Overrides BrowserHtmlDebugTrait::getResponseLogHandler
BrowserTestBase::getSession public function Returns Mink session.
BrowserTestBase::getSessionCookies protected function Get session cookies from current session.
BrowserTestBase::getTestMethodCaller protected function Retrieves the current calling line in the class under test. Overrides BrowserHtmlDebugTrait::getTestMethodCaller
BrowserTestBase::initFrontPage protected function Visits the front page when initializing Mink. 3
BrowserTestBase::initMink protected function Initializes Mink sessions. 1
BrowserTestBase::installDrupal public function Installs Drupal into the Simpletest site. 1
BrowserTestBase::registerSessions protected function Registers additional Mink sessions.
BrowserTestBase::tearDown protected function 3
BrowserTestBase::translatePostValues protected function Transforms a nested array into a flat array suitable for drupalPostForm().
BrowserTestBase::xpath protected function Performs an xpath search on the contents of the internal browser.
BrowserTestBase::__construct public function 1
BrowserTestBase::__sleep public function Prevents serializing any properties.
ConfigTestTrait::configImporter protected function Returns a ConfigImporter object to import test configuration.
ConfigTestTrait::copyConfig protected function Copies configuration objects from source storage to target storage.
ContentTypeCreationTrait::createContentType protected function Creates a custom content type based on default settings. Aliased as: drupalCreateContentType 1
EntityFieldHelperTrait::getFilteredStructureValues public function Retrieve the value from a field.
EntityFieldHelperTrait::getTargetId public function Retrieve the value from a field where the value key is target_id.
EntityFieldHelperTrait::getValue public function Retrieve the value from a field.
EntityFieldHelperTrait::getValues public function Retrieve the value from a field.
EntityShareClientFunctionalTestBase::$adminUser protected property A test user with administrative privileges.
EntityShareClientFunctionalTestBase::$authPluginManager protected property The client authorization manager service.
EntityShareClientFunctionalTestBase::$channels protected property The channels used for the test.
EntityShareClientFunctionalTestBase::$channelUser protected property A test user with access to the channel list.
EntityShareClientFunctionalTestBase::$defaultTheme protected property The theme to install as the default for testing. Overrides BrowserTestBase::$defaultTheme
EntityShareClientFunctionalTestBase::$entities protected property A mapping of the entities created for the test.
EntityShareClientFunctionalTestBase::$entitiesData protected property A mapping of the entity data used for the test.
EntityShareClientFunctionalTestBase::$entityDefinitions protected property The entity type definitions.
EntityShareClientFunctionalTestBase::$entityTypeManager protected property The entity type manager service.
EntityShareClientFunctionalTestBase::$faker protected property Faker generator.
EntityShareClientFunctionalTestBase::$fileSystem protected property The file system service.
EntityShareClientFunctionalTestBase::$importConfig protected property The import config used for the test.
EntityShareClientFunctionalTestBase::$importService protected property The import service.
EntityShareClientFunctionalTestBase::$keyValueStore protected property The key value store to use.
EntityShareClientFunctionalTestBase::$remote protected property The remote used for the test.
EntityShareClientFunctionalTestBase::$remoteManager protected property The remote manager service.
EntityShareClientFunctionalTestBase::$streamWrapperManager protected property The stream wrapper manager.
EntityShareClientFunctionalTestBase::$visitedUrlsDuringSetup protected property The visited URLs during setup.
EntityShareClientFunctionalTestBase::checkCreatedEntities protected function Helper function that test that the entities had been recreated.
EntityShareClientFunctionalTestBase::commonBasicPull protected function Common parts between FileTest and MediaEntityReferenceTest classes.
EntityShareClientFunctionalTestBase::createChannel protected function Helper function to create the channel used for the test. 6
EntityShareClientFunctionalTestBase::createImportConfig protected function Helper function to create the import config used for the test.
EntityShareClientFunctionalTestBase::createRemote protected function Helper function to create the remote that point to the site itself.
EntityShareClientFunctionalTestBase::deleteContent protected function Helper function to delete the prepared content.
EntityShareClientFunctionalTestBase::discoverJsonApiEndpoints protected function Helper function to populate the request service with responses.
EntityShareClientFunctionalTestBase::getAdministratorPermissions protected function Gets the permissions for the admin user. 1
EntityShareClientFunctionalTestBase::getAuthenticationRequestOptions protected function Returns Guzzle request options for authentication.
EntityShareClientFunctionalTestBase::getChannelUserPermissions protected function Gets the permissions for the channel user. 1
EntityShareClientFunctionalTestBase::getCompleteBlockInfos protected function Helper function.
EntityShareClientFunctionalTestBase::getCompleteMediaInfos protected function Helper function.
EntityShareClientFunctionalTestBase::getCompleteNodeInfos protected function Helper function.
EntityShareClientFunctionalTestBase::getCompleteParagraphInfos protected function Helper function.
EntityShareClientFunctionalTestBase::getCompleteTaxonomyTermInfos protected function Helper function.
EntityShareClientFunctionalTestBase::getEntitiesData protected function Helper function to get a mapping of the entities data.
EntityShareClientFunctionalTestBase::getEntityId protected function Helper function.
EntityShareClientFunctionalTestBase::getEntityJsonData protected function Helper function to get the JSON:API data of an entity.
EntityShareClientFunctionalTestBase::getEntityRevisionId protected function Helper function.
EntityShareClientFunctionalTestBase::getMediaEntityReferenceTestFiles protected function Helper function.
EntityShareClientFunctionalTestBase::importSelectedEntities protected function Helper function.
EntityShareClientFunctionalTestBase::IMPORT_CONFIG_ID constant The import config ID.
EntityShareClientFunctionalTestBase::loadEntity protected function Helper function.
EntityShareClientFunctionalTestBase::mergePluginsToImportConfig protected function Helper function to add/modify plugins in import config, runtime.
EntityShareClientFunctionalTestBase::populateRequestService protected function Helper function to populate the request service with responses. 7
EntityShareClientFunctionalTestBase::prepareContent protected function Helper function to create the content required for the tests. 1
EntityShareClientFunctionalTestBase::prepareEntityData protected function Helper function to prepare entity data.
EntityShareClientFunctionalTestBase::preparePhysicalFilesAndFileEntitiesData protected function Helper function.
EntityShareClientFunctionalTestBase::prepareUrlFilteredOnUuids protected function Helper function.
EntityShareClientFunctionalTestBase::pullChannel protected function Helper function to import one channel.
EntityShareClientFunctionalTestBase::pullEveryChannels protected function Helper function to import all channels.
EntityShareClientFunctionalTestBase::removePluginFromImportConfig protected function Helper function to remove a plugin from import config, runtime.
EntityShareClientFunctionalTestBase::resetImportedContent protected function Helper function to delete all (prepared or imported) content.
EntityShareServerRequestTestTrait::request protected function Performs a HTTP request. Wraps the Guzzle HTTP client.
FunctionalTestSetupTrait::$apcuEnsureUniquePrefix protected property The flag to set 'apcu_ensure_unique_prefix' setting. 1
FunctionalTestSetupTrait::$classLoader protected property The class loader to use for installation and initialization of setup.
FunctionalTestSetupTrait::$configDirectories Deprecated protected property The config directories used in this test.
FunctionalTestSetupTrait::$rootUser protected property The "#1" admin user.
FunctionalTestSetupTrait::doInstall protected function Execute the non-interactive installer. 1
FunctionalTestSetupTrait::getDatabaseTypes protected function Returns all supported database driver installer objects.
FunctionalTestSetupTrait::initConfig protected function Initialize various configurations post-installation. 2
FunctionalTestSetupTrait::initKernel protected function Initializes the kernel after installation.
FunctionalTestSetupTrait::initSettings protected function Initialize settings created during install.
FunctionalTestSetupTrait::initUserSession protected function Initializes user 1 for the site to be installed.
FunctionalTestSetupTrait::installDefaultThemeFromClassProperty protected function Installs the default theme defined by `static::$defaultTheme` when needed.
FunctionalTestSetupTrait::installModulesFromClassProperty protected function Install modules defined by `static::$modules`. 1
FunctionalTestSetupTrait::installParameters protected function Returns the parameters that will be used when Simpletest installs Drupal. 9
FunctionalTestSetupTrait::prepareEnvironment protected function Prepares the current environment for running the test. 23
FunctionalTestSetupTrait::prepareRequestForGenerator protected function Creates a mock request and sets it on the generator.
FunctionalTestSetupTrait::prepareSettings protected function Prepares site settings and services before installation. 2
FunctionalTestSetupTrait::rebuildAll protected function Resets and rebuilds the environment after setup.
FunctionalTestSetupTrait::rebuildContainer protected function Rebuilds \Drupal::getContainer().
FunctionalTestSetupTrait::resetAll protected function Resets all data structures after having enabled new modules.
FunctionalTestSetupTrait::setContainerParameter protected function Changes parameters in the services.yml file.
FunctionalTestSetupTrait::setupBaseUrl protected function Sets up the base URL based upon the environment variable.
FunctionalTestSetupTrait::writeSettings protected function Rewrites the settings.php file of the test site.
JsonApiRequestTestTrait::decorateWithXdebugCookie protected function Adds the Xdebug cookie to the request options.
JsonApiRequestTestTrait::request protected function Performs a HTTP request. Wraps the Guzzle HTTP client. Aliased as: parentRequest
KeyTestTrait::$testKey protected property A key entity to use for testing.
KeyTestTrait::$testKeyConfigOverride protected property A key configuration override entity to use for testing.
KeyTestTrait::createTestKey protected function Make a key for testing operations that require a key.
KeyTestTrait::createTestKeyConfigOverride protected function Make a key configuration override for testing operations.
KeyTestTrait::routeAccessTest protected function Tests each route for the currently signed-in user.
NodeCreationTrait::createNode protected function Creates a node based on default settings. Aliased as: drupalCreateNode
NodeCreationTrait::getNodeByTitle public function Get a node from the database based on its title. Aliased as: drupalGetNodeByTitle
PhpunitCompatibilityTrait::getMock Deprecated public function Returns a mock object for the specified class using the available method.
PhpunitCompatibilityTrait::setExpectedException Deprecated public function Compatibility layer for PHPUnit 6 to support PHPUnit 4 code.
RandomGeneratorTrait::$randomGenerator protected property The random generator.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers. 1
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
RandomGeneratorTrait::randomStringValidate public function Callback for random string validation.
RefreshVariablesTrait::refreshVariables protected function Refreshes in-memory configuration and state information. 3
SessionTestTrait::$sessionName protected property The name of the session cookie.
SessionTestTrait::generateSessionName protected function Generates a session cookie name.
SessionTestTrait::getSessionName protected function Returns the session name in use on the child site.
StorageCopyTrait::replaceStorageContents protected static function Copy the configuration from one storage to another and remove stale items.
TestRequirementsTrait::checkModuleRequirements private function Checks missing module requirements.
TestRequirementsTrait::checkRequirements protected function Check module requirements for the Drupal use case. 1
TestRequirementsTrait::getDrupalRoot protected static function Returns the Drupal root directory.
TestSetupTrait::$configSchemaCheckerExclusions protected static property An array of config object names that are excluded from schema checking.
TestSetupTrait::$container protected property The dependency injection container used in the test.
TestSetupTrait::$kernel protected property The DrupalKernel instance used in the test.
TestSetupTrait::$originalSite protected property The site directory of the original parent site.
TestSetupTrait::$privateFilesDirectory protected property The private file directory for the test environment.
TestSetupTrait::$publicFilesDirectory protected property The public file directory for the test environment.
TestSetupTrait::$siteDirectory protected property The site directory of this test run.
TestSetupTrait::$strictConfigSchema protected property Set to TRUE to strict check all configuration saved. 2
TestSetupTrait::$tempFilesDirectory protected property The temporary file directory for the test environment.
TestSetupTrait::$testId protected property The test run ID.
TestSetupTrait::changeDatabasePrefix protected function Changes the database connection to the prefixed one.
TestSetupTrait::getConfigSchemaExclusions protected function Gets the config schema exclusions for this test.
TestSetupTrait::getDatabaseConnection public static function Returns the database connection to the site running Simpletest.
TestSetupTrait::prepareDatabasePrefix protected function Generates a database prefix for running tests. 2
UiHelperTrait::$loggedInUser protected property The current user logged in using the Mink controlled browser.
UiHelperTrait::$maximumMetaRefreshCount protected property The number of meta refresh redirects to follow, or NULL if unlimited.
UiHelperTrait::$metaRefreshCount protected property The number of meta refresh redirects followed during ::drupalGet().
UiHelperTrait::assertSession public function Returns WebAssert object. 1
UiHelperTrait::buildUrl protected function Builds an a absolute URL from a system path or a URL object.
UiHelperTrait::checkForMetaRefresh protected function Checks for meta refresh tag and if found call drupalGet() recursively.
UiHelperTrait::click protected function Clicks the element with the given CSS selector.
UiHelperTrait::clickLink protected function Follows a link by complete name.
UiHelperTrait::cssSelect protected function Searches elements using a CSS selector in the raw content.
UiHelperTrait::drupalGet protected function Retrieves a Drupal path or an absolute path. 3
UiHelperTrait::drupalLogin protected function Logs in a user using the Mink controlled browser.
UiHelperTrait::drupalLogout protected function Logs a user out of the Mink controlled browser and confirms.
UiHelperTrait::drupalPostForm protected function Executes a form submission.
UiHelperTrait::drupalUserIsLoggedIn protected function Returns whether a given user account is logged in.
UiHelperTrait::getAbsoluteUrl protected function Takes a path and returns an absolute path.
UiHelperTrait::getTextContent protected function Retrieves the plain-text content from the current page.
UiHelperTrait::getUrl protected function Get the current URL from the browser.
UiHelperTrait::prepareRequest protected function Prepare for a request to testing site. 1
UiHelperTrait::submitForm protected function Fills and submits a form.
UserCreationTrait::checkPermissions protected function Checks whether a given list of permission names is valid.
UserCreationTrait::createAdminRole protected function Creates an administrative role.
UserCreationTrait::createRole protected function Creates a role with specified permissions. Aliased as: drupalCreateRole
UserCreationTrait::createUser protected function Create a user with a given set of permissions. Aliased as: drupalCreateUser
UserCreationTrait::grantPermissions protected function Grant permissions to a user role.
UserCreationTrait::setCurrentUser protected function Switch the current logged in user.
UserCreationTrait::setUpCurrentUser protected function Creates a random user account and sets it as current user.
XdebugRequestTrait::extractCookiesFromRequest protected function Adds xdebug cookies, from request setup.