google_tag-8.x-1.x-dev/tests/src/Kernel/MetricsAndDimensionsTest.php
tests/src/Kernel/MetricsAndDimensionsTest.php
<?php
declare(strict_types=1);
namespace Drupal\Tests\google_tag\Kernel;
use Drupal\google_tag\Entity\TagContainer;
use Symfony\Component\Validator\ConstraintViolationInterface;
/**
* Tests metrics and dimensions.
*
* @group google_tag
*/
final class MetricsAndDimensionsTest extends GoogleTagTestCase {
/**
* {@inheritdoc}
*/
protected static $modules = ['token'];
/**
* Tests configured metrics and dimensions in google_tag entity.
*/
public function testConfiguredMetricsAndDimensions(): void {
TagContainer::create([
'id' => 'foo',
// https://developers.google.com/tag-platform/gtagjs/configure#:~:text=What%20is%20a%20tag%20ID%20and%20where%20to%20find%20it%3F
// @todo need unit test on config entity for this and the methods of default and additional.
'tag_container_ids' => [
'GT-XXXXXX',
'G-XXXXXX',
'AW-XXXXXX',
'DC-XXXXXX',
'UA-XXXXXX',
],
'dimensions_metrics' => [
[
'type' => 'metric',
'name' => 'foo',
'value' => '6',
],
[
'type' => 'dimension',
'name' => 'langcode',
'value' => '[language:langcode]',
],
],
])->save();
$page = [];
$this->container
->get('main_content_renderer.html')
->invokePageAttachmentHooks($page);
self::assertArrayHasKey('gtag', $page['#attached']['drupalSettings']);
self::assertArrayHasKey('additionalConfigInfo', $page['#attached']['drupalSettings']['gtag']);
self::assertEquals(
['foo' => 6.0, 'langcode' => 'en'],
$page['#attached']['drupalSettings']['gtag']['additionalConfigInfo']
);
}
/**
* Tests violations on google_tag form.
*
* @dataProvider dimensionMetricsData
*/
public function testValidation(array $dimensions_metrics, array $expected_violations): void {
$config = TagContainer::create([
'id' => 'foo',
// https://developers.google.com/tag-platform/gtagjs/configure#:~:text=What%20is%20a%20tag%20ID%20and%20where%20to%20find%20it%3F
// @todo need unit test on config entity for this and the methods of default and additional.
'tag_container_ids' => [
'GT-XXXXXX',
'G-XXXXXX',
'AW-XXXXXX',
'DC-XXXXXX',
'UA-XXXXXX',
],
'dimensions_metrics' => $dimensions_metrics,
]);
$violations = $config->getTypedData()->validate();
self::assertEquals(
$expected_violations,
array_map(
static fn (ConstraintViolationInterface $constraint) => $constraint->getPropertyPath() . ' ' . $constraint->getMessage(),
iterator_to_array($violations)
)
);
}
/**
* Data provider for validations.
*/
public static function dimensionMetricsData() {
// Symfony 4 and 5 allowed empty strings for the Length constraint. This was
// removed in Symfony 6. The `allowEmptyString` flag was not configureable
// in Drupal.
$drupal10 = version_compare(\Drupal::VERSION, '10.0', '>=');
$invalid_metric_type_violations = [
'dimensions_metrics.0.type The value you selected is not a valid choice.',
];
if ($drupal10) {
$invalid_metric_type_violations[] = 'dimensions_metrics.0.name This value cannot be empty.';
$invalid_metric_type_violations[] = 'dimensions_metrics.0.value This value cannot be empty.';
}
yield 'invalid metric type' => [
[
[
'type' => 'aaa',
'name' => '',
'value' => '',
],
],
$invalid_metric_type_violations,
];
$empty_name_and_value_violations = [];
if ($drupal10) {
$empty_name_and_value_violations = [
'dimensions_metrics.0.name This value cannot be empty.',
'dimensions_metrics.0.value This value cannot be empty.',
];
}
yield 'empty name and value' => [
[
[
'type' => 'metric',
'name' => '',
'value' => '',
],
],
$empty_name_and_value_violations,
];
}
}
