From d5652296ea670103613ea39fa8996ed069097f2f Mon Sep 17 00:00:00 2001 From: "J. King" Date: Mon, 19 Sep 2022 13:06:19 -0400 Subject: [PATCH] Test feed reduplication --- tests/cases/Db/BaseUpdate.php | 70 ++++++++++++++++++++++++++++++++++- tests/lib/AbstractTest.php | 37 ++++++++---------- 2 files changed, 83 insertions(+), 24 deletions(-) diff --git a/tests/cases/Db/BaseUpdate.php b/tests/cases/Db/BaseUpdate.php index bcf93d5f..6c490253 100644 --- a/tests/cases/Db/BaseUpdate.php +++ b/tests/cases/Db/BaseUpdate.php @@ -207,12 +207,25 @@ QUERY_TEXT $this->drv->schemaUpdate(7); $this->drv->exec( <<drv->schemaUpdate(8); @@ -224,6 +237,14 @@ QUERY_TEXT ["b", "abc", 2, 0], ["c", "gfy", 5, 1], ] + ], + 'arsse_subscriptions' => [ + 'columns' => ["id", "owner", "url", "feed_title", "title", "folder", "last_mod", "etag", "next_fetch", "added", "source", "updated", "err_count", "err_msg", "size", "icon", "modified", "order_type", "pinned", "scrape", "keep_rule", "block_rule"], + 'rows' => [ + [1, "a", "https://example.com/rss", "Title 1", "User Title", null, "2001-06-13 06:56:23", '"ook"', "2001-06-13 06:57:23", "2002-02-02 00:02:03", "https://example.com/", "2001-06-13 06:55:23", 42, "Some error", 47, null, "2002-02-02 00:05:03", 2, 1, 0, "keep", "block"], + [4, "a", "https://example.net/rss", "Title 3", "Rosy Title", 1337, "2001-06-15 06:56:23", '"ack"', "2001-06-15 06:57:23", "2002-02-03 00:02:03", "https://example.net/", "2001-06-15 06:55:23", 44, "This error", 3, 12, "2002-02-03 00:05:03", 1, 0, 0, "meep", "bloop"], + [6, "c", "https://example.net/rss", "Title 3", null, 4400, "2001-06-15 06:56:23", '"ack"', "2001-06-15 06:57:23", "2002-02-04 00:02:03", "https://example.net/", "2001-06-15 06:55:23", 44, "This error", 3, 12, "2002-02-04 00:05:03", 2, 0, 1, null, null], + ] ] ]; $this->compareExpectations($this->drv, $exp); @@ -231,7 +252,35 @@ QUERY_TEXT } /* -CREATE TABLE "arsse_feeds"( + +create table arsse_subscriptions( +-- users' subscriptions to newsfeeds, with settings + id integer primary key, -- sequence number + owner text not null references arsse_users(id) on delete cascade on update cascade, -- owner of subscription + url text not null, -- URL of feed + feed_title text collate nocase, -- feed title + title text collate nocase, -- user-supplied title, which overrides the feed title when set + folder integer references arsse_folders(id) on delete cascade, -- TT-RSS category (nestable); the first-level category (which acts as Nextcloud folder) is joined in when needed + last_mod text, -- time at which the feed last actually changed at the foreign host + etag text not null default '', -- HTTP ETag hash used for cache validation, changes each time the content changes + next_fetch text, -- time at which the feed should next be fetched + added text not null default CURRENT_TIMESTAMP, -- time at which feed was added + source text, -- URL of site to which the feed belongs + updated text, -- time at which the feed was last fetched + err_count integer not null default 0, -- count of successive times update resulted in error since last successful update + err_msg text, -- last error message + size integer not null default 0, -- number of articles in the feed at last fetch + icon integer references arsse_icons(id) on delete set null, -- numeric identifier of any associated icon + modified text not null default CURRENT_TIMESTAMP, -- time at which subscription properties were last modified by the user + order_type int not null default 0, -- Nextcloud sort order + pinned int not null default 0, -- whether feed is pinned (always sorts at top) + scrape int not null default 0, -- whether the user has requested scraping content from source articles + keep_rule text, -- Regular expression the subscription's articles must match to avoid being hidden + block_rule text, -- Regular expression the subscription's articles must not match to avoid being hidden + unique(owner,url) -- a URL with particular credentials should only appear once +); + +create table arsse_feeds( -- newsfeeds, deduplicated -- users have subscriptions to these feeds in another table id integer primary key, -- sequence number @@ -251,4 +300,21 @@ CREATE TABLE "arsse_feeds"( icon integer references arsse_icons(id) on delete set null, -- numeric identifier of any associated icon unique(url,username,password) -- a URL with particular credentials should only appear once ) + +create table arsse_subscriptions( +-- users' subscriptions to newsfeeds, with settings + id integer primary key, -- sequence number + owner text not null references arsse_users(id) on delete cascade on update cascade, -- owner of subscription + feed integer not null references arsse_feeds(id) on delete cascade, -- feed for the subscription + added text not null default CURRENT_TIMESTAMP, -- time at which feed was added + modified text not null default CURRENT_TIMESTAMP, -- time at which subscription properties were last modified + title text collate nocase, -- user-supplied title + order_type int not null default 0, -- Nextcloud sort order + pinned boolean not null default 0, -- whether feed is pinned (always sorts at top) + folder integer references arsse_folders(id) on delete cascade, -- TT-RSS category (nestable); the first-level category (which acts as Nextcloud folder) is joined in when needed + keep_rule text default null, + block_rule text default null, + scape boolean not null default 0, + unique(owner,feed) -- a given feed should only appear once for a given owner +); */ \ No newline at end of file diff --git a/tests/lib/AbstractTest.php b/tests/lib/AbstractTest.php index a0d44070..0faaf16b 100644 --- a/tests/lib/AbstractTest.php +++ b/tests/lib/AbstractTest.php @@ -60,23 +60,6 @@ abstract class AbstractTest extends \PHPUnit\Framework\TestCase { 'expires' => "datetime", 'data' => "str", ], - 'arsse_feeds' => [ - 'id' => "int", - 'url' => "str", - 'title' => "str", - 'source' => "str", - 'updated' => "datetime", - 'modified' => "datetime", - 'next_fetch' => "datetime", - 'orphaned' => "datetime", - 'etag' => "str", - 'err_count' => "int", - 'err_msg' => "str", - 'username' => "str", - 'password' => "str", - 'size' => "int", - 'icon' => "int", - ], 'arsse_icons' => [ 'id' => "int", 'url' => "str", @@ -130,16 +113,26 @@ abstract class AbstractTest extends \PHPUnit\Framework\TestCase { 'arsse_subscriptions' => [ 'id' => "int", 'owner' => "str", - 'feed' => "int", - 'added' => "datetime", - 'modified' => "datetime", + 'url' => "str", + 'feed_title' => "str", 'title' => "str", + 'folder' => "int", + 'last_mod' => "datetime", + 'etag' => "str", + 'next_fetch' => "datetime", + 'added' => "datetime", + 'source' => "str", + 'updated' => "datetime", + 'err_count' => "int", + 'err_msg' => "str", + 'size' => "int", + 'icon' => "int", + 'modified' => "datetime", 'order_type' => "int", 'pinned' => "bool", - 'folder' => "int", + 'scrape' => "bool", 'keep_rule' => "str", 'block_rule' => "str", - 'scrape' => "bool", ], 'arsse_folders' => [ 'id' => "int",