1
0
قرینه از https://github.com/matomo-org/matomo.git synced 2025-08-22 06:57:53 +00:00
Files
matomo/plugins/SegmentEditor/tests/Integration/ModelTest.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

343 خطوط
12 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\SegmentEditor\tests\Integration;
use Piwik\Common;
use Piwik\Date;
use Piwik\Db;
use Piwik\Plugins\SegmentEditor\Model;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
class ModelTest extends IntegrationTestCase
{
private $model;
private $idSegment1;
private $idSegment2;
private $idSegment3;
private $idSegment4;
public function setUp(): void
{
parent::setUp();
$this->model = new Model();
$this->idSegment1 = $this->model->createSegment(array(
'name' => 'Narnia',
'definition' => 'country==Narnia',
'login' => 'user1',
'enable_only_idsite' => 0,
));
$this->idSegment2 = $this->model->createSegment(array(
'name' => 'Genovia',
'definition' => 'country==Genovia',
'auto_archive' => 1,
'enable_only_idsite' => 0,
'enable_all_users' => 1
));
$this->idSegment3 = $this->model->createSegment(array(
'name' => 'Hobbiton',
'definition' => 'country==Hobbiton',
'auto_archive' => 0,
'login' => 'user2',
'enable_only_idsite' => 1,
));
}
public function tearDown(): void
{
parent::tearDown();
// Force a hard delete of segment
$idsToDelete = array($this->idSegment1, $this->idSegment2, $this->idSegment3);
if ($this->idSegment4) {
$idsToDelete[] = $this->idSegment4;
}
$idsToDelete = implode(',', $idsToDelete);
Db::query(
"DELETE FROM " . Common::prefixTable('segment') . " WHERE idsegment IN ($idsToDelete)"
);
}
public function testDeleteSegmentDoesSoftDelete()
{
$preDeleteTimestamp = Date::getNowTimestamp();
$this->model->deleteSegment($this->idSegment1);
// None of the model methods should return it as it's deleted - so we need to get it manually from DB
$result = Db::query(
'SELECT * FROM ' . Common::prefixTable('segment') . ' WHERE idsegment = ' . $this->idSegment1
);
$row = $result->fetch();
$this->assertNotEmpty($row);
$this->assertEquals(1, $row['deleted']);
$deletedTimestamp = Date::factory($row['ts_last_edit'])->getTimestamp();
$this->assertGreaterThanOrEqual($deletedTimestamp, $preDeleteTimestamp);
}
public function testGetAllSegmentsAndIgnoreVisibilityWithDeletedSegment()
{
$segments = $this->model->getAllSegmentsAndIgnoreVisibility();
$this->assertEquals(3, count($segments));
$this->model->deleteSegment($this->idSegment2);
$segments = $this->model->getAllSegmentsAndIgnoreVisibility();
$this->assertReturnedIdsMatch(array($this->idSegment1, $this->idSegment3), $segments);
}
public function testGetSegmentsToAutoArchiveWithDeletedSegment()
{
$segments = $this->model->getSegmentsToAutoArchive();
$this->assertEquals(1, count($segments));
$this->assertReturnedIdsMatch(array($this->idSegment2), $segments);
$this->model->deleteSegment($this->idSegment2);
$segments = $this->model->getSegmentsToAutoArchive();
$this->assertEmpty($segments);
}
public function testGetAllSegmentsWithDeletedSegment()
{
$segments = $this->model->getAllSegments('user1');
$this->assertEquals(2, count($segments));
$this->model->deleteSegment($this->idSegment1);
$segments = $this->model->getAllSegments('user1');
$this->assertReturnedIdsMatch(array($this->idSegment2), $segments);
}
public function testGetAllSegmentsForSiteWithDeletedSegment()
{
$segments = $this->model->getAllSegmentsForSite(1, 'user1');
$this->assertEquals(2, count($segments));
$this->assertReturnedIdsMatch(array($this->idSegment1, $this->idSegment2), $segments);
$this->model->deleteSegment($this->idSegment2);
$segments = $this->model->getAllSegmentsForSite(1, 'user1');
$this->assertReturnedIdsMatch(array($this->idSegment1), $segments);
}
public function testGetAllSegmentsForAllUsersWithDeletedSegment()
{
$segments = $this->model->getAllSegmentsForAllUsers();
$this->assertEquals(3, count($segments));
$this->model->deleteSegment($this->idSegment3);
$segments = $this->model->getAllSegmentsForAllUsers();
$this->assertReturnedIdsMatch(array($this->idSegment1, $this->idSegment2), $segments);
}
public function testGetSegmentByDefinitionWithDeletedSegment()
{
$segment = $this->model->getSegmentByDefinition('Country==Genovia');
$this->assertNotEmpty($segment);
$this->model->deleteSegment($this->idSegment2);
$segment = $this->model->getSegmentByDefinition('Country==Genovia');
$this->assertEmpty($segment);
}
public function testGetSegmentsDeletedSinceNoDeletedSegments()
{
$date = Date::factory('now');
$segments = $this->model->getSegmentsDeletedSince($date);
$this->assertEmpty($segments);
}
public function testGetSegmentsDeletedSinceOneDeletedSegment()
{
$this->model->deleteSegment($this->idSegment3);
$date = Date::factory('now')->subDay(1);
$segments = $this->model->getSegmentsDeletedSince($date);
$this->assertCount(1, $segments);
$this->assertEquals('country==Hobbiton', $segments[0]['definition']);
}
public function testGetSegmentsDeletedSinceSegmentDeletedTooLongAgo()
{
// Manually delete it to set timestamp 9 days in past
$deletedAt = Date::factory('now')->subDay(9)->toString('Y-m-d H:i:s');
$this->model->updateSegment($this->idSegment1, array(
'deleted' => 1,
'ts_last_edit' => $deletedAt
));
// The segment deleted above should not be included as it was more than 8 days ago
$date = Date::factory('now')->subDay(8);
$segments = $this->model->getSegmentsDeletedSince($date);
$this->assertEmpty($segments);
}
public function testGetSegmentsDeletedSinceDuplicateSegment()
{
// Turn segment1 into a duplicate of segment2, except it's also deleted
$this->model->updateSegment($this->idSegment1, array(
'definition' => 'country==Genovia',
'deleted' => 1,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$date = Date::factory('now')->subDay(8);
$segments = $this->model->getSegmentsDeletedSince($date);
$this->assertEmpty($segments);
}
public function testGetSegmentsDeletedSinceDuplicateSegmentDifferentIdSite()
{
// Turn segment2 into a duplicate of segment3, except for a different idsite and also deleted
$this->model->updateSegment($this->idSegment2, array(
'definition' => 'country==Hobbiton',
'enable_only_idsite' => 2,
'deleted' => 1,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$date = Date::factory('now')->subDay(8);
$segments = $this->model->getSegmentsDeletedSince($date);
$this->assertCount(1, $segments);
$this->assertEquals('country==Hobbiton', $segments[0]['definition']);
$this->assertEquals(2, $segments[0]['enable_only_idsite']);
}
public function testGetSegmentsDeletedSinceDuplicateSegmentAllSitesAndSingleSite()
{
// Turn segment2 into a duplicate of segment3, except for all sites and also deleted
$this->model->updateSegment($this->idSegment2, array(
'definition' => 'country==Hobbiton',
'enable_only_idsite' => 0,
'deleted' => 1,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$date = Date::factory('now')->subDay(8);
$segments = $this->model->getSegmentsDeletedSince($date);
$this->assertCount(1, $segments);
$this->assertEquals('country==Hobbiton', $segments[0]['definition']);
$this->assertEquals(0, $segments[0]['enable_only_idsite']);
$this->assertEquals(array(1), $segments[0]['idsites_to_preserve']);
}
public function testGetSegmentsDeletedSinceDuplicateSegmentSingleSiteAndAllSites()
{
// Turn segment3 into a duplicate of segment1, except for a single site and deleted
$this->model->updateSegment($this->idSegment3, array(
'definition' => 'country==Narnia',
'enable_only_idsite' => 1,
'deleted' => 1,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$date = Date::factory('now')->subDay(8);
$segments = $this->model->getSegmentsDeletedSince($date);
// There is still a live segment for all sites, so the deleted site-specific one is ignored
$this->assertEmpty($segments);
}
public function testGetSegmentsDeletedSinceExistingSiteSpecificAndAllSitesMatch()
{
// A deleted all-sites segment, with both an all-sites and a site-specific segment still present
$this->model->updateSegment($this->idSegment1, array(
'definition' => 'actions >= 1',
'enable_only_idsite' => 0,
'deleted' => 0,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$this->model->updateSegment($this->idSegment2, array(
'definition' => 'actions >= 1',
'enable_only_idsite' => 0,
'deleted' => 1,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$this->model->updateSegment($this->idSegment3, array(
'definition' => 'actions >= 1',
'enable_only_idsite' => 3,
'deleted' => 0,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$this->idSegment4 = $this->model->createSegment(array(
'definition' => 'actions >= 1',
'enable_only_idsite' => 1,
'deleted' => 1,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$date = Date::factory('now')->subDay(8);
$segments = $this->model->getSegmentsDeletedSince($date);
$this->assertEmpty($segments);
}
public function testGetSegmentsDeletedSinceUrlDecodedVersionOfSegment()
{
// Turn segment2 into a duplicate of segment3, except a urlencoded version
$this->model->updateSegment($this->idSegment2, array(
'definition' => 'country%3D%3DHobbiton',
'enable_only_idsite' => 1,
'deleted' => 1,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$date = Date::factory('now')->subDay(8);
$segments = $this->model->getSegmentsDeletedSince($date);
// The two encoded and decoded version of the segments should be treated as duplicates
// This means there segment has a non-deleted version so it's not returned
$this->assertEmpty($segments);
}
public function testGetSegmentsDeletedSinceUrlEncodedVersionOfSegment()
{
// segment1 => url decoded version, deleted
$this->model->updateSegment($this->idSegment1, array(
'definition' => 'country==Narnia',
'deleted' => 1,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
// segment2 => url encoded version, not deleted
$this->model->updateSegment($this->idSegment2, array(
'definition' => 'country%3D%3DNarnia',
'deleted' => 0,
'ts_last_edit' => Date::factory('now')->toString('Y-m-d H:i:s')
));
$date = Date::factory('now')->subDay(8);
$segments = $this->model->getSegmentsDeletedSince($date);
// The two encoded and decoded version of the segments should be treated as duplicates
// This means there segment has a non-deleted version so it's not returned
$this->assertEmpty($segments);
}
private function assertReturnedIdsMatch(array $expectedIds, array $resultSet)
{
$this->assertEquals(count($expectedIds), count($resultSet));
$returnedIds = array_column($resultSet, 'idsegment');
sort($returnedIds);
$this->assertEquals(array_values($expectedIds), array_values($returnedIds));
}
}