1111
1212namespace Piwik \Plugins \BotTracking \tests \System ;
1313
14+ use Piwik \Container \StaticContainer ;
1415use Piwik \DataAccess \RawLogDao ;
1516use Piwik \Date ;
1617use Piwik \Db ;
1718use Piwik \LogDeleter ;
1819use Piwik \Plugin \Dimension \DimensionMetadataProvider ;
1920use Piwik \Plugins \BotTracking \Dao \BotRequestsDao ;
2021use Piwik \Plugins \PrivacyManager \LogDataPurger ;
22+ use Piwik \Plugins \PrivacyManager \Model \DataSubjects ;
23+ use Piwik \Plugins \SitesManager \API as SitesManagerAPI ;
2124use Piwik \Tests \Framework \Fixture ;
2225use Piwik \Tests \Framework \Mock \Plugin \LogTablesProvider ;
2326use Piwik \Tests \Framework \TestCase \SystemTestCase ;
@@ -34,10 +37,9 @@ public function setUp(): void
3437
3538 Fixture::createSuperUser ();
3639 Fixture::createWebsite ('2014-02-04 ' );
37- }
3840
39- public function testLogDataPurgingRemovesBotRequests (): void
40- {
41+ Db:: query ( ' TRUNCATE TABLE ' . BotRequestsDao:: getPrefixedTableName ());
42+
4143 // track some bot requests
4244 $ t = Fixture::getTracker (1 , '2025-02-02 12:00:00 ' );
4345 $ t ->setUserAgent ('Mozilla/5.0 (compatible; ChatGPT-User/1.0) ' );
@@ -56,7 +58,10 @@ public function testLogDataPurgingRemovesBotRequests(): void
5658 $ t ->setUrl ('https://matomo.org/faq/576 ' );
5759 $ t ->setCustomTrackingParameter ('recMode ' , '1 ' );
5860 Fixture::checkResponse ($ t ->doTrackPageView ('' ));
61+ }
5962
63+ public function testLogDataPurgingRemovesBotRequests (): void
64+ {
6065 // check that all requests were tracked
6166 $ tableName = BotRequestsDao::getPrefixedTableName ();
6267 $ sql = "SELECT COUNT(*) FROM ` {$ tableName }` " ;
@@ -69,10 +74,53 @@ public function testLogDataPurgingRemovesBotRequests(): void
6974 $ purger ->purgeData ($ days , true );
7075
7176 // ensure that two bot requests were removed
72- $ tableName = BotRequestsDao::getPrefixedTableName ();
7377 $ sql = "SELECT * FROM ` {$ tableName }` " ;
7478 $ bots = Db::fetchAll ($ sql );
7579 self ::assertCount (1 , $ bots );
7680 self ::assertEquals ('MistralAI-User ' , $ bots [0 ]['bot_name ' ]);
7781 }
82+
83+ public function testDeleteDataSubjectsForDeletedSitesRemovesBotRequests (): void
84+ {
85+ // track a normal visit that gets removed, otherwise bot requests won't be removed
86+ $ t = Fixture::getTracker (1 , '2025-02-02 12:00:00 ' );
87+ $ t ->setUrl ('https://matomo.org/faq/123 ' );
88+ Fixture::checkResponse ($ t ->doTrackPageView ('' ));
89+
90+ // track request for another site
91+ Fixture::createWebsite ('2014-02-04 ' );
92+
93+ // track some bot requests
94+ $ t = Fixture::getTracker (2 , '2025-02-02 12:00:00 ' );
95+ $ t ->setUserAgent ('Mozilla/5.0 (compatible; ChatGPT-User/1.0) ' );
96+ $ t ->setUrl ('https://matomo.org/faq/123 ' );
97+ $ t ->setCustomTrackingParameter ('recMode ' , '1 ' );
98+ Fixture::checkResponse ($ t ->doTrackPageView ('' ));
99+
100+ // remove site 1
101+ SitesManagerAPI::getInstance ()->deleteSite (1 );
102+
103+ // check that all requests still exist
104+ $ tableName = BotRequestsDao::getPrefixedTableName ();
105+ $ sql = "SELECT COUNT(*) FROM ` {$ tableName }` " ;
106+ self ::assertEquals (4 , Db::fetchOne ($ sql ));
107+
108+ $ logTablesProvider = StaticContainer::get ('Piwik\Plugin\LogTablesProvider ' );
109+ $ dataSubjects = new DataSubjects ($ logTablesProvider );
110+ $ result = $ dataSubjects ->deleteDataSubjectsForDeletedSites ([2 ]); // idsite 2 still exists
111+ $ this ->assertEquals ([
112+ 'log_visit ' => 1 ,
113+ 'log_link_visit_action ' => 1 ,
114+ 'log_conversion_item ' => 0 ,
115+ 'log_conversion ' => 0 ,
116+ 'log_bot_request ' => 3 ,
117+ ], $ result );
118+
119+ // check that requests were correctly removed
120+ $ sql = "SELECT COUNT(*) FROM ` {$ tableName }` WHERE `idsite` = 1 " ;
121+ self ::assertEquals (0 , Db::fetchOne ($ sql ));
122+
123+ $ sql = "SELECT COUNT(*) FROM ` {$ tableName }` WHERE `idsite` = 2 " ;
124+ self ::assertEquals (1 , Db::fetchOne ($ sql ));
125+ }
78126}
0 commit comments