mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-10 23:36:37 +08:00
feat: honor pinned libraries in Emby client Views order (#24)
Sort /Users/.../Views so libraries the user pinned on the web appear first for Infuse/Emby/Jellyfin clients. Unpinned libraries keep their existing sort_order / remote-mount order. Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: truewhile <truewhile@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"github.com/truewhile/MeBox/internal/model"
|
||||
)
|
||||
|
||||
func TestViewsOrdersPinnedLibrariesFirst(t *testing.T) {
|
||||
svc := newTestEmbyService(t)
|
||||
first := model.Library{Name: "AAA", Path: "/media/a", Type: "movie", Enabled: true, SortOrder: 0}
|
||||
second := model.Library{Name: "BBB", Path: "/media/b", Type: "movie", Enabled: true, SortOrder: 1}
|
||||
third := model.Library{Name: "CCC", Path: "/media/c", Type: "movie", Enabled: true, SortOrder: 2}
|
||||
for _, lib := range []*model.Library{&first, &second, &third} {
|
||||
if err := svc.repo.Library.Create(t.Context(), lib); err != nil {
|
||||
t.Fatalf("create library: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
user := &model.User{Username: "viewer", PasswordHash: "hash", Role: "user"}
|
||||
pinned, err := json.Marshal([]string{third.ID, first.ID})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
user.PinnedLibraryIDs = string(pinned)
|
||||
if err := svc.repo.User.Create(t.Context(), user); err != nil {
|
||||
t.Fatalf("create user: %v", err)
|
||||
}
|
||||
|
||||
views, err := svc.Views(t.Context(), user.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("Views: %v", err)
|
||||
}
|
||||
items := views["Items"].([]map[string]any)
|
||||
if len(items) != 3 {
|
||||
t.Fatalf("expected 3 views, got %d", len(items))
|
||||
}
|
||||
got := []string{items[0]["Id"].(string), items[1]["Id"].(string), items[2]["Id"].(string)}
|
||||
want := []string{third.ID, first.ID, second.ID}
|
||||
for i := range want {
|
||||
if got[i] != want[i] {
|
||||
t.Fatalf("Views order = %v, want %v", got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSortViewItemsByPinnedIDsKeepsUnpinnedOrder(t *testing.T) {
|
||||
items := []map[string]any{
|
||||
{"Id": "a", "Name": "A"},
|
||||
{"Id": "b", "Name": "B"},
|
||||
{"Id": "c", "Name": "C"},
|
||||
{"Id": "d", "Name": "D"},
|
||||
}
|
||||
sorted := sortViewItemsByPinnedIDs(items, []string{"c", "a"})
|
||||
got := make([]string, len(sorted))
|
||||
for i, item := range sorted {
|
||||
got[i] = item["Id"].(string)
|
||||
}
|
||||
want := []string{"c", "a", "b", "d"}
|
||||
for i := range want {
|
||||
if got[i] != want[i] {
|
||||
t.Fatalf("order = %v, want %v", got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user