1
1
Fork 0
mirror of https://code.mensbeam.com/MensBeam/Arsse.git synced 2024-12-23 17:12:41 +00:00
Arsse/tests/cases/Database/SeriesCleanup.php

298 lines
12 KiB
PHP
Raw Normal View History

2017-08-18 02:36:15 +00:00
<?php
/** @license MIT
* Copyright 2017 J. King, Dustin Wilson et al.
* See LICENSE and AUTHORS files for details */
2017-08-18 02:36:15 +00:00
declare(strict_types=1);
2021-04-14 15:17:01 +00:00
2018-11-23 15:01:17 +00:00
namespace JKingWeb\Arsse\TestCase\Database;
2017-08-29 14:50:31 +00:00
2017-08-18 02:36:15 +00:00
use JKingWeb\Arsse\Arsse;
2020-04-25 15:42:23 +00:00
use DateTimeImmutable as Date;
2017-08-18 02:36:15 +00:00
trait SeriesCleanup {
2020-01-20 18:52:48 +00:00
protected function setUpSeriesCleanup(): void {
// set up the configuration
Arsse::$conf->import([
'userSessionTimeout' => "PT1H",
'userSessionLifetime' => "PT24H",
]);
2017-08-18 02:36:15 +00:00
// set up the test data
2020-03-11 20:21:42 +00:00
$tz = new \DateTimeZone("UTC");
2020-04-25 15:42:23 +00:00
$nowish = (new Date("now - 1 minute", $tz))->format("Y-m-d H:i:s");
$yesterday = (new Date("now - 1 day", $tz))->format("Y-m-d H:i:s");
$daybefore = (new Date("now - 2 days", $tz))->format("Y-m-d H:i:s");
$daysago = (new Date("now - 7 days", $tz))->format("Y-m-d H:i:s");
$weeksago = (new Date("now - 21 days", $tz))->format("Y-m-d H:i:s");
$soon = (new Date("now + 1 minute", $tz))->format("Y-m-d H:i:s");
$faroff = (new Date("now + 1 hour", $tz))->format("Y-m-d H:i:s");
2017-08-18 02:36:15 +00:00
$this->data = [
'arsse_users' => [
'columns' => [
'id' => 'str',
'password' => 'str',
'num' => 'int',
2017-08-18 02:36:15 +00:00
],
'rows' => [
["jane.doe@example.com", "",1],
["john.doe@example.com", "",2],
2017-08-18 02:36:15 +00:00
],
],
2017-09-24 16:45:07 +00:00
'arsse_sessions' => [
'columns' => [
'id' => "str",
'created' => "datetime",
'expires' => "datetime",
'user' => "str",
],
'rows' => [
["a", $nowish, $faroff, "jane.doe@example.com"], // not expired and recently created, thus kept
["b", $nowish, $soon, "jane.doe@example.com"], // not expired and recently created, thus kept
["c", $daysago, $soon, "jane.doe@example.com"], // created more than a day ago, thus deleted
["d", $nowish, $nowish, "jane.doe@example.com"], // recently created but expired, thus deleted
["e", $daysago, $nowish, "jane.doe@example.com"], // created more than a day ago and expired, thus deleted
],
],
'arsse_tokens' => [
'columns' => [
'id' => "str",
'class' => "str",
2020-03-01 20:16:50 +00:00
'user' => "str",
'expires' => "datetime",
],
'rows' => [
["80fa94c1a11f11e78667001e673b2560", "fever.login", "jane.doe@example.com", $faroff],
["27c6de8da13311e78667001e673b2560", "fever.login", "jane.doe@example.com", $weeksago], // expired
["ab3b3eb8a13311e78667001e673b2560", "class.class", "jane.doe@example.com", null],
["da772f8fa13c11e78667001e673b2560", "class.class", "john.doe@example.com", $soon],
],
],
2020-11-06 22:06:01 +00:00
'arsse_icons' => [
'columns' => [
2020-11-16 15:26:14 +00:00
'id' => "int",
'url' => "str",
2020-11-06 22:06:01 +00:00
'orphaned' => "datetime",
],
'rows' => [
2020-11-07 13:11:06 +00:00
[1,'http://localhost:8000/Icon/PNG',$daybefore],
[2,'http://localhost:8000/Icon/GIF',$daybefore],
2020-11-06 22:06:01 +00:00
[3,'http://localhost:8000/Icon/SVG1',null],
],
],
2017-08-18 02:36:15 +00:00
'arsse_feeds' => [
'columns' => [
'id' => "int",
'url' => "str",
'title' => "str",
'orphaned' => "datetime",
'size' => "int",
2020-11-07 13:11:06 +00:00
'icon' => "int",
2017-08-18 02:36:15 +00:00
],
'rows' => [
2020-11-07 13:11:06 +00:00
[1,"http://example.com/1","",$daybefore,2,null], //latest two articles should be kept
[2,"http://example.com/2","",$yesterday,0,2],
[3,"http://example.com/3","",null,0,1],
[4,"http://example.com/4","",$nowish,0,null],
2020-03-01 20:16:50 +00:00
],
2017-08-18 02:36:15 +00:00
],
'arsse_subscriptions' => [
'columns' => [
'id' => "int",
'owner' => "str",
'feed' => "int",
],
'rows' => [
// one feed previously marked for deletion has a subscription again, and so should not be deleted
[1,'jane.doe@example.com',1],
// other subscriptions exist for article cleanup tests
[2,'john.doe@example.com',1],
2020-03-01 20:16:50 +00:00
],
2017-08-18 02:36:15 +00:00
],
'arsse_articles' => [
'columns' => [
'id' => "int",
'feed' => "int",
'url_title_hash' => "str",
'url_content_hash' => "str",
'title_content_hash' => "str",
'modified' => "datetime",
],
'rows' => [
[1,1,"","","",$weeksago], // is the latest article, thus is kept
[2,1,"","","",$weeksago], // is the second latest article, thus is kept
[3,1,"","","",$weeksago], // is starred by one user, thus is kept
[4,1,"","","",$weeksago], // does not meet the unread threshold due to a recent mark, thus is kept
[5,1,"","","",$daysago], // does not meet the unread threshold due to age, thus is kept
[6,1,"","","",$weeksago], // does not meet the read threshold due to a recent mark, thus is kept
[7,1,"","","",$weeksago], // meets the unread threshold without marks, thus is deleted
[8,1,"","","",$weeksago], // meets the unread threshold even with marks, thus is deleted
[9,1,"","","",$weeksago], // meets the read threshold, thus is deleted
2020-03-01 20:16:50 +00:00
],
2017-08-18 02:36:15 +00:00
],
'arsse_editions' => [
'columns' => [
'id' => "int",
'article' => "int",
],
'rows' => [
[1,1],
[2,2],
[3,3],
[4,4],
[201,1],
[102,2],
2020-03-01 20:16:50 +00:00
],
2017-08-18 02:36:15 +00:00
],
'arsse_marks' => [
'columns' => [
'article' => "int",
'subscription' => "int",
'read' => "bool",
'starred' => "bool",
'hidden' => "bool",
2017-08-18 02:36:15 +00:00
'modified' => "datetime",
],
'rows' => [
[3,1,0,1,0,$weeksago],
[4,1,1,0,0,$daysago],
[6,1,1,0,0,$nowish],
[6,2,1,0,0,$weeksago],
[7,2,0,1,1,$weeksago], // hidden takes precedence over starred
[8,1,1,0,0,$weeksago],
[9,1,1,0,0,$daysago],
[9,2,0,0,1,$daysago], // hidden is the same as read for the purposes of cleanup
2020-03-01 20:16:50 +00:00
],
2017-08-18 02:36:15 +00:00
],
];
}
2020-01-20 18:52:48 +00:00
protected function tearDownSeriesCleanup(): void {
2018-11-25 05:03:56 +00:00
unset($this->data);
}
2020-01-20 18:52:48 +00:00
public function testCleanUpOrphanedFeeds(): void {
2017-08-18 02:36:15 +00:00
Arsse::$db->feedCleanup();
$now = gmdate("Y-m-d H:i:s");
$state = $this->primeExpectations($this->data, [
2020-03-01 20:16:50 +00:00
'arsse_feeds' => ["id","orphaned"],
2017-08-18 02:36:15 +00:00
]);
$state['arsse_feeds']['rows'][0][1] = null;
unset($state['arsse_feeds']['rows'][1]);
$state['arsse_feeds']['rows'][2][1] = $now;
2019-06-21 22:52:27 +00:00
$this->compareExpectations(static::$drv, $state);
2017-08-18 02:36:15 +00:00
}
2020-01-20 18:52:48 +00:00
public function testCleanUpOrphanedFeedsWithUnlimitedRetention(): void {
Arsse::$conf->import([
'purgeFeeds' => null,
]);
Arsse::$db->feedCleanup();
$now = gmdate("Y-m-d H:i:s");
$state = $this->primeExpectations($this->data, [
2020-03-01 20:16:50 +00:00
'arsse_feeds' => ["id","orphaned"],
]);
$state['arsse_feeds']['rows'][0][1] = null;
$state['arsse_feeds']['rows'][2][1] = $now;
2019-06-21 22:52:27 +00:00
$this->compareExpectations(static::$drv, $state);
}
2020-11-07 13:11:06 +00:00
public function testCleanUpOrphanedIcons(): void {
Arsse::$db->iconCleanup();
$now = gmdate("Y-m-d H:i:s");
$state = $this->primeExpectations($this->data, [
'arsse_icons' => ["id","orphaned"],
]);
$state['arsse_icons']['rows'][0][1] = null;
unset($state['arsse_icons']['rows'][1]);
$state['arsse_icons']['rows'][2][1] = $now;
$this->compareExpectations(static::$drv, $state);
}
public function testCleanUpOrphanedIconsWithUnlimitedRetention(): void {
Arsse::$conf->import([
'purgeFeeds' => null,
]);
Arsse::$db->iconCleanup();
$now = gmdate("Y-m-d H:i:s");
$state = $this->primeExpectations($this->data, [
'arsse_icons' => ["id","orphaned"],
]);
$state['arsse_icons']['rows'][0][1] = null;
$state['arsse_icons']['rows'][2][1] = $now;
$this->compareExpectations(static::$drv, $state);
}
2020-01-20 18:52:48 +00:00
public function testCleanUpOldArticlesWithStandardRetention(): void {
2017-08-18 02:36:15 +00:00
Arsse::$db->articleCleanup();
$state = $this->primeExpectations($this->data, [
2020-03-01 20:16:50 +00:00
'arsse_articles' => ["id"],
2017-08-18 02:36:15 +00:00
]);
2017-08-29 14:50:31 +00:00
foreach ([7,8,9] as $id) {
2017-08-18 02:36:15 +00:00
unset($state['arsse_articles']['rows'][$id - 1]);
}
2019-06-21 22:52:27 +00:00
$this->compareExpectations(static::$drv, $state);
2017-08-18 02:36:15 +00:00
}
2018-10-26 18:58:04 +00:00
2020-01-20 18:52:48 +00:00
public function testCleanUpOldArticlesWithUnlimitedReadRetention(): void {
Arsse::$conf->import([
'purgeArticlesRead' => null,
]);
2017-08-18 02:36:15 +00:00
Arsse::$db->articleCleanup();
$state = $this->primeExpectations($this->data, [
2020-03-01 20:16:50 +00:00
'arsse_articles' => ["id"],
2017-08-18 02:36:15 +00:00
]);
2017-08-29 14:50:31 +00:00
foreach ([7,8] as $id) {
2017-08-18 02:36:15 +00:00
unset($state['arsse_articles']['rows'][$id - 1]);
}
2019-06-21 22:52:27 +00:00
$this->compareExpectations(static::$drv, $state);
2017-08-18 02:36:15 +00:00
}
2018-10-26 18:58:04 +00:00
2020-01-20 18:52:48 +00:00
public function testCleanUpOldArticlesWithUnlimitedUnreadRetention(): void {
Arsse::$conf->import([
'purgeArticlesUnread' => null,
]);
2017-08-18 02:36:15 +00:00
Arsse::$db->articleCleanup();
$state = $this->primeExpectations($this->data, [
2020-03-01 20:16:50 +00:00
'arsse_articles' => ["id"],
2017-08-18 02:36:15 +00:00
]);
2017-08-29 14:50:31 +00:00
foreach ([9] as $id) {
2017-08-18 02:36:15 +00:00
unset($state['arsse_articles']['rows'][$id - 1]);
}
2019-06-21 22:52:27 +00:00
$this->compareExpectations(static::$drv, $state);
2017-08-18 02:36:15 +00:00
}
2020-01-20 18:52:48 +00:00
public function testCleanUpOldArticlesWithUnlimitedRetention(): void {
Arsse::$conf->import([
2020-03-01 20:16:50 +00:00
'purgeArticlesRead' => null,
'purgeArticlesUnread' => null,
]);
2017-08-18 02:36:15 +00:00
Arsse::$db->articleCleanup();
$state = $this->primeExpectations($this->data, [
2020-03-01 20:16:50 +00:00
'arsse_articles' => ["id"],
2017-08-18 02:36:15 +00:00
]);
2019-06-21 22:52:27 +00:00
$this->compareExpectations(static::$drv, $state);
2017-08-18 02:36:15 +00:00
}
2017-09-24 16:45:07 +00:00
2020-01-20 18:52:48 +00:00
public function testCleanUpExpiredSessions(): void {
2017-09-24 16:45:07 +00:00
Arsse::$db->sessionCleanup();
$state = $this->primeExpectations($this->data, [
2020-03-01 20:16:50 +00:00
'arsse_sessions' => ["id"],
2017-09-24 16:45:07 +00:00
]);
foreach ([3,4,5] as $id) {
unset($state['arsse_sessions']['rows'][$id - 1]);
}
2019-06-21 22:52:27 +00:00
$this->compareExpectations(static::$drv, $state);
2017-09-24 16:45:07 +00:00
}
2020-01-20 18:52:48 +00:00
public function testCleanUpExpiredTokens(): void {
Arsse::$db->tokenCleanup();
$state = $this->primeExpectations($this->data, [
2020-03-01 20:16:50 +00:00
'arsse_tokens' => ["id", "class"],
]);
foreach ([2] as $id) {
unset($state['arsse_tokens']['rows'][$id - 1]);
}
2019-06-21 22:52:27 +00:00
$this->compareExpectations(static::$drv, $state);
}
2017-08-29 14:50:31 +00:00
}