From 40e9b7f986c9ab3dde57f9db72f2fab4f052427a Mon Sep 17 00:00:00 2001 From: "J. King" Date: Wed, 29 Nov 2017 11:47:10 -0500 Subject: [PATCH] Changed all TTRSS outputs to match original types exactly; improves #125 --- lib/REST/TinyTinyRSS/API.php | 39 +++-- tests/REST/TinyTinyRSS/TestTinyTinyAPI.php | 162 +++++++++++---------- 2 files changed, 105 insertions(+), 96 deletions(-) diff --git a/lib/REST/TinyTinyRSS/API.php b/lib/REST/TinyTinyRSS/API.php index 406ef6d..d331121 100644 --- a/lib/REST/TinyTinyRSS/API.php +++ b/lib/REST/TinyTinyRSS/API.php @@ -227,7 +227,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { foreach (Arsse::$db->subscriptionList(Arsse::$user->id) as $sub) { $out += $sub['unread']; } - return ['unread' => $out]; + return ['unread' => (string) $out]; // string cast to be consistent with TTRSS } public function opGetCounters(array $data): array { @@ -254,7 +254,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { foreach (Arsse::$db->subscriptionList($user) as $f) { if ($f['unread']) { // add the feed to the list of feeds - $feeds[] = ['id' => $f['id'], 'updated' => Date::transform($f['updated'], "iso8601", "sql"),'counter' => $f['unread'], 'has_img' => (int) (strlen((string) $f['favicon']) > 0)]; + $feeds[] = ['id' => (string) $f['id'], 'updated' => Date::transform($f['updated'], "iso8601", "sql"),'counter' => $f['unread'], 'has_img' => (int) (strlen((string) $f['favicon']) > 0)]; // ID is cast to string for consistency with TTRSS // add the feed's unread count to the global unread count $countAll += $f['unread']; // add the feed's unread count to its category unread count @@ -492,6 +492,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $cats = Arsse::$db->folderList($user, null, $deep)->getAll(); $map = []; for ($a = 0; $a < sizeof($cats); $a++) { + $cats[$a]['id'] = (string) $cats[$a]['id']; // real categories have IDs as strings in TTRSS $map[$cats[$a]['id']] = $a; $cats[$a]['unread'] = 0; $cats[$a]['order'] = $a + 1; @@ -547,6 +548,10 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { // transform the result and return $out = []; for ($a = 0; $a < sizeof($cats); $a++) { + if ($cats[$a]['id']==-2) { + // the Labels category has its unread count as a string in TTRSS (don't ask me why) + settype($cats[$a]['unread'], "string"); + } $out[] = $this->fieldMapNames($cats[$a], [ 'id' => "id", 'title' => "name", @@ -563,7 +568,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { 'parent' => $data['parent_id'], ]; try { - return Arsse::$db->folderAdd(Arsse::$user->id, $in); + return (string) Arsse::$db->folderAdd(Arsse::$user->id, $in); // output is a string in TTRSS } catch (ExceptionInput $e) { switch ($e->getCode()) { case 10236: // folder already exists @@ -571,7 +576,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $folders = Arsse::$db->folderList(Arsse::$user->id, $in['parent'], false); foreach ($folders as $folder) { if ($folder['name']==$in['name']) { - return (int) $folder['id']; + return (string) ((int) $folder['id']); // output is a string in TTRSS } } return false; // @codeCoverageIgnore @@ -663,7 +668,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $out[] = [ 'id' => $this->labelOut($l['id']), 'title' => $l['name'], - 'unread' => $l['unread'], + 'unread' => (string) $l['unread'], // the unread count of labels is output as a string in TTRSS 'cat_id' => self::CAT_LABELS, ]; } @@ -681,7 +686,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $out[] = [ 'id' => self::FEED_STARRED, 'title' => Arsse::$lang->msg("API.TTRSS.Feed.Starred"), - 'unread' => $starred, + 'unread' => (string) $starred, // output is a string in TTRSS 'cat_id' => self::CAT_SPECIAL, ]; } @@ -689,7 +694,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $out[] = [ 'id' => self::FEED_PUBLISHED, 'title' => Arsse::$lang->msg("API.TTRSS.Feed.Published"), - 'unread' => $published, + 'unread' => (string) $published, // output is a string in TTRSS 'cat_id' => self::CAT_SPECIAL, ]; } @@ -697,7 +702,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $out[] = [ 'id' => self::FEED_FRESH, 'title' => Arsse::$lang->msg("API.TTRSS.Feed.Fresh"), - 'unread' => $fresh, + 'unread' => (string) $fresh, // output is a string in TTRSS 'cat_id' => self::CAT_SPECIAL, ]; } @@ -705,7 +710,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $out[] = [ 'id' => self::FEED_ALL, 'title' => Arsse::$lang->msg("API.TTRSS.Feed.All"), - 'unread' => $global, + 'unread' => (string) $global, // output is a string in TTRSS 'cat_id' => self::CAT_SPECIAL, ]; } @@ -713,7 +718,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $out[] = [ 'id' => self::FEED_READ, 'title' => Arsse::$lang->msg("API.TTRSS.Feed.Read"), - 'unread' => 0, // zero by definition + 'unread' => 0, // zero by definition; this one is -NOT- a string in TTRSS 'cat_id' => self::CAT_SPECIAL, ]; } @@ -721,7 +726,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $out[] = [ 'id' => self::FEED_ARCHIVED, 'title' => Arsse::$lang->msg("API.TTRSS.Feed.Archived"), - 'unread' => $archived, + 'unread' => (string) $archived, // output is a string in TTRSS 'cat_id' => self::CAT_SPECIAL, ]; } @@ -1170,7 +1175,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { $out = []; foreach (Arsse::$db->articleList(Arsse::$user->id, (new Context)->articles($articles)) as $article) { $out[] = [ - 'id' => $article['id'], + 'id' => (string) $article['id'], // string cast to be consistent with TTRSS 'guid' => $article['guid'] ? "SHA256:".$article['guid'] : null, 'title' => $article['title'], 'link' => $article['url'], @@ -1181,16 +1186,17 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { 'comments' => "", // FIXME: What is this? 'author' => $article['author'], 'updated' => Date::transform($article['edited_date'], "unix", "sql"), - 'feed_id' => $article['subscription'], + 'feed_id' => (string) $article['subscription'], // string cast to be consistent with TTRSS 'feed_title' => $article['subscription_title'], 'attachments' => $article['media_url'] ? [[ + 'id' => (string) 0, // string cast to be consistent with TTRSS; nonsense ID because we don't use them for enclosures 'content_url' => $article['media_url'], 'content_type' => $article['media_type'], 'title' => "", 'duration' => "", 'width' => "", 'height' => "", - 'post_id' => $article['id'], + 'post_id' => (string) $article['id'], // string cast to be consistent with TTRSS ]] : [], // TODO: We need to support multiple enclosures 'score' => 0, // score is not implemented as it is not modifiable from the TTRSS API 'note' => strlen((string) $article['note']) ? $article['note'] : null, @@ -1264,7 +1270,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { 'author' => $article['author'], 'updated' => Date::transform($article['edited_date'], "unix", "sql"), 'is_updated' => ($article['published_date'] < $article['edited_date']), - 'feed_id' => $article['subscription'], + 'feed_id' => (string) $article['subscription'], // string cast to be consistent with TTRSS 'feed_title' => $article['subscription_title'], 'score' => 0, // score is not implemented as it is not modifiable from the TTRSS API 'note' => strlen((string) $article['note']) ? $article['note'] : null, @@ -1286,13 +1292,14 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler { } if ($data['include_attachments']) { $row['attachments'] = $article['media_url'] ? [[ + 'id' => (string) 0, // string cast to be consistent with TTRSS; nonsense ID because we don't use them for enclosures 'content_url' => $article['media_url'], 'content_type' => $article['media_type'], 'title' => "", 'duration' => "", 'width' => "", 'height' => "", - 'post_id' => $article['id'], + 'post_id' => (string) $article['id'], // string cast to be consistent with TTRSS ]] : []; // TODO: We need to support multiple enclosures } $out[] = $row; diff --git a/tests/REST/TinyTinyRSS/TestTinyTinyAPI.php b/tests/REST/TinyTinyRSS/TestTinyTinyAPI.php index 9842b8f..39542ff 100644 --- a/tests/REST/TinyTinyRSS/TestTinyTinyAPI.php +++ b/tests/REST/TinyTinyRSS/TestTinyTinyAPI.php @@ -311,14 +311,14 @@ LONG_STRING; Phake::when(Arsse::$db)->folderAdd(Arsse::$user->id, ['name' => "", 'parent' => null])->thenThrow(new ExceptionInput("missing")); Phake::when(Arsse::$db)->folderAdd(Arsse::$user->id, ['name' => " ", 'parent' => null])->thenThrow(new ExceptionInput("whitespace")); // correctly add two folders - $exp = $this->respGood(2); + $exp = $this->respGood("2"); $this->assertResponse($exp, $this->req($in[0])); - $exp = $this->respGood(3); + $exp = $this->respGood("3"); $this->assertResponse($exp, $this->req($in[1])); // attempt to add the two folders again - $exp = $this->respGood(2); + $exp = $this->respGood("2"); $this->assertResponse($exp, $this->req($in[0])); - $exp = $this->respGood(3); + $exp = $this->respGood("3"); $this->assertResponse($exp, $this->req($in[1])); Phake::verify(Arsse::$db)->folderList(Arsse::$user->id, null, false); Phake::verify(Arsse::$db)->folderList(Arsse::$user->id, 1, false); @@ -633,7 +633,7 @@ LONG_STRING; ['id' => 2, 'unread' => 42], ['id' => 3, 'unread' => 47], ])); - $exp = $this->respGood(['unread' => (2112 + 42 + 47)]); + $exp = $this->respGood(['unread' => (string) (2112 + 42 + 47)]); $this->assertResponse($exp, $this->req($in)); } @@ -808,54 +808,54 @@ LONG_STRING; Phake::when(Arsse::$db)->articleStarred($this->anything())->thenReturn($this->starred); $exp = [ [ - ['id' => 5, 'title' => "Local", 'unread' => 10, 'order_id' => 1], - ['id' => 6, 'title' => "National", 'unread' => 18, 'order_id' => 2], - ['id' => 4, 'title' => "Photography", 'unread' => 0, 'order_id' => 3], - ['id' => 3, 'title' => "Politics", 'unread' => 0, 'order_id' => 4], - ['id' => 2, 'title' => "Rocketry", 'unread' => 5, 'order_id' => 5], - ['id' => 1, 'title' => "Science", 'unread' => 2, 'order_id' => 6], - ['id' => 0, 'title' => "Uncategorized", 'unread' => 0], - ['id' => -1, 'title' => "Special", 'unread' => 11], - ['id' => -2, 'title' => "Labels", 'unread' => 6], + ['id' => "5", 'title' => "Local", 'unread' => 10, 'order_id' => 1], + ['id' => "6", 'title' => "National", 'unread' => 18, 'order_id' => 2], + ['id' => "4", 'title' => "Photography", 'unread' => 0, 'order_id' => 3], + ['id' => "3", 'title' => "Politics", 'unread' => 0, 'order_id' => 4], + ['id' => "2", 'title' => "Rocketry", 'unread' => 5, 'order_id' => 5], + ['id' => "1", 'title' => "Science", 'unread' => 2, 'order_id' => 6], + ['id' => 0, 'title' => "Uncategorized", 'unread' => 0], + ['id' => -1, 'title' => "Special", 'unread' => 11], + ['id' => -2, 'title' => "Labels", 'unread' => "6"], ], [ - ['id' => 5, 'title' => "Local", 'unread' => 10, 'order_id' => 1], - ['id' => 6, 'title' => "National", 'unread' => 18, 'order_id' => 2], - ['id' => 3, 'title' => "Politics", 'unread' => 0, 'order_id' => 4], - ['id' => 2, 'title' => "Rocketry", 'unread' => 5, 'order_id' => 5], - ['id' => 1, 'title' => "Science", 'unread' => 2, 'order_id' => 6], - ['id' => 0, 'title' => "Uncategorized", 'unread' => 0], - ['id' => -1, 'title' => "Special", 'unread' => 11], - ['id' => -2, 'title' => "Labels", 'unread' => 6], + ['id' => "5", 'title' => "Local", 'unread' => 10, 'order_id' => 1], + ['id' => "6", 'title' => "National", 'unread' => 18, 'order_id' => 2], + ['id' => "3", 'title' => "Politics", 'unread' => 0, 'order_id' => 4], + ['id' => "2", 'title' => "Rocketry", 'unread' => 5, 'order_id' => 5], + ['id' => "1", 'title' => "Science", 'unread' => 2, 'order_id' => 6], + ['id' => 0, 'title' => "Uncategorized", 'unread' => 0], + ['id' => -1, 'title' => "Special", 'unread' => 11], + ['id' => -2, 'title' => "Labels", 'unread' => "6"], ], [ - ['id' => 5, 'title' => "Local", 'unread' => 10, 'order_id' => 1], - ['id' => 6, 'title' => "National", 'unread' => 18, 'order_id' => 2], - ['id' => 2, 'title' => "Rocketry", 'unread' => 5, 'order_id' => 5], - ['id' => 1, 'title' => "Science", 'unread' => 2, 'order_id' => 6], - ['id' => -1, 'title' => "Special", 'unread' => 11], - ['id' => -2, 'title' => "Labels", 'unread' => 6], + ['id' => "5", 'title' => "Local", 'unread' => 10, 'order_id' => 1], + ['id' => "6", 'title' => "National", 'unread' => 18, 'order_id' => 2], + ['id' => "2", 'title' => "Rocketry", 'unread' => 5, 'order_id' => 5], + ['id' => "1", 'title' => "Science", 'unread' => 2, 'order_id' => 6], + ['id' => -1, 'title' => "Special", 'unread' => 11], + ['id' => -2, 'title' => "Labels", 'unread' => "6"], ], [ - ['id' => 4, 'title' => "Photography", 'unread' => 0, 'order_id' => 1], - ['id' => 3, 'title' => "Politics", 'unread' => 28, 'order_id' => 2], - ['id' => 1, 'title' => "Science", 'unread' => 7, 'order_id' => 3], - ['id' => 0, 'title' => "Uncategorized", 'unread' => 0], - ['id' => -1, 'title' => "Special", 'unread' => 11], - ['id' => -2, 'title' => "Labels", 'unread' => 6], + ['id' => "4", 'title' => "Photography", 'unread' => 0, 'order_id' => 1], + ['id' => "3", 'title' => "Politics", 'unread' => 28, 'order_id' => 2], + ['id' => "1", 'title' => "Science", 'unread' => 7, 'order_id' => 3], + ['id' => 0, 'title' => "Uncategorized", 'unread' => 0], + ['id' => -1, 'title' => "Special", 'unread' => 11], + ['id' => -2, 'title' => "Labels", 'unread' => "6"], ], [ - ['id' => 3, 'title' => "Politics", 'unread' => 28, 'order_id' => 2], - ['id' => 1, 'title' => "Science", 'unread' => 7, 'order_id' => 3], - ['id' => 0, 'title' => "Uncategorized", 'unread' => 0], - ['id' => -1, 'title' => "Special", 'unread' => 11], - ['id' => -2, 'title' => "Labels", 'unread' => 6], + ['id' => "3", 'title' => "Politics", 'unread' => 28, 'order_id' => 2], + ['id' => "1", 'title' => "Science", 'unread' => 7, 'order_id' => 3], + ['id' => 0, 'title' => "Uncategorized", 'unread' => 0], + ['id' => -1, 'title' => "Special", 'unread' => 11], + ['id' => -2, 'title' => "Labels", 'unread' => "6"], ], [ - ['id' => 3, 'title' => "Politics", 'unread' => 28, 'order_id' => 2], - ['id' => 1, 'title' => "Science", 'unread' => 7, 'order_id' => 3], - ['id' => -1, 'title' => "Special", 'unread' => 11], - ['id' => -2, 'title' => "Labels", 'unread' => 6], + ['id' => "3", 'title' => "Politics", 'unread' => 28, 'order_id' => 2], + ['id' => "1", 'title' => "Science", 'unread' => 7, 'order_id' => 3], + ['id' => -1, 'title' => "Special", 'unread' => 11], + ['id' => -2, 'title' => "Labels", 'unread' => "6"], ], ]; for ($a = 0; $a < sizeof($in); $a++) { @@ -880,11 +880,11 @@ LONG_STRING; ['id' => -4, 'counter' => 35, 'auxcounter' => 0], ['id' => -1027, 'counter' => 6, 'auxcounter' => 100], ['id' => -1025, 'counter' => 0, 'auxcounter' => 2], - ['id' => 3, 'updated' => "2016-05-23T06:40:02", 'counter' => 2, 'has_img' => 1], - ['id' => 4, 'updated' => "2017-10-09T15:58:34", 'counter' => 6, 'has_img' => 1], - ['id' => 1, 'updated' => "2017-09-15T22:54:16", 'counter' => 5, 'has_img' => 0], - ['id' => 5, 'updated' => "2017-07-07T17:07:17", 'counter' => 12, 'has_img' => 0], - ['id' => 2, 'updated' => "2011-11-11T11:11:11", 'counter' => 10, 'has_img' => 1], + ['id' => "3", 'updated' => "2016-05-23T06:40:02", 'counter' => 2, 'has_img' => 1], + ['id' => "4", 'updated' => "2017-10-09T15:58:34", 'counter' => 6, 'has_img' => 1], + ['id' => "1", 'updated' => "2017-09-15T22:54:16", 'counter' => 5, 'has_img' => 0], + ['id' => "5", 'updated' => "2017-07-07T17:07:17", 'counter' => 12, 'has_img' => 0], + ['id' => "2", 'updated' => "2011-11-11T11:11:11", 'counter' => 10, 'has_img' => 1], ['id' => 5, 'kind' => "cat", 'counter' => 10], ['id' => 6, 'kind' => "cat", 'counter' => 18], ['id' => 3, 'kind' => "cat", 'counter' => 28], @@ -1096,24 +1096,24 @@ LONG_STRING; ['id' => 6, 'title' => 'Eurogamer', 'unread' => 0, 'cat_id' => 0, 'feed_url' => " http://example.com/6", 'has_icon' => true, 'last_updated' => 1266005327, 'order_id' => 1], ], [ - ['id' => -1, 'title' => "Starred articles", 'unread' => 4, 'cat_id' => -1], - ['id' => -2, 'title' => "Published articles", 'unread' => 0, 'cat_id' => -1], - ['id' => -3, 'title' => "Fresh articles", 'unread' => 7, 'cat_id' => -1], - ['id' => -4, 'title' => "All articles", 'unread' => 35, 'cat_id' => -1], - ['id' => -6, 'title' => "Recently read", 'unread' => 0, 'cat_id' => -1], - ['id' => 0, 'title' => "Archived articles", 'unread' => 0, 'cat_id' => -1], + ['id' => -1, 'title' => "Starred articles", 'unread' => "4", 'cat_id' => -1], + ['id' => -2, 'title' => "Published articles", 'unread' => "0", 'cat_id' => -1], + ['id' => -3, 'title' => "Fresh articles", 'unread' => "7", 'cat_id' => -1], + ['id' => -4, 'title' => "All articles", 'unread' => "35", 'cat_id' => -1], + ['id' => -6, 'title' => "Recently read", 'unread' => 0, 'cat_id' => -1], + ['id' => 0, 'title' => "Archived articles", 'unread' => "0", 'cat_id' => -1], ], [ - ['id' => -1, 'title' => "Starred articles", 'unread' => 4, 'cat_id' => -1], - ['id' => -3, 'title' => "Fresh articles", 'unread' => 7, 'cat_id' => -1], - ['id' => -4, 'title' => "All articles", 'unread' => 35, 'cat_id' => -1], + ['id' => -1, 'title' => "Starred articles", 'unread' => "4", 'cat_id' => -1], + ['id' => -3, 'title' => "Fresh articles", 'unread' => "7", 'cat_id' => -1], + ['id' => -4, 'title' => "All articles", 'unread' => "35", 'cat_id' => -1], ], [ - ['id' => -1027, 'title' => "Fascinating", 'unread' => 6, 'cat_id' => -2], - ['id' => -1025, 'title' => "Logical", 'unread' => 0, 'cat_id' => -2], + ['id' => -1027, 'title' => "Fascinating", 'unread' => "6", 'cat_id' => -2], + ['id' => -1025, 'title' => "Logical", 'unread' => "0", 'cat_id' => -2], ], [ - ['id' => -1027, 'title' => "Fascinating", 'unread' => 6, 'cat_id' => -2], + ['id' => -1027, 'title' => "Fascinating", 'unread' => "6", 'cat_id' => -2], ], [ ['id' => 3, 'title' => 'Ars Technica', 'unread' => 2, 'cat_id' => 1, 'feed_url' => " http://example.com/3", 'has_icon' => true, 'last_updated' => 1463985602, 'order_id' => 1], @@ -1131,14 +1131,14 @@ LONG_STRING; ['id' => 2, 'title' => 'Toronto Star', 'unread' => 10, 'cat_id' => 5, 'feed_url' => " http://example.com/2", 'has_icon' => true, 'last_updated' => 1321009871, 'order_id' => 6], ], [ - ['id' => -1027, 'title' => "Fascinating", 'unread' => 6, 'cat_id' => -2], - ['id' => -1025, 'title' => "Logical", 'unread' => 0, 'cat_id' => -2], - ['id' => -1, 'title' => "Starred articles", 'unread' => 4, 'cat_id' => -1], - ['id' => -2, 'title' => "Published articles", 'unread' => 0, 'cat_id' => -1], - ['id' => -3, 'title' => "Fresh articles", 'unread' => 7, 'cat_id' => -1], - ['id' => -4, 'title' => "All articles", 'unread' => 35, 'cat_id' => -1], - ['id' => -6, 'title' => "Recently read", 'unread' => 0, 'cat_id' => -1], - ['id' => 0, 'title' => "Archived articles", 'unread' => 0, 'cat_id' => -1], + ['id' => -1027, 'title' => "Fascinating", 'unread' => "6", 'cat_id' => -2], + ['id' => -1025, 'title' => "Logical", 'unread' => "0", 'cat_id' => -2], + ['id' => -1, 'title' => "Starred articles", 'unread' => "4", 'cat_id' => -1], + ['id' => -2, 'title' => "Published articles", 'unread' => "0", 'cat_id' => -1], + ['id' => -3, 'title' => "Fresh articles", 'unread' => "7", 'cat_id' => -1], + ['id' => -4, 'title' => "All articles", 'unread' => "35", 'cat_id' => -1], + ['id' => -6, 'title' => "Recently read", 'unread' => 0, 'cat_id' => -1], + ['id' => 0, 'title' => "Archived articles", 'unread' => "0", 'cat_id' => -1], ['id' => 3, 'title' => 'Ars Technica', 'unread' => 2, 'cat_id' => 1, 'feed_url' => " http://example.com/3", 'has_icon' => true, 'last_updated' => 1463985602, 'order_id' => 1], ['id' => 4, 'title' => 'CBC News', 'unread' => 6, 'cat_id' => 6, 'feed_url' => " http://example.com/4", 'has_icon' => true, 'last_updated' => 1507564714, 'order_id' => 2], ['id' => 6, 'title' => 'Eurogamer', 'unread' => 0, 'cat_id' => 0, 'feed_url' => " http://example.com/6", 'has_icon' => true, 'last_updated' => 1266005327, 'order_id' => 3], @@ -1147,10 +1147,10 @@ LONG_STRING; ['id' => 2, 'title' => 'Toronto Star', 'unread' => 10, 'cat_id' => 5, 'feed_url' => " http://example.com/2", 'has_icon' => true, 'last_updated' => 1321009871, 'order_id' => 6], ], [ - ['id' => -1027, 'title' => "Fascinating", 'unread' => 6, 'cat_id' => -2], - ['id' => -1, 'title' => "Starred articles", 'unread' => 4, 'cat_id' => -1], - ['id' => -3, 'title' => "Fresh articles", 'unread' => 7, 'cat_id' => -1], - ['id' => -4, 'title' => "All articles", 'unread' => 35, 'cat_id' => -1], + ['id' => -1027, 'title' => "Fascinating", 'unread' => "6", 'cat_id' => -2], + ['id' => -1, 'title' => "Starred articles", 'unread' => "4", 'cat_id' => -1], + ['id' => -3, 'title' => "Fresh articles", 'unread' => "7", 'cat_id' => -1], + ['id' => -4, 'title' => "All articles", 'unread' => "35", 'cat_id' => -1], ['id' => 3, 'title' => 'Ars Technica', 'unread' => 2, 'cat_id' => 1, 'feed_url' => " http://example.com/3", 'has_icon' => true, 'last_updated' => 1463985602, 'order_id' => 1], ['id' => 4, 'title' => 'CBC News', 'unread' => 6, 'cat_id' => 6, 'feed_url' => " http://example.com/4", 'has_icon' => true, 'last_updated' => 1507564714, 'order_id' => 2], ['id' => 1, 'title' => 'NASA JPL', 'unread' => 5, 'cat_id' => 2, 'feed_url' => " http://example.com/1", 'has_icon' => false, 'last_updated' => 1505516056, 'order_id' => 4], @@ -1307,7 +1307,7 @@ LONG_STRING; $this->assertResponse($exp, $this->req($in[3])); $exp = [ [ - 'id' => 101, + 'id' => "101", 'guid' => null, 'title' => 'Article title 1', 'link' => 'http://example.com/1', @@ -1318,7 +1318,7 @@ LONG_STRING; 'comments' => "", 'author' => '', 'updated' => strtotime('2000-01-01 00:00:01'), - 'feed_id' => 8, + 'feed_id' => "8", 'feed_title' => "Feed 11", 'attachments' => [], 'score' => 0, @@ -1327,7 +1327,7 @@ LONG_STRING; 'content' => '

Article content 1

', ], [ - 'id' => 102, + 'id' => "102", 'guid' => "SHA256:5be8a5a46ecd52ed132191c8d27fb1af6b3d4edc00234c5d9f8f0e10562ed3b7", 'title' => 'Article title 2', 'link' => 'http://example.com/2', @@ -1341,17 +1341,18 @@ LONG_STRING; 'comments' => "", 'author' => "J. King", 'updated' => strtotime('2000-01-02 00:00:02'), - 'feed_id' => 8, + 'feed_id' => "8", 'feed_title' => "Feed 11", 'attachments' => [ [ + 'id' => "0", 'content_url' => "http://example.com/text", 'content_type' => "text/plain", 'title' => "", 'duration' => "", 'width' => "", 'height' => "", - 'post_id' => 102, + 'post_id' => "102", ], ], 'score' => 0, @@ -1604,13 +1605,14 @@ LONG_STRING; $test = $this->req($in[2]); $exp = [ [ + 'id' => "0", 'content_url' => "http://example.com/text", 'content_type' => "text/plain", 'title' => "", 'duration' => "", 'width' => "", 'height' => "", - 'post_id' => 2112, + 'post_id' => "2112", ], ]; $this->assertArrayHasKey("attachments", $test->payload['content'][0]); @@ -1742,7 +1744,7 @@ LONG_STRING; 'author' => '', 'updated' => strtotime('2000-01-01 00:00:00'), 'is_updated' => false, - 'feed_id' => 12, + 'feed_id' => "12", 'feed_title' => "Feed 2112", 'score' => 0, 'note' => null, @@ -1766,7 +1768,7 @@ LONG_STRING; 'author' => "J. King", 'updated' => strtotime('2000-01-02 00:00:02'), 'is_updated' => true, - 'feed_id' => 8, + 'feed_id' => "8", 'feed_title' => "Feed 11", 'score' => 0, 'note' => "Note 2",