1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
declare(strict_types=1);
namespace Piwik\Plugins\BotTracking\tests\System;
use Piwik\Container\StaticContainer;
use Piwik\DataAccess\RawLogDao;
use Piwik\Date;
use Piwik\Db;
use Piwik\LogDeleter;
use Piwik\Plugin\Dimension\DimensionMetadataProvider;
use Piwik\Plugins\BotTracking\Dao\BotRequestsDao;
use Piwik\Plugins\PrivacyManager\LogDataPurger;
use Piwik\Plugins\PrivacyManager\Model\DataSubjects;
use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\Mock\Plugin\LogTablesProvider;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
/**
* @group BotTracking
* @group Plugins
*/
class PurgeLogDataTest extends SystemTestCase
{
public function setUp(): void
{
parent::setUp();
Fixture::createSuperUser();
Fixture::createWebsite('2014-02-04');
Db::query('TRUNCATE TABLE ' . BotRequestsDao::getPrefixedTableName());
// track some bot requests
$t = Fixture::getTracker(1, '2025-02-02 12:00:00');
$t->setUserAgent('Mozilla/5.0 (compatible; ChatGPT-User/1.0)');
$t->setUrl('https://matomo.org/faq/123');
$t->setCustomTrackingParameter('recMode', '1');
Fixture::checkResponse($t->doTrackPageView(''));
$t = Fixture::getTracker(1, '2025-02-02 17:00:00');
$t->setUserAgent('Perplexity-User/1.0');
$t->setUrl('https://matomo.org/faq/987');
$t->setCustomTrackingParameter('recMode', '1');
Fixture::checkResponse($t->doTrackPageView(''));
$t = Fixture::getTracker(1, '2025-02-03 01:00:00');
$t->setUserAgent('MistralAI-User/2.0');
$t->setUrl('https://matomo.org/faq/576');
$t->setCustomTrackingParameter('recMode', '1');
Fixture::checkResponse($t->doTrackPageView(''));
}
public function testLogDataPurgingRemovesBotRequests(): void
{
// check that all requests were tracked
$tableName = BotRequestsDao::getPrefixedTableName();
$sql = "SELECT COUNT(*) FROM `{$tableName}`";
self::assertEquals(3, Db::fetchOne($sql));
// run purging for dates before 2025-02-03
$rawLogDao = new RawLogDao(new DimensionMetadataProvider());
$purger = new LogDataPurger(new LogDeleter($rawLogDao, new LogTablesProvider()), $rawLogDao);
$days = floor((Date::now()->getTimestamp() - Date::factory('2025-02-03 00:00:00')->getTimestamp()) / (3600 * 24));
$purger->purgeData($days, true);
// ensure that two bot requests were removed
$sql = "SELECT * FROM `{$tableName}`";
$bots = Db::fetchAll($sql);
self::assertCount(1, $bots);
self::assertEquals('MistralAI-User', $bots[0]['bot_name']);
}
public function testDeleteDataSubjectsForDeletedSitesRemovesBotRequests(): void
{
// track request for another site
Fixture::createWebsite('2014-02-04');
// track some bot requests
$t = Fixture::getTracker(2, '2025-02-02 12:00:00');
$t->setUserAgent('Mozilla/5.0 (compatible; ChatGPT-User/1.0)');
$t->setUrl('https://matomo.org/faq/123');
$t->setCustomTrackingParameter('recMode', '1');
Fixture::checkResponse($t->doTrackPageView(''));
// remove site 1
SitesManagerAPI::getInstance()->deleteSite(1);
// check that all requests still exist
$tableName = BotRequestsDao::getPrefixedTableName();
$sql = "SELECT COUNT(*) FROM `{$tableName}`";
self::assertEquals(4, Db::fetchOne($sql));
$logTablesProvider = StaticContainer::get('Piwik\Plugin\LogTablesProvider');
$dataSubjects = new DataSubjects($logTablesProvider);
$result = $dataSubjects->deleteDataSubjectsForDeletedSites([2]); // idsite 2 still exists
$this->assertEquals([
'log_bot_request' => 3,
], $result);
// check that requests were correctly removed
$sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE `idsite` = 1";
self::assertEquals(0, Db::fetchOne($sql));
$sql = "SELECT COUNT(*) FROM `{$tableName}` WHERE `idsite` = 2";
self::assertEquals(1, Db::fetchOne($sql));
}
}
|