usfedgov_google_analytics-8.x-1.2/tests/src/Unit/JsUrlQueryBuilderTest.php

tests/src/Unit/JsUrlQueryBuilderTest.php
<?php

namespace Drupal\Tests\usfedgov_google_analytics\Unit;

use Drupal\Core\Asset\AttachedAssetsInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Config\ImmutableConfig;
use Drupal\Core\Language\LanguageInterface;
use Drupal\usfedgov_google_analytics\Hook\JsUrlQueryBuilder;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\Yaml\Yaml;

/**
 * Tests building the DAP JavaScript URL query string.
 *
 * @coversDefaultClass \Drupal\usfedgov_google_analytics\Hook\JsUrlQueryBuilder
 * @group usfedgov_google_analytics
 */
class JsUrlQueryBuilderTest extends UnitTestCase {

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

  /**
   * A mock usfedgov_google_analytics.settings configuration.
   *
   * @var \Drupal\Core\Config\ImmutableConfig
   */
  protected $config;

  /**
   * An instance of the JsUrlQueryBuilder.
   *
   * @var \Drupal\usfedgov_google_analytics\Hook\JsUrlQueryBuilder
   */
  protected $queryBuilder;

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

    $this->config = $this->createMock(ImmutableConfig::class);
    $this->configFactory = $this->createMock(ConfigFactoryInterface::class);
    $this->configFactory->expects($this->once())
      ->method('get')
      ->with('usfedgov_google_analytics.settings')
      ->willReturn($this->config);
    $this->queryBuilder = new JsUrlQueryBuilder($this->configFactory);
  }

  /**
   * @covers ::appendQueryString
   */
  public function testAppendQueryString(): void {
    // Only bother to test for parameters you expect to be appended. Other tests
    // will check for excluding parameters.
    $parameters = [
      'agency' => 'usda',
      'subagency' => 'ars',
      'yt' => TRUE,
    ];
    $this->config->expects($this->once())
      ->method('get')
      ->with('query_parameters')
      ->willReturn($parameters);

    $javascript['Universal-Federated-Analytics.js']['data'] = 'Universal-Federated-Analytics.js';
    $javascript['Universal-Federated-Analytics-Min.js']['data'] = 'Universal-Federated-Analytics-Min.js';
    $assets = $this->createMock(AttachedAssetsInterface::class);
    $language = $this->createMock(LanguageInterface::class);
    $this->queryBuilder->appendQueryString($javascript, $assets, $language);

    // Check for individual parameters in the string rather than the string as a
    // whole. Otherwise, the test is dependent on a specific parameter order
    // which can change at any time.
    foreach ($parameters as $name => $value) {
      $parameter = $this->getExpectedParameter($name, $value);
      foreach ($javascript as $script) {
        $this->assertStringContainsString($parameter, $script['data']);
      }
    }
  }

  /**
   * Tests that individual parameters are correctly added to the query string.
   *
   * @param string $parameter
   *   The parameter to add to the query string.
   * @param string $type
   *   The parameter's schema type.
   *
   * @dataProvider providerQueryParameters
   */
  public function testIndividualParameters(string $parameter, string $type): void {
    // Verify that a default value has been added.
    $this->assertArrayHasKey($parameter, JsUrlQueryBuilder::DEFAULT_PARAMETERS, "A default value for '$parameter' must be added to JsUrlQueryBuilder::DEFAULT_PARAMETERS.");
    $default_value = JsUrlQueryBuilder::DEFAULT_PARAMETERS[$parameter];

    // Generate a test value for the parameter that will be added to the query.
    switch ($type) {
      case 'boolean':
        $value = !$default_value;
        break;

      case 'integer':
        $value = $default_value + 1;
        break;

      case 'string':
        $value = $this->getRandomGenerator()->word(4);
        break;

      default:
        $this->fail('JsUrlQueryBuilderTest::testIndividualParameters() was not set up to test parameters of this schema type. The test must be expanded to test this type.');
    }

    $this->config->expects($this->once())
      ->method('get')
      ->with('query_parameters')
      ->willReturn([
        $parameter => $value,
      ]);
    $query = $this->queryBuilder->buildQuery();

    $expected = $this->getExpectedParameter($parameter, $value);
    $this->assertEquals($expected, $query);
  }

  /**
   * Tests that default parameters are not added to the query string.
   *
   * @param string $parameter
   *   The parameter to add to the query string.
   *
   * @dataProvider providerQueryParameters
   */
  public function testDefaultParameters(string $parameter): void {
    // Verify that a default value has been added.
    $this->assertArrayHasKey($parameter, JsUrlQueryBuilder::DEFAULT_PARAMETERS, "A default value for '$parameter' must be added to JsUrlQueryBuilder::DEFAULT_PARAMETERS.");
    $default_value = JsUrlQueryBuilder::DEFAULT_PARAMETERS[$parameter];

    $this->config->expects($this->once())
      ->method('get')
      ->with('query_parameters')
      ->willReturn([
        $parameter => $default_value,
      ]);
    $query = $this->queryBuilder->buildQuery();
    $this->assertEquals('', $query);
  }

  /**
   * Tests that empty string parameters are not added to the query string.
   *
   * @param string $parameter
   *   The parameter to add to the query string.
   *
   * @dataProvider providerStringQueryParameters
   */
  public function testEmptyStringParameters(string $parameter): void {
    $this->config->expects($this->once())
      ->method('get')
      ->with('query_parameters')
      ->willReturn([
        $parameter => '',
      ]);
    $query = $this->queryBuilder->buildQuery();
    $this->assertEquals('', $query);
  }

  /**
   * Data provider for page attachment tests.
   *
   * @return string[][]
   *   An array of arrays that contain a query parameter name and its type from
   *   the configuration schema.
   */
  public static function providerQueryParameters() {
    $func_params = [];
    $config = Yaml::parseFile(__DIR__ . '/../../../config/schema/usfedgov_google_analytics.schema.yml');
    foreach ($config['usfedgov_google_analytics.settings']['mapping']['query_parameters']['mapping'] as $parameter => $schema) {
      $func_params[] = [$parameter, $schema['type']];
    }
    return $func_params;
  }

  /**
   * Data provider for string-specific page attachment tests.
   *
   * @return string[][]
   *   An array of arrays that contain a query parameter name and its type from
   *   the configuration schema.
   */
  public static function providerStringQueryParameters() {
    $parameters = self::providerQueryParameters();
    foreach ($parameters as $key => $data) {
      if ($data[1] != 'string') {
        unset($parameters[$key]);
      }
    }
    return $parameters;
  }

  /**
   * Builds an expected query string parameter.
   *
   * @param string $name
   *   The parameter name.
   * @param mixed $value
   *   The parameter value.
   *
   * @return string
   *   The built parameter.
   */
  protected function getExpectedParameter(string $name, $value): string {
    // Account for the string conversion of boolean values.
    if (is_bool($value)) {
      $value = $value ? 'true' : 'false';
    }
    return "$name=$value";
  }

}

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

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