Sort feed categories before serialization
A function is added for feeds and its categories normalization. The test will ensure that the order is right.
This commit is contained in:
parent
f783b135c7
commit
c840268678
2 changed files with 54 additions and 17 deletions
|
@ -8,6 +8,7 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
"sort"
|
||||||
|
|
||||||
"miniflux.app/logger"
|
"miniflux.app/logger"
|
||||||
)
|
)
|
||||||
|
@ -18,23 +19,7 @@ func Serialize(subscriptions SubcriptionList) string {
|
||||||
writer := bufio.NewWriter(&b)
|
writer := bufio.NewWriter(&b)
|
||||||
writer.WriteString(xml.Header)
|
writer.WriteString(xml.Header)
|
||||||
|
|
||||||
feeds := new(opml)
|
feeds := normalizeFeeds(subscriptions)
|
||||||
feeds.Version = "2.0"
|
|
||||||
for categoryName, subs := range groupSubscriptionsByFeed(subscriptions) {
|
|
||||||
category := outline{Text: categoryName}
|
|
||||||
|
|
||||||
for _, subscription := range subs {
|
|
||||||
category.Outlines = append(category.Outlines, outline{
|
|
||||||
Title: subscription.Title,
|
|
||||||
Text: subscription.Title,
|
|
||||||
FeedURL: subscription.FeedURL,
|
|
||||||
SiteURL: subscription.SiteURL,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
feeds.Outlines = append(feeds.Outlines, category)
|
|
||||||
}
|
|
||||||
|
|
||||||
encoder := xml.NewEncoder(writer)
|
encoder := xml.NewEncoder(writer)
|
||||||
encoder.Indent(" ", " ")
|
encoder.Indent(" ", " ")
|
||||||
if err := encoder.Encode(feeds); err != nil {
|
if err := encoder.Encode(feeds); err != nil {
|
||||||
|
@ -54,3 +39,31 @@ func groupSubscriptionsByFeed(subscriptions SubcriptionList) map[string]Subcript
|
||||||
|
|
||||||
return groups
|
return groups
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func normalizeFeeds(subscriptions SubcriptionList) *opml {
|
||||||
|
feeds := new(opml)
|
||||||
|
feeds.Version = "2.0"
|
||||||
|
|
||||||
|
groupedSubs := groupSubscriptionsByFeed(subscriptions)
|
||||||
|
var categories []string
|
||||||
|
for k := range groupedSubs {
|
||||||
|
categories = append(categories, k)
|
||||||
|
}
|
||||||
|
sort.Strings(categories)
|
||||||
|
|
||||||
|
for _, categoryName := range categories {
|
||||||
|
category := outline{Text: categoryName}
|
||||||
|
for _, subscription := range groupedSubs[categoryName] {
|
||||||
|
category.Outlines = append(category.Outlines, outline{
|
||||||
|
Title: subscription.Title,
|
||||||
|
Text: subscription.Title,
|
||||||
|
FeedURL: subscription.FeedURL,
|
||||||
|
SiteURL: subscription.SiteURL,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
feeds.Outlines = append(feeds.Outlines, category)
|
||||||
|
}
|
||||||
|
|
||||||
|
return feeds
|
||||||
|
}
|
||||||
|
|
|
@ -40,3 +40,27 @@ func TestSerialize(t *testing.T) {
|
||||||
t.Error("Serialized feed is incorrect")
|
t.Error("Serialized feed is incorrect")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNormalizedCategoriesOrder(t *testing.T) {
|
||||||
|
var orderTests = []struct {
|
||||||
|
naturalOrderName string
|
||||||
|
correctOrderName string
|
||||||
|
}{
|
||||||
|
{"Category 2", "Category 1"},
|
||||||
|
{"Category 3", "Category 2"},
|
||||||
|
{"Category 1", "Category 3"},
|
||||||
|
}
|
||||||
|
|
||||||
|
var subscriptions SubcriptionList
|
||||||
|
subscriptions = append(subscriptions, &Subcription{Title: "Feed 1", FeedURL: "http://example.org/feed/1", SiteURL: "http://example.org/1", CategoryName: orderTests[0].naturalOrderName})
|
||||||
|
subscriptions = append(subscriptions, &Subcription{Title: "Feed 2", FeedURL: "http://example.org/feed/2", SiteURL: "http://example.org/2", CategoryName: orderTests[1].naturalOrderName})
|
||||||
|
subscriptions = append(subscriptions, &Subcription{Title: "Feed 3", FeedURL: "http://example.org/feed/3", SiteURL: "http://example.org/3", CategoryName: orderTests[2].naturalOrderName})
|
||||||
|
|
||||||
|
feeds := normalizeFeeds(subscriptions)
|
||||||
|
|
||||||
|
for i, o := range orderTests {
|
||||||
|
if feeds.Outlines[i].Text != o.correctOrderName {
|
||||||
|
t.Fatalf("need %v, got %v", o.correctOrderName, feeds.Outlines[i].Text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue