From: ArthurHoaro Date: Sat, 10 Aug 2019 10:07:55 +0000 (+0200) Subject: Merge pull request #1350 from ArthurHoaro/hotfix/sort-consistency X-Git-Tag: v0.12.0-beta~48 X-Git-Url: https://git.immae.eu/?a=commitdiff_plain;h=14a7d73c2d65de496ef270f784de82c5f584cb3a;hp=edcfe54c45aedd186cf5092295767d85bf37b780;p=github%2Fshaarli%2FShaarli.git Merge pull request #1350 from ArthurHoaro/hotfix/sort-consistency Make sure that bookmark sort is consistent, even with equal timestamps --- diff --git a/application/bookmark/LinkDB.php b/application/bookmark/LinkDB.php index efde8468..f01c7ee6 100644 --- a/application/bookmark/LinkDB.php +++ b/application/bookmark/LinkDB.php @@ -102,7 +102,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess $isLoggedIn, $hidePublicLinks ) { - + $this->datastore = $datastore; $this->loggedIn = $isLoggedIn; $this->hidePublicLinks = $hidePublicLinks; @@ -415,7 +415,7 @@ You use the community supported version of the original Shaarli project, by Seba $visibility = 'all', $untaggedonly = false ) { - + // Filter link database according to parameters. $searchtags = isset($filterRequest['searchtags']) ? escape($filterRequest['searchtags']) : ''; $searchterm = isset($filterRequest['searchterm']) ? escape($filterRequest['searchterm']) : ''; @@ -533,6 +533,9 @@ You use the community supported version of the original Shaarli project, by Seba if (isset($a['sticky']) && isset($b['sticky']) && $a['sticky'] !== $b['sticky']) { return $a['sticky'] ? -1 : 1; } + if ($a['created'] == $b['created']) { + return $a['id'] < $b['id'] ? 1 * $order : -1 * $order; + } return $a['created'] < $b['created'] ? 1 * $order : -1 * $order; }); diff --git a/tests/bookmark/LinkDBTest.php b/tests/bookmark/LinkDBTest.php index 2990a6b5..5bbdcea1 100644 --- a/tests/bookmark/LinkDBTest.php +++ b/tests/bookmark/LinkDBTest.php @@ -619,4 +619,39 @@ class LinkDBTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expected, $tags, var_export($tags, true)); } + + /** + * Make sure that bookmarks with the same timestamp have a consistent order: + * if their creation date is equal, bookmarks are sorted by ID DESC. + */ + public function testConsistentOrder() + { + $nextId = 42; + $creation = DateTime::createFromFormat('Ymd_His', '20190807_130444'); + $linkDB = new LinkDB(self::$testDatastore, true, false); + for ($i = 0; $i < 4; ++$i) { + $linkDB[$nextId + $i] = [ + 'id' => $nextId + $i, + 'url' => 'http://'. $i, + 'created' => $creation, + 'title' => true, + 'description' => true, + 'tags' => true, + ]; + } + + // Check 4 new links 4 times + for ($i = 0; $i < 4; ++$i) { + $linkDB->save('tests'); + $linkDB = new LinkDB(self::$testDatastore, true, false); + $count = 3; + foreach ($linkDB as $link) { + $this->assertEquals($nextId + $count, $link['id']); + $this->assertEquals('http://'. $count, $link['url']); + if (--$count < 0) { + break; + } + } + } + } }