1
0
قرینه از https://github.com/matomo-org/matomo.git synced 2025-08-22 06:57:53 +00:00
Files
matomo/plugins/CustomDimensions/tests/Integration/Dao/ConfigurationTest.php
Stefan Giehl d6d72d1fa7 [Coding Style] Enable rule PSR1.Methods.CamelCapsMethodName.NotCamelCaps (#22144)
* [Coding Style] Enable rule PSR1.Methods.CamelCapsMethodName.NotCamelCaps

* [Coding Style] Use camel case for method names in API plugin tests (#22145)

* [Coding Style] Use camel case for method names in Core* plugin tests (#22147)

* [Coding Style] Use camel case for method names in core Unit tests (#22149)

* [Coding Style] Use camel case for method names in Actions and BulkTracking plugin tests (#22146)

* [Coding Style] Use camel case for method names in CustomDimensions and CustomJSTracker plugin tests (#22148)

* [Coding Style] Use camel case for method names in core Integration tests (#22151)

* [Coding Style] Use camel case for method names in more core plugin tests (#22153)

* [Coding Style] Use camel case for method names in more core plugin tests (#22157)

* [Coding Style] Use camel case for method names in more core plugin tests

* Update plugins/Monolog/tests/Unit/Processor/ExceptionToTextProcessorTest.php

Co-authored-by: Michal Kleiner <michal@innocraft.com>

---------

Co-authored-by: Michal Kleiner <michal@innocraft.com>

* [Coding Style] Use camel case for method names in more core plugin tests (#22159)

* [Coding Style] Use camel case for method names in remaining tests (#22160)

* [Coding Style] Use camel case for method names in remaining tests

* rename expected test files

---------

Co-authored-by: Michal Kleiner <michal@innocraft.com>
2024-04-25 20:57:55 +02:00

374 خطوط
15 KiB
PHP

<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CustomDimensions\tests\Integration\Dao;
use Piwik\Common;
use Piwik\DbHelper;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Plugins\CustomDimensions\Dao\Configuration;
use Zend_Db_Statement_Exception;
/**
* @group CustomDimensions
* @group ConfigurationTest
* @group Dao
* @group Plugins
*/
class ConfigurationTest extends IntegrationTestCase
{
/**
* @var Configuration
*/
private $config;
private $tableName;
public function setUp(): void
{
parent::setUp();
$this->config = new Configuration();
$this->tableName = Common::prefixTable('custom_dimensions');
}
public function testShouldInstallConfigTable()
{
$columns = DbHelper::getTableColumns($this->tableName);
$columns = array_keys($columns);
$expected = array(
'idcustomdimension', 'idsite', 'name', 'index', 'scope', 'active', 'extractions', 'case_sensitive'
);
$this->assertSame($expected, $columns);
}
public function testShouldBeAbleToUninstallConfigTable()
{
$this->expectException(\Zend_Db_Statement_Exception::class);
$this->expectExceptionMessage('custom_dimensions');
$this->config->uninstall();
try {
DbHelper::getTableColumns($this->tableName); // doesn't work anymore as table was removed
} catch (Zend_Db_Statement_Exception $e) {
$this->config->install();
throw $e;
}
$this->config->install();
}
public function testConfigureNewDimensionShouldGenerateDimensionIdCorrectlyAndShouldNextFreeId()
{
$cases = $this->createManyCustomDimensionCases();
// verify they were created correctly
foreach ($cases as $index => $case) {
$dimension = $this->config->getCustomDimension($case['expectedId'], $case['idSite']);
$this->assertSame('Test' . $index, $dimension['name']);
$this->assertSame($case['scope'], $dimension['scope']);
$this->assertSame($case['active'], $dimension['active']);
$this->assertSame($case['index'] . '', $dimension['index']);
$this->assertSame($case['expectedId'] . '', $dimension['idcustomdimension']);
$this->assertSame($case['case_sensitive'], $dimension['case_sensitive']);
}
}
public function testConfigureNewDimensionShouldNotBePossibleToAssignSameIndexForSameScopeAndIdSiteTwice()
{
$this->expectException(\Zend_Db_Statement_Exception::class);
$this->expectExceptionMessage('Duplicate');
$this->configureNewDimension();
$this->configureNewDimension();
}
/**
* @dataProvider getExtractionsProvider
*/
public function testShouldSaveExtractionsSerializedAndUnserializeWhenGettingThem($expectedExtractions, $extractions)
{
$idSite = 1;
$name = 'Test';
$scope = 'action';
$index = 5;
$active = false;
$idDimension = $this->config->configureNewDimension($idSite, $name, $scope, $index, $active, $extractions, $caseSensitive = true);
$dimension = $this->config->getCustomDimension($idDimension, $idSite);
$this->assertSame($expectedExtractions, $dimension['extractions']);
$dimensions = $this->config->getCustomDimensionsForSite($idSite);
$dimension = array_shift($dimensions);
$this->assertSame($expectedExtractions, $dimension['extractions']);
$dimensions = $this->config->getCustomDimensionsHavingIndex($scope, $index);
$dimension = array_shift($dimensions);
$this->assertSame($expectedExtractions, $dimension['extractions']);
}
/**
* @dataProvider getExtractionsProvider
*/
public function testConfigureExistingDimensionShouldSerializeExtractionsAndGetThemCorrectly($expectedExtractions, $extractions)
{
$idSite = 1;
$name = 'Test';
$scope = 'action';
$index = 5;
$active = false;
$idDimension = $this->config->configureNewDimension($idSite, $name, $scope, $index, $active, array(), $caseSensitive = true);
$this->config->configureExistingDimension($idDimension, $idSite, $name, $active, $extractions, $caseSensitive = true);
$dimension = $this->config->getCustomDimension($idDimension, $idSite);
$this->assertSame($expectedExtractions, $dimension['extractions']);
}
public function testConfigureExistingDimensionShouldUpdateDimensionWhenIdSiteMatches()
{
$idSite = 1;
$idDimension = $this->configureNewDimension();
$extraction1 = array('dimension' => 'url');
$this->config->configureExistingDimension($idDimension, $idSite, $name = 'new name', $active = false, $extractions = array($extraction1), $caseSensitive = true);
$dimension = $this->config->getCustomDimension($idDimension, $idSite);
$this->assertSame('new name', $dimension['name']);
$this->assertSame(false, $dimension['active']);
$this->assertSame(true, $dimension['case_sensitive']);
$this->config->configureExistingDimension($idDimension, $idSite, $name = 'new nam2', $active = true, $extractions = array($extraction1), $caseSensitive = false);
$dimension = $this->config->getCustomDimension($idDimension, $idSite);
$this->assertSame('new nam2', $dimension['name']);
$this->assertSame(true, $dimension['active']);
$this->assertSame(false, $dimension['case_sensitive']);
}
public function testConfigureExistingDimensionShouldNotUpdateDimensionIfIdSiteDoesNotMatch()
{
$idDimension = $this->configureNewDimension();
$extraction1 = array('dimension' => 'url');
$this->config->configureExistingDimension($idDimension, $idSite = 2, $name = 'new name', $active = false, $extractions = array($extraction1), $caseSensitive = false);
// verify it stays unchanged
$dimension = $this->config->getCustomDimension($idDimension, $idSite = 1);
$this->assertSame('Test', $dimension['name']);
$this->assertSame(true, $dimension['active']);
$this->assertSame(true, $dimension['case_sensitive']);
// verify no dimension for other site was created
$dimension = $this->config->getCustomDimension($idDimension, $idSite = 2);
$this->assertFalse($dimension);
}
public function getExtractionsProvider()
{
$tests = array();
// should convert any non array value to an array
$tests[] = array(array(), null);
$tests[] = array(array(), 'invalid');
$tests[] = array(array(), 5);
$tests[] = array(array(), array());
// this would be in theory possibly but shouldn't be done. Model should be stupid and not check it
$tests[] = array(array(5), array(5));
$extraction1 = array('dimension' => 'url', 'pattern' => 'index_(.*).html');
$tests[] = array(array($extraction1), array($extraction1));
$extraction2 = array('dimension' => 'action_name', 'pattern' => 'index(.*)');
$tests[] = array(array($extraction1, $extraction2), array($extraction1, $extraction2));
return $tests;
}
public function testGetCustomDimensionsForSiteShouldBeEmptyIfThereAreNoCustomDimensions()
{
$this->assertSame(array(), $this->config->getCustomDimensionsForSite($idSite = 1));
}
private function configureNewDimension($idSite = 1, $name = 'Test', $scope = 'action', $index = 5, $active = true, $extractions = array())
{
return $this->config->configureNewDimension($idSite, $name, $scope, $index, $active, $extractions, $caseSensitive = true);
}
public function testGetCustomDimensionShouldOnlyFindDimensionMatchingIdDimensionAndIdSite()
{
$this->createManyCustomDimensionCases();
$this->assertEmpty($this->config->getCustomDimension($idDimension = 999, $idSite = 1));
$this->assertEmpty($this->config->getCustomDimension($idDimension = 1, $idSite = 999));
$this->assertEmpty($this->config->getCustomDimension($idDimension = 999, $idSite = 999));
$this->assertNotEmpty($this->config->getCustomDimension($idDimension = 1, $idSite = 1));
$this->assertNotEmpty($this->config->getCustomDimension($idDimension = 2, $idSite = 1));
$this->assertNotEmpty($this->config->getCustomDimension($idDimension = 3, $idSite = 1));
$this->assertNotEmpty($this->config->getCustomDimension($idDimension = 1, $idSite = 2));
$this->assertNotEmpty($this->config->getCustomDimension($idDimension = 2, $idSite = 2));
}
public function testGetCustomDimensionShouldReturnDimension()
{
$this->createManyCustomDimensionCases();
$dimension = $this->config->getCustomDimension($idDimension = 1, $idSite = 1);
$expected = array(
'idcustomdimension' => '1',
'idsite' => '1',
'name' => 'Test0',
'index' => '1',
'scope' => 'action',
'active' => true,
'extractions' => array(),
'case_sensitive' => true,
);
$this->assertSame($expected, $dimension);
}
public function testGetCustomDimensionsForSiteShouldFindEntriesHavingThisSite()
{
$this->createManyCustomDimensionCases();
$dimensions = $this->config->getCustomDimensionsForSite($idSite = 1);
$this->assertCount(5, $dimensions);
foreach ($dimensions as $dimension) {
$this->assertSame('1', $dimension['idsite']);
$this->assertTrue(is_bool($dimension['active']));
}
$dimensions = $this->config->getCustomDimensionsForSite($idSite = 2);
$this->assertCount(3, $dimensions);
foreach ($dimensions as $dimension) {
$this->assertSame('2', $dimension['idsite']);
}
// nothing matches
$dimensions = $this->config->getCustomDimensionsForSite($idSite = 99);
$this->assertSame(array(), $dimensions);
}
public function testGetCustomDimensionsHavingIndexShouldFindEntriesHavingIndexAndSite()
{
$this->createManyCustomDimensionCases();
$dimensions = $this->config->getCustomDimensionsHavingIndex($scope = 'visit', $index = 1);
$this->assertCount(2, $dimensions);
foreach ($dimensions as $dimension) {
$this->assertSame('visit', $dimension['scope']);
$this->assertSame('1', $dimension['index']);
$this->assertTrue(is_bool($dimension['active']));
}
$dimensions = $this->config->getCustomDimensionsHavingIndex($scope = 'action', $index = 2);
$this->assertCount(1, $dimensions);
foreach ($dimensions as $dimension) {
$this->assertSame('action', $dimension['scope']);
$this->assertSame('2', $dimension['index']);
$this->assertTrue(is_bool($dimension['active']));
}
// nothing matches
$dimensions = $this->config->getCustomDimensionsHavingIndex($scope = 'visit', $index = 99);
$this->assertSame(array(), $dimensions);
}
public function testGdeleteConfigurationsForSiteShouldOnlyDeleteConfigsForThisSite()
{
$this->createManyCustomDimensionCases();
$idSite = 1;
$dimensions = $this->config->getCustomDimensionsForSite($idSite);
$this->assertCount(5, $dimensions);
$this->config->deleteConfigurationsForSite($idSite);
// verify deleted
$dimensions = $this->config->getCustomDimensionsForSite($idSite);
$this->assertSame(array(), $dimensions);
// verify entries for other site still exist
$dimensions = $this->config->getCustomDimensionsForSite($idSite = 2);
$this->assertCount(3, $dimensions);
}
public function testGetCustomDimensionsHavingIndexShouldOnlyDeleteConfigsForThisSite()
{
$this->createManyCustomDimensionCases();
$index = 1;
$dimensions = $this->config->getCustomDimensionsHavingIndex('visit', $index);
$this->assertCount(2, $dimensions);
$dimensions = $this->config->getCustomDimensionsHavingIndex('action', $index);
$this->assertCount(2, $dimensions);
$this->config->deleteConfigurationsForIndex($index, 'visit');
// verify deleted
$dimensions = $this->config->getCustomDimensionsHavingIndex('visit', $index);
$this->assertSame(array(), $dimensions);
$dimensions = $this->config->getCustomDimensionsHavingIndex('action', $index);
$this->assertCount(2, $dimensions);
$this->config->deleteConfigurationsForIndex($index, 'action');
// verify now also deleted
$dimensions = $this->config->getCustomDimensionsHavingIndex('action', $index);
$this->assertSame(array(), $dimensions);
// verify entries for other site still exist
$dimensions = $this->config->getCustomDimensionsHavingIndex('visit', $index = 2);
$this->assertCount(2, $dimensions);
}
private function createManyCustomDimensionCases()
{
return self::createManyCustomDimensionCasesFor($this->config);
}
public static function createManyCustomDimensionCasesFor(Configuration $config)
{
$cases = array(
array('idSite' => 1, 'scope' => 'action', 'index' => 1, 'expectedId' => 1, 'case_sensitive' => true, 'active' => true),
array('idSite' => 1, 'scope' => 'visit', 'index' => 1, 'expectedId' => 2, 'case_sensitive' => false, 'active' => false),
array('idSite' => 1, 'scope' => 'visit', 'index' => 2, 'expectedId' => 3, 'case_sensitive' => true, 'active' => false),
array('idSite' => 2, 'scope' => 'action', 'index' => 1, 'expectedId' => 1, 'case_sensitive' => false, 'active' => false),
array('idSite' => 1, 'scope' => 'action', 'index' => 2, 'expectedId' => 4, 'case_sensitive' => false, 'active' => true),
array('idSite' => 1, 'scope' => 'visit', 'index' => 3, 'expectedId' => 5, 'case_sensitive' => false, 'active' => false),
array('idSite' => 2, 'scope' => 'visit', 'index' => 1, 'expectedId' => 2, 'case_sensitive' => true, 'active' => true),
array('idSite' => 2, 'scope' => 'visit', 'index' => 2, 'expectedId' => 3, 'case_sensitive' => true, 'active' => false),
);
foreach ($cases as $index => $case) {
$idDimension = $config->configureNewDimension($case['idSite'], $name = 'Test' . $index, $case['scope'], $case['index'], $case['active'], $extractions = array(), $case['case_sensitive']);
self::assertSame($case['expectedId'], $idDimension);
}
return $cases;
}
}