Fix feed ordering (#4841)

Before, the feeds were not ordered every time there was a change in the category
feed list. This behavior was causing discrepancies in the displayed list.
Now, the feeds are ordered every time there is a change in the category feed list.

See #4790
This commit is contained in:
Alexis Degrugillier
2022-11-20 08:50:27 -05:00
committed by GitHub
parent 77c214c83c
commit 02b906549e
2 changed files with 60 additions and 3 deletions

View File

@@ -103,9 +103,7 @@ class FreshRSS_Category extends Minz_Model {
$this->hasFeedsWithError |= $feed->inError();
}
usort($this->feeds, function ($a, $b) {
return strnatcasecmp($a->name(), $b->name());
});
$this->sortFeeds();
}
return $this->feeds;
@@ -144,6 +142,7 @@ class FreshRSS_Category extends Minz_Model {
}
$this->feeds = $values;
$this->sortFeeds();
}
/**
@@ -155,6 +154,8 @@ class FreshRSS_Category extends Minz_Model {
$this->feeds = [];
}
$this->feeds[] = $feed;
$this->sortFeeds();
}
public function _attributes($key, $value) {
@@ -245,4 +246,10 @@ class FreshRSS_Category extends Minz_Model {
return $ok;
}
private function sortFeeds() {
usort($this->feeds, static function ($a, $b) {
return strnatcasecmp($a->name(), $b->name());
});
}
}

View File

@@ -30,4 +30,54 @@ class CategoryTest extends PHPUnit\Framework\TestCase {
);
}
public function test_feedOrdering() {
$feed_1 = $this->getMockBuilder(FreshRSS_Feed::class)
->disableOriginalConstructor()
->getMock();
$feed_1->expects($this->any())
->method('name')
->willReturn('AAA');
$feed_2 = $this->getMockBuilder(FreshRSS_Feed::class)
->disableOriginalConstructor()
->getMock();
$feed_2->expects($this->any())
->method('name')
->willReturn('ZZZ');
$feed_3 = $this->getMockBuilder(FreshRSS_Feed::class)
->disableOriginalConstructor()
->getMock();
$feed_3->expects($this->any())
->method('name')
->willReturn('lll');
$category = new FreshRSS_Category('test', [
$feed_1,
$feed_2,
$feed_3,
]);
$feeds = $category->feeds();
$this->assertCount(3, $feeds);
$this->assertEquals('AAA', $feeds[0]->name());
$this->assertEquals('lll', $feeds[1]->name());
$this->assertEquals('ZZZ', $feeds[2]->name());
$feed_4 = $this->getMockBuilder(FreshRSS_Feed::class)
->disableOriginalConstructor()
->getMock();
$feed_4->expects($this->any())
->method('name')
->willReturn('BBB');
$category->addFeed($feed_4);
$feeds = $category->feeds();
$this->assertCount(4, $feeds);
$this->assertEquals('AAA', $feeds[0]->name());
$this->assertEquals('BBB', $feeds[1]->name());
$this->assertEquals('lll', $feeds[2]->name());
$this->assertEquals('ZZZ', $feeds[3]->name());
}
}