update
Some checks failed
Pipeline: Test, Lint, Build / Get version info (push) Has been cancelled
Pipeline: Test, Lint, Build / Lint Go code (push) Has been cancelled
Pipeline: Test, Lint, Build / Test Go code (push) Has been cancelled
Pipeline: Test, Lint, Build / Test JS code (push) Has been cancelled
Pipeline: Test, Lint, Build / Lint i18n files (push) Has been cancelled
Pipeline: Test, Lint, Build / Check Docker configuration (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (darwin/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (darwin/arm64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/386) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v5) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v6) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v7) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (windows/386) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (windows/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Push to GHCR (push) Has been cancelled
Pipeline: Test, Lint, Build / Push to Docker Hub (push) Has been cancelled
Pipeline: Test, Lint, Build / Cleanup digest artifacts (push) Has been cancelled
Pipeline: Test, Lint, Build / Build Windows installers (push) Has been cancelled
Pipeline: Test, Lint, Build / Package/Release (push) Has been cancelled
Pipeline: Test, Lint, Build / Upload Linux PKG (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled
POEditor import / update-translations (push) Has been cancelled
Some checks failed
Pipeline: Test, Lint, Build / Get version info (push) Has been cancelled
Pipeline: Test, Lint, Build / Lint Go code (push) Has been cancelled
Pipeline: Test, Lint, Build / Test Go code (push) Has been cancelled
Pipeline: Test, Lint, Build / Test JS code (push) Has been cancelled
Pipeline: Test, Lint, Build / Lint i18n files (push) Has been cancelled
Pipeline: Test, Lint, Build / Check Docker configuration (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (darwin/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (darwin/arm64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/386) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v5) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v6) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v7) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (windows/386) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (windows/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Push to GHCR (push) Has been cancelled
Pipeline: Test, Lint, Build / Push to Docker Hub (push) Has been cancelled
Pipeline: Test, Lint, Build / Cleanup digest artifacts (push) Has been cancelled
Pipeline: Test, Lint, Build / Build Windows installers (push) Has been cancelled
Pipeline: Test, Lint, Build / Package/Release (push) Has been cancelled
Pipeline: Test, Lint, Build / Upload Linux PKG (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled
POEditor import / update-translations (push) Has been cancelled
This commit is contained in:
214
model/participants_test.go
Normal file
214
model/participants_test.go
Normal file
@@ -0,0 +1,214 @@
|
||||
package model_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
. "github.com/navidrome/navidrome/model"
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
var _ = Describe("Participants", func() {
|
||||
Describe("JSON Marshalling", func() {
|
||||
When("we have a valid Albums object", func() {
|
||||
var participants Participants
|
||||
BeforeEach(func() {
|
||||
participants = Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2")},
|
||||
RoleAlbumArtist: []Participant{_p("3", "AlbumArtist1"), _p("4", "AlbumArtist2")},
|
||||
}
|
||||
})
|
||||
|
||||
It("marshals correctly", func() {
|
||||
data, err := json.Marshal(participants)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
var afterConversion Participants
|
||||
err = json.Unmarshal(data, &afterConversion)
|
||||
Expect(err).To(BeNil())
|
||||
Expect(afterConversion).To(Equal(participants))
|
||||
})
|
||||
|
||||
It("returns unmarshal error when the role is invalid", func() {
|
||||
err := json.Unmarshal([]byte(`{"unknown": []}`), &participants)
|
||||
Expect(err).To(MatchError("invalid role: unknown"))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Describe("First", func() {
|
||||
var participants Participants
|
||||
BeforeEach(func() {
|
||||
participants = Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2")},
|
||||
RoleAlbumArtist: []Participant{_p("3", "AlbumArtist1"), _p("4", "AlbumArtist2")},
|
||||
}
|
||||
})
|
||||
It("returns the first artist of the role", func() {
|
||||
Expect(participants.First(RoleArtist)).To(Equal(Artist{ID: "1", Name: "Artist1"}))
|
||||
})
|
||||
It("returns an empty artist when the role is not present", func() {
|
||||
Expect(participants.First(RoleComposer)).To(Equal(Artist{}))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("Add", func() {
|
||||
var participants Participants
|
||||
BeforeEach(func() {
|
||||
participants = Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2")},
|
||||
}
|
||||
})
|
||||
It("adds the artist to the role", func() {
|
||||
participants.Add(RoleArtist, Artist{ID: "5", Name: "Artist5"})
|
||||
Expect(participants).To(Equal(Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2"), _p("5", "Artist5")},
|
||||
}))
|
||||
})
|
||||
It("creates a new role if it doesn't exist", func() {
|
||||
participants.Add(RoleComposer, Artist{ID: "5", Name: "Artist5"})
|
||||
Expect(participants).To(Equal(Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2")},
|
||||
RoleComposer: []Participant{_p("5", "Artist5")},
|
||||
}))
|
||||
})
|
||||
It("should not add duplicate artists", func() {
|
||||
participants.Add(RoleArtist, Artist{ID: "1", Name: "Artist1"})
|
||||
Expect(participants).To(Equal(Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2")},
|
||||
}))
|
||||
})
|
||||
It("adds the artist with and without subrole", func() {
|
||||
participants = Participants{}
|
||||
participants.Add(RolePerformer, Artist{ID: "3", Name: "Artist3"})
|
||||
participants.AddWithSubRole(RolePerformer, "SubRole", Artist{ID: "3", Name: "Artist3"})
|
||||
|
||||
artist3 := _p("3", "Artist3")
|
||||
artist3WithSubRole := artist3
|
||||
artist3WithSubRole.SubRole = "SubRole"
|
||||
|
||||
Expect(participants[RolePerformer]).To(HaveLen(2))
|
||||
Expect(participants).To(Equal(Participants{
|
||||
RolePerformer: []Participant{
|
||||
artist3,
|
||||
artist3WithSubRole,
|
||||
},
|
||||
}))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("Merge", func() {
|
||||
var participations1, participations2 Participants
|
||||
BeforeEach(func() {
|
||||
participations1 = Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Duplicated Artist")},
|
||||
RoleAlbumArtist: []Participant{_p("3", "AlbumArtist1"), _p("4", "AlbumArtist2")},
|
||||
}
|
||||
participations2 = Participants{
|
||||
RoleArtist: []Participant{_p("5", "Artist3"), _p("6", "Artist4"), _p("2", "Duplicated Artist")},
|
||||
RoleAlbumArtist: []Participant{_p("7", "AlbumArtist3"), _p("8", "AlbumArtist4")},
|
||||
}
|
||||
})
|
||||
It("merges correctly, skipping duplicated artists", func() {
|
||||
participations1.Merge(participations2)
|
||||
Expect(participations1).To(Equal(Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Duplicated Artist"), _p("5", "Artist3"), _p("6", "Artist4")},
|
||||
RoleAlbumArtist: []Participant{_p("3", "AlbumArtist1"), _p("4", "AlbumArtist2"), _p("7", "AlbumArtist3"), _p("8", "AlbumArtist4")},
|
||||
}))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("Hash", func() {
|
||||
It("should return the same hash for the same participants", func() {
|
||||
p1 := Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2")},
|
||||
RoleAlbumArtist: []Participant{_p("3", "AlbumArtist1"), _p("4", "AlbumArtist2")},
|
||||
}
|
||||
p2 := Participants{
|
||||
RoleArtist: []Participant{_p("2", "Artist2"), _p("1", "Artist1")},
|
||||
RoleAlbumArtist: []Participant{_p("4", "AlbumArtist2"), _p("3", "AlbumArtist1")},
|
||||
}
|
||||
Expect(p1.Hash()).To(Equal(p2.Hash()))
|
||||
})
|
||||
It("should return different hashes for different participants", func() {
|
||||
p1 := Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1")},
|
||||
}
|
||||
p2 := Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2")},
|
||||
}
|
||||
Expect(p1.Hash()).ToNot(Equal(p2.Hash()))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("All", func() {
|
||||
var participants Participants
|
||||
BeforeEach(func() {
|
||||
participants = Participants{
|
||||
RoleArtist: []Participant{_p("1", "Artist1"), _p("2", "Artist2")},
|
||||
RoleAlbumArtist: []Participant{_p("3", "AlbumArtist1"), _p("4", "AlbumArtist2")},
|
||||
RoleProducer: []Participant{_p("5", "Producer", "SortProducerName")},
|
||||
RoleComposer: []Participant{_p("1", "Artist1")},
|
||||
}
|
||||
})
|
||||
|
||||
Describe("All", func() {
|
||||
It("returns all artists found in the Participants", func() {
|
||||
artists := participants.AllArtists()
|
||||
Expect(artists).To(ConsistOf(
|
||||
Artist{ID: "1", Name: "Artist1"},
|
||||
Artist{ID: "2", Name: "Artist2"},
|
||||
Artist{ID: "3", Name: "AlbumArtist1"},
|
||||
Artist{ID: "4", Name: "AlbumArtist2"},
|
||||
Artist{ID: "5", Name: "Producer", SortArtistName: "SortProducerName"},
|
||||
))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("AllIDs", func() {
|
||||
It("returns all artist IDs found in the Participants", func() {
|
||||
ids := participants.AllIDs()
|
||||
Expect(ids).To(ConsistOf("1", "2", "3", "4", "5"))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("AllNames", func() {
|
||||
It("returns all artist names found in the Participants", func() {
|
||||
names := participants.AllNames()
|
||||
Expect(names).To(ConsistOf("Artist1", "Artist2", "AlbumArtist1", "AlbumArtist2",
|
||||
"Producer", "SortProducerName"))
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
var _ = Describe("ParticipantList", func() {
|
||||
Describe("Join", func() {
|
||||
It("joins the participants with the given separator", func() {
|
||||
list := ParticipantList{
|
||||
_p("1", "Artist 1"),
|
||||
_p("3", "Artist 2"),
|
||||
}
|
||||
list[0].SubRole = "SubRole"
|
||||
Expect(list.Join(", ")).To(Equal("Artist 1 (SubRole), Artist 2"))
|
||||
})
|
||||
|
||||
It("returns the sole participant if there is only one", func() {
|
||||
list := ParticipantList{_p("1", "Artist 1")}
|
||||
Expect(list.Join(", ")).To(Equal("Artist 1"))
|
||||
})
|
||||
|
||||
It("returns empty string if there are no participants", func() {
|
||||
var list ParticipantList
|
||||
Expect(list.Join(", ")).To(Equal(""))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
func _p(id, name string, sortName ...string) Participant {
|
||||
p := Participant{Artist: Artist{ID: id, Name: name}}
|
||||
if len(sortName) > 0 {
|
||||
p.Artist.SortArtistName = sortName[0]
|
||||
}
|
||||
return p
|
||||
}
|
||||
Reference in New Issue
Block a user