J. King
7 years ago
13 changed files with 273 additions and 58 deletions
@ -0,0 +1,10 @@ |
|||||
|
<?php |
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse; |
||||
|
|
||||
|
/** @covers \JKingWeb\Arsse\Database<extended> */ |
||||
|
class TestDatabaseCleanupSQLite3 extends Test\AbstractTest { |
||||
|
use Test\Database\Setup; |
||||
|
use Test\Database\DriverSQLite3; |
||||
|
use Test\Database\SeriesCleanup; |
||||
|
} |
@ -0,0 +1,168 @@ |
|||||
|
<?php |
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Test\Database; |
||||
|
use JKingWeb\Arsse\Arsse; |
||||
|
use Phake; |
||||
|
|
||||
|
trait SeriesCleanup { |
||||
|
|
||||
|
function setUpSeries() { |
||||
|
// set up the test data |
||||
|
$nowish = gmdate("Y-m-d H:i:s",strtotime("now - 1 minute")); |
||||
|
$yesterday = gmdate("Y-m-d H:i:s",strtotime("now - 1 day")); |
||||
|
$daybefore = gmdate("Y-m-d H:i:s",strtotime("now - 2 days")); |
||||
|
$daysago = gmdate("Y-m-d H:i:s",strtotime("now - 7 days")); |
||||
|
$weeksago = gmdate("Y-m-d H:i:s",strtotime("now - 21 days")); |
||||
|
$this->data = [ |
||||
|
'arsse_users' => [ |
||||
|
'columns' => [ |
||||
|
'id' => 'str', |
||||
|
'password' => 'str', |
||||
|
'name' => 'str', |
||||
|
], |
||||
|
'rows' => [ |
||||
|
["jane.doe@example.com", "", "Jane Doe"], |
||||
|
["john.doe@example.com", "", "John Doe"], |
||||
|
], |
||||
|
], |
||||
|
'arsse_feeds' => [ |
||||
|
'columns' => [ |
||||
|
'id' => "int", |
||||
|
'url' => "str", |
||||
|
'title' => "str", |
||||
|
'orphaned' => "datetime", |
||||
|
'size' => "int", |
||||
|
], |
||||
|
'rows' => [ |
||||
|
[1,"http://example.com/1","",$daybefore,2], //latest two articles should be kept |
||||
|
[2,"http://example.com/2","",$yesterday,0], |
||||
|
[3,"http://example.com/3","",null,0], |
||||
|
[4,"http://example.com/4","",$nowish,0], |
||||
|
] |
||||
|
], |
||||
|
'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], |
||||
|
] |
||||
|
], |
||||
|
'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 |
||||
|
] |
||||
|
], |
||||
|
'arsse_editions' => [ |
||||
|
'columns' => [ |
||||
|
'id' => "int", |
||||
|
'article' => "int", |
||||
|
], |
||||
|
'rows' => [ |
||||
|
[1,1], |
||||
|
[2,2], |
||||
|
[3,3], |
||||
|
[4,4], |
||||
|
[201,1], |
||||
|
[102,2], |
||||
|
] |
||||
|
], |
||||
|
'arsse_marks' => [ |
||||
|
'columns' => [ |
||||
|
'article' => "int", |
||||
|
'subscription' => "int", |
||||
|
'read' => "bool", |
||||
|
'starred' => "bool", |
||||
|
'modified' => "datetime", |
||||
|
], |
||||
|
'rows' => [ |
||||
|
[3,1,0,1,$weeksago], |
||||
|
[4,1,1,0,$daysago], |
||||
|
[6,1,1,0,$nowish], |
||||
|
[6,2,1,0,$weeksago], |
||||
|
[8,1,1,0,$weeksago], |
||||
|
[9,1,1,0,$daysago], |
||||
|
[9,2,1,0,$daysago], |
||||
|
] |
||||
|
], |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
function testCleanUpOrphanedFeeds() { |
||||
|
Arsse::$db->feedCleanup(); |
||||
|
$now = gmdate("Y-m-d H:i:s"); |
||||
|
$state = $this->primeExpectations($this->data, [ |
||||
|
'arsse_feeds' => ["id","orphaned"] |
||||
|
]); |
||||
|
$state['arsse_feeds']['rows'][0][1] = null; |
||||
|
unset($state['arsse_feeds']['rows'][1]); |
||||
|
$state['arsse_feeds']['rows'][2][1] = $now; |
||||
|
$this->compareExpectations($state); |
||||
|
} |
||||
|
|
||||
|
function testCleanUpOldArticlesWithStandardRetention() { |
||||
|
Arsse::$db->articleCleanup(); |
||||
|
$state = $this->primeExpectations($this->data, [ |
||||
|
'arsse_articles' => ["id"] |
||||
|
]); |
||||
|
foreach([7,8,9] as $id) { |
||||
|
unset($state['arsse_articles']['rows'][$id - 1]); |
||||
|
} |
||||
|
$this->compareExpectations($state); |
||||
|
} |
||||
|
|
||||
|
function testCleanUpOldArticlesWithUnlimitedReadRetention() { |
||||
|
Arsse::$conf->retainArticlesRead = ""; |
||||
|
Arsse::$db->articleCleanup(); |
||||
|
$state = $this->primeExpectations($this->data, [ |
||||
|
'arsse_articles' => ["id"] |
||||
|
]); |
||||
|
foreach([7,8] as $id) { |
||||
|
unset($state['arsse_articles']['rows'][$id - 1]); |
||||
|
} |
||||
|
$this->compareExpectations($state); |
||||
|
} |
||||
|
|
||||
|
function testCleanUpOldArticlesWithUnlimitedUnreadRetention() { |
||||
|
Arsse::$conf->retainArticlesUnread = ""; |
||||
|
Arsse::$db->articleCleanup(); |
||||
|
$state = $this->primeExpectations($this->data, [ |
||||
|
'arsse_articles' => ["id"] |
||||
|
]); |
||||
|
foreach([9] as $id) { |
||||
|
unset($state['arsse_articles']['rows'][$id - 1]); |
||||
|
} |
||||
|
$this->compareExpectations($state); |
||||
|
} |
||||
|
|
||||
|
function testCleanUpOldArticlesWithUnlimitedRetention() { |
||||
|
Arsse::$conf->retainArticlesRead = ""; |
||||
|
Arsse::$conf->retainArticlesUnread = ""; |
||||
|
Arsse::$db->articleCleanup(); |
||||
|
$state = $this->primeExpectations($this->data, [ |
||||
|
'arsse_articles' => ["id"] |
||||
|
]); |
||||
|
$this->compareExpectations($state); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue