File: PurgeLogDataTest.php

package info (click to toggle)
matomo 5.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 95,068 kB
  • sloc: php: 289,425; xml: 127,249; javascript: 112,130; python: 202; sh: 178; makefile: 20; sql: 10
file content (117 lines) | stat: -rw-r--r-- 4,388 bytes parent folder | download
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));
    }
}