From bb9a7fadc0546cf2571e79413747a12bb80db134 Mon Sep 17 00:00:00 2001 From: Alex Palaistras Date: Sun, 21 Jun 2020 18:31:14 +0100 Subject: [PATCH] Add tests for external album cover processing This implements basic tests for functionality related to loading and processing external album covers, both on the scanning size, and on the display side. --- engine/cover_test.go | 14 ++++++-- persistence/album_repository_test.go | 51 +++++++++++++++++++++++++++ tests/fixtures/cover.jpg | Bin 0 -> 26356 bytes 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/cover.jpg diff --git a/engine/cover_test.go b/engine/cover_test.go index 329bc6145..5a4944454 100644 --- a/engine/cover_test.go +++ b/engine/cover_test.go @@ -19,7 +19,7 @@ var _ = Describe("Cover", func() { BeforeEach(func() { ds = &persistence.MockDataStore{MockedTranscoding: &mockTranscodingRepository{}} - ds.Album(ctx).(*persistence.MockAlbum).SetData(`[{"id": "222", "coverArtId": "123"}, {"id": "333", "coverArtId": ""}]`) + ds.Album(ctx).(*persistence.MockAlbum).SetData(`[{"id": "222", "coverArtId": "123"}, {"id": "333", "coverArtId": ""}, {"id": "444", "coverArtId": "444", "coverArtPath": "tests/fixtures/cover.jpg"}]`) ds.MediaFile(ctx).(*persistence.MockMediaFile).SetData(`[{"id": "123", "path": "tests/fixtures/test.mp3", "hasCoverArt": true, "updatedAt":"2020-04-02T21:29:31.6377Z"}]`) }) @@ -58,11 +58,21 @@ var _ = Describe("Cover", func() { Expect(format).To(Equal("png")) }) - It("returns the default cover if album is not found", func() { + It("returns the external cover for the album", func() { buf := new(bytes.Buffer) Expect(cover.Get(ctx, "444", 0, buf)).To(BeNil()) + _, format, err := image.Decode(bytes.NewReader(buf.Bytes())) + Expect(err).To(BeNil()) + Expect(format).To(Equal("jpeg")) + }) + + It("returns the default cover if album is not found", func() { + buf := new(bytes.Buffer) + + Expect(cover.Get(ctx, "0101", 0, buf)).To(BeNil()) + _, format, err := image.Decode(bytes.NewReader(buf.Bytes())) Expect(err).To(BeNil()) Expect(format).To(Equal("png")) diff --git a/persistence/album_repository_test.go b/persistence/album_repository_test.go index a5f729089..d0d291745 100644 --- a/persistence/album_repository_test.go +++ b/persistence/album_repository_test.go @@ -2,8 +2,12 @@ package persistence import ( "context" + "io/ioutil" + "os" + "path/filepath" "github.com/astaxie/beego/orm" + "github.com/deluan/navidrome/conf" "github.com/deluan/navidrome/log" "github.com/deluan/navidrome/model" "github.com/deluan/navidrome/model/request" @@ -86,4 +90,51 @@ var _ = Describe("AlbumRepository", func() { Expect(getMinYear("2000 0 1800")).To(Equal(1800)) }) }) + + Describe("getCoverFromPath", func() { + testFolder, _ := ioutil.TempDir("", "album_persistence_tests") + if err := os.MkdirAll(testFolder, 0777); err != nil { + panic(err) + } + if _, err := os.Create(filepath.Join(testFolder, "Cover.jpeg")); err != nil { + panic(err) + } + if _, err := os.Create(filepath.Join(testFolder, "FRONT.PNG")); err != nil { + panic(err) + } + + testPath := filepath.Join(testFolder, "somefile.test") + It("returns audio file for embedded cover", func() { + conf.Server.CoverArtPriority = "embedded, cover.*, front.*" + Expect(getCoverFromPath(testPath, true)).To(Equal("")) + }) + + It("returns external file when no embedded cover exists", func() { + conf.Server.CoverArtPriority = "embedded, cover.*, front.*" + Expect(getCoverFromPath(testPath, false)).To(Equal(filepath.Join(testFolder, "Cover.jpeg"))) + }) + + It("returns embedded cover even if not first choice", func() { + conf.Server.CoverArtPriority = "something.png, embedded, cover.*, front.*" + Expect(getCoverFromPath(testPath, true)).To(Equal("")) + }) + + It("returns first correct match case-insensitively", func() { + conf.Server.CoverArtPriority = "embedded, cover.jpg, front.svg, front.png" + Expect(getCoverFromPath(testPath, false)).To(Equal(filepath.Join(testFolder, "FRONT.PNG"))) + }) + + It("returns match for embedded pattern", func() { + conf.Server.CoverArtPriority = "embedded, cover.jp?g, front.png" + Expect(getCoverFromPath(testPath, false)).To(Equal(filepath.Join(testFolder, "Cover.jpeg"))) + }) + + It("returns empty string if no match was found", func() { + conf.Server.CoverArtPriority = "embedded, cover.jpg, front.apng" + Expect(getCoverFromPath(testPath, false)).To(Equal("")) + }) + + // Reset configuration to default. + conf.Server.CoverArtPriority = "embedded, cover.*, front.*" + }) }) diff --git a/tests/fixtures/cover.jpg b/tests/fixtures/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6995905d7c3ddb75396dda0d953f3db3e3a172ad GIT binary patch literal 26356 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 z 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