mirror of
https://github.com/truewhile/MeBox.git
synced 2026-09-28 11:16:37 +08:00
e872223b4e
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>
67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|