diff --git a/lib/Database.php b/lib/Database.php index ca1246d..2bed918 100644 --- a/lib/Database.php +++ b/lib/Database.php @@ -1104,7 +1104,7 @@ class Database { $icon = $icon['id']; } else { // add the new icon to the cache - $icon = $this->db->prepare("INSERT INTO arsee_icons(url, type, data) values(?, ?, ?", "str", "str", "blob")->run($feed->iconUrl, $feed->iconType, $feed->iconData)->lastId(); + $icon = $this->db->prepare("INSERT INTO arsse_icons(url, type, data) values(?, ?, ?)", "str", "str", "blob")->run($feed->iconUrl, $feed->iconType, $feed->iconData)->lastId(); } } // actually perform updates @@ -1258,9 +1258,9 @@ class Database { * @param string $url The URL of the icon to Retrieve * @param bool $withData Whether to return the icon content along with the metadata */ - protected function iconGetByUrl(string $url, bool $withData = true): array { + protected function iconGetByUrl(string $url, bool $withData = true): ?array { $data = $withData ? "data" : "null as data"; - return $this->db->prepare("SELECT id, url, type, $data, next_fetch from arsse_icons where url = ?", "str")->run($id)->getRow(); + return $this->db->prepare("SELECT id, url, type, $data, next_fetch from arsse_icons where url = ?", "str")->run($url)->getRow(); } diff --git a/tests/cases/Database/SeriesFeed.php b/tests/cases/Database/SeriesFeed.php index 1eb23bb..f79c8cc 100644 --- a/tests/cases/Database/SeriesFeed.php +++ b/tests/cases/Database/SeriesFeed.php @@ -26,6 +26,20 @@ trait SeriesFeed { ["john.doe@example.com", "",2], ], ], + 'arsse_icons' => [ + 'columns' => [ + 'id' => "int", + 'url' => "str", + 'type' => "str", + 'data' => "blob", + ], + 'rows' => [ + [1,'http://localhost:8000/Icon/PNG','image/png',base64_decode("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMjHxIGmVAAAADUlEQVQYV2NgYGBgAAAABQABijPjAAAAAABJRU5ErkJggg==")], + [2,'http://localhost:8000/Icon/GIF','image/gif',base64_decode("R0lGODlhAQABAIABAAAAAP///yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==")], + // this actually contains the data of SVG2, which will lead to a row update when retieved + [3,'http://localhost:8000/Icon/SVG1','image/svg+xml',''], + ], + ], 'arsse_feeds' => [ 'columns' => [ 'id' => "int", @@ -36,13 +50,19 @@ trait SeriesFeed { 'modified' => "datetime", 'next_fetch' => "datetime", 'size' => "int", + 'icon' => "int", ], 'rows' => [ - [1,"http://localhost:8000/Feed/Matching/3","Ook",0,"",$past,$past,0], - [2,"http://localhost:8000/Feed/Matching/1","Eek",5,"There was an error last time",$past,$future,0], - [3,"http://localhost:8000/Feed/Fetching/Error?code=404","Ack",0,"",$past,$now,0], - [4,"http://localhost:8000/Feed/NextFetch/NotModified?t=".time(),"Ooook",0,"",$past,$past,0], - [5,"http://localhost:8000/Feed/Parsing/Valid","Ooook",0,"",$past,$future,0], + [1,"http://localhost:8000/Feed/Matching/3","Ook",0,"",$past,$past,0,null], + [2,"http://localhost:8000/Feed/Matching/1","Eek",5,"There was an error last time",$past,$future,0,null], + [3,"http://localhost:8000/Feed/Fetching/Error?code=404","Ack",0,"",$past,$now,0,null], + [4,"http://localhost:8000/Feed/NextFetch/NotModified?t=".time(),"Ooook",0,"",$past,$past,0,null], + [5,"http://localhost:8000/Feed/Parsing/Valid","Ooook",0,"",$past,$future,0,null], + // these feeds all test icon caching + [6,"http://localhost:8000/Feed/WithIcon/PNG",null,0,"",$past,$future,0,1], // no change when updated + [7,"http://localhost:8000/Feed/WithIcon/GIF",null,0,"",$past,$future,0,1], // icon ID 2 will be assigned to feed when updated + [8,"http://localhost:8000/Feed/WithIcon/SVG1",null,0,"",$past,$future,0,3], // icon ID 3 will be modified when updated + [9,"http://localhost:8000/Feed/WithIcon/SVG2",null,0,"",$past,$future,0,null], // icon ID 4 will be created and assigned to feed when updated ], ], 'arsse_subscriptions' => [ @@ -261,4 +281,44 @@ trait SeriesFeed { Arsse::$db->feedUpdate(4); $this->assertEquals([1], Arsse::$db->feedListStale()); } + + public function testCheckIconDuringFeedUpdate(): void { + Arsse::$db->feedUpdate(6); + $state = $this->primeExpectations($this->data, [ + 'arsse_icons' => ["id","url","type","data"], + 'arsse_feeds' => ["id", "icon"], + ]); + $this->compareExpectations(static::$drv, $state); + } + + public function testAssignIconDuringFeedUpdate(): void { + Arsse::$db->feedUpdate(7); + $state = $this->primeExpectations($this->data, [ + 'arsse_icons' => ["id","url","type","data"], + 'arsse_feeds' => ["id", "icon"], + ]); + $state['arsse_feeds']['rows'][6][1] = 2; + $this->compareExpectations(static::$drv, $state); + } + + public function testChangeIconDuringFeedUpdate(): void { + Arsse::$db->feedUpdate(8); + $state = $this->primeExpectations($this->data, [ + 'arsse_icons' => ["id","url","type","data"], + 'arsse_feeds' => ["id", "icon"], + ]); + $state['arsse_icons']['rows'][2][3] = ''; + $this->compareExpectations(static::$drv, $state); + } + + public function testAddIconDuringFeedUpdate(): void { + Arsse::$db->feedUpdate(9); + $state = $this->primeExpectations($this->data, [ + 'arsse_icons' => ["id","url","type","data"], + 'arsse_feeds' => ["id", "icon"], + ]); + $state['arsse_feeds']['rows'][8][1] = 4; + $state['arsse_icons']['rows'][] = [4,'http://localhost:8000/Icon/SVG2','image/svg+xml','']; + $this->compareExpectations(static::$drv, $state); + } } diff --git a/tests/docroot/Feed/WithIcon/GIF.php b/tests/docroot/Feed/WithIcon/GIF.php index 8b81b58..ae3ce22 100644 --- a/tests/docroot/Feed/WithIcon/GIF.php +++ b/tests/docroot/Feed/WithIcon/GIF.php @@ -3,6 +3,9 @@ 'content' => << /Icon/GIF + + Example title + MESSAGE_BODY ]; diff --git a/tests/docroot/Feed/WithIcon/PNG.php b/tests/docroot/Feed/WithIcon/PNG.php index 3bca1c9..1e946d8 100644 --- a/tests/docroot/Feed/WithIcon/PNG.php +++ b/tests/docroot/Feed/WithIcon/PNG.php @@ -3,6 +3,9 @@ 'content' => << /Icon/PNG + + Example title + MESSAGE_BODY ]; diff --git a/tests/docroot/Feed/WithIcon/SVG1.php b/tests/docroot/Feed/WithIcon/SVG1.php index 5f5acc8..8bbabde 100644 --- a/tests/docroot/Feed/WithIcon/SVG1.php +++ b/tests/docroot/Feed/WithIcon/SVG1.php @@ -3,6 +3,9 @@ 'content' => << /Icon/SVG1 + + Example title + MESSAGE_BODY ]; diff --git a/tests/docroot/Feed/WithIcon/SVG2.php b/tests/docroot/Feed/WithIcon/SVG2.php index aca3c79..ce36bb7 100644 --- a/tests/docroot/Feed/WithIcon/SVG2.php +++ b/tests/docroot/Feed/WithIcon/SVG2.php @@ -3,6 +3,9 @@ 'content' => << /Icon/SVG2 + + Example title + MESSAGE_BODY ];