Files
wehub-resource-sync ead81af521
Deploy to GitHub Pages / deploy (push) Failing after 0s
CI / go (push) Has been cancelled
CI / build (darwin, macos-14) (push) Has been cancelled
CI / build (windows, windows-2025) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:13 +08:00

104 lines
2.9 KiB
Go

package mediactl
import (
"reflect"
"testing"
"time"
"github.com/godbus/dbus/v5"
"github.com/bjarneo/cliamp/internal/playback"
)
func TestMakeMetadataMapsPlaybackTrackToMPRISFields(t *testing.T) {
track := playback.Track{
Title: "Song",
Artist: "Artist",
Album: "Album",
Genre: "Ambient",
TrackNumber: 7,
URL: "file:///tmp/song.mp3",
ArtURL: "file:///tmp/cover.jpg",
Duration: 3*time.Minute + 15*time.Second,
}
got := makeMetadata(track, trackPath(1))
want := map[string]dbus.Variant{
"mpris:trackid": dbus.MakeVariant(dbus.ObjectPath("/org/mpris/MediaPlayer2/Track/1")),
"xesam:title": dbus.MakeVariant("Song"),
"xesam:artist": dbus.MakeVariant([]string{"Artist"}),
"xesam:album": dbus.MakeVariant("Album"),
"xesam:genre": dbus.MakeVariant([]string{"Ambient"}),
"xesam:trackNumber": dbus.MakeVariant(7),
"xesam:url": dbus.MakeVariant("file:///tmp/song.mp3"),
"mpris:artUrl": dbus.MakeVariant("file:///tmp/cover.jpg"),
"mpris:length": dbus.MakeVariant(track.Duration.Microseconds()),
}
if len(got) != len(want) {
t.Fatalf("metadata field count = %d, want %d", len(got), len(want))
}
for key, wantValue := range want {
gotValue, ok := got[key]
if !ok {
t.Fatalf("metadata missing key %q", key)
}
if !reflect.DeepEqual(gotValue, wantValue) {
t.Fatalf("metadata[%q] = %#v, want %#v", key, gotValue, wantValue)
}
}
}
func TestMakeMetadataOmitsEmptyOptionalFields(t *testing.T) {
got := makeMetadata(playback.Track{}, trackPath(1))
if len(got) != 1 {
t.Fatalf("metadata field count = %d, want 1", len(got))
}
if !reflect.DeepEqual(got["mpris:trackid"], dbus.MakeVariant(dbus.ObjectPath("/org/mpris/MediaPlayer2/Track/1"))) {
t.Fatalf("track id = %#v, want default track id", got["mpris:trackid"])
}
for _, key := range []string{
"xesam:title",
"xesam:artist",
"xesam:album",
"xesam:genre",
"xesam:trackNumber",
"xesam:url",
"mpris:artUrl",
"mpris:length",
} {
if _, ok := got[key]; ok {
t.Fatalf("metadata unexpectedly included %q", key)
}
}
}
func TestMakeMetadataCoercesInvalidDBusStrings(t *testing.T) {
track := playback.Track{
Title: "Suite N\xb01",
Artist: "Cello\xffArtist",
Album: "Album\x00Name",
Genre: "Classical\xfe",
URL: "file:///tmp/Cello\xff.mp3",
}
got := makeMetadata(track, trackPath(1))
want := map[string]dbus.Variant{
"mpris:trackid": dbus.MakeVariant(dbus.ObjectPath("/org/mpris/MediaPlayer2/Track/1")),
"xesam:title": dbus.MakeVariant("Suite N\uFFFD1"),
"xesam:artist": dbus.MakeVariant([]string{"Cello\uFFFDArtist"}),
"xesam:album": dbus.MakeVariant("AlbumName"),
"xesam:genre": dbus.MakeVariant([]string{"Classical\uFFFD"}),
"xesam:url": dbus.MakeVariant("file:///tmp/Cello\uFFFD.mp3"),
}
for key, wantValue := range want {
if !reflect.DeepEqual(got[key], wantValue) {
t.Fatalf("metadata[%q] = %#v, want %#v", key, got[key], wantValue)
}
}
}