From bb70bcd91da156421d1abd5f81b0121f43814b5b Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Tue, 22 Jun 2021 14:17:22 +0800 Subject: [PATCH] test: add tests for EpubMetadataProvider.kt --- .../org/gotson/komga/domain/model/Author.kt | 16 +++ .../metadata/epub/EpubMetadataProviderTest.kt | 109 +++++++++++++++ komga/src/test/resources/epub/1979.opf | 78 +++++++++++ .../test/resources/epub/Panik im Paradies.opf | 128 ++++++++++++++++++ 4 files changed, 331 insertions(+) create mode 100644 komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProviderTest.kt create mode 100755 komga/src/test/resources/epub/1979.opf create mode 100644 komga/src/test/resources/epub/Panik im Paradies.opf diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/Author.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/Author.kt index a95fa3f3..25bbf916 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/Author.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/Author.kt @@ -8,4 +8,20 @@ class Author( val role = role.trim().toLowerCase() override fun toString(): String = "Author($name, $role)" + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Author) return false + + if (name != other.name) return false + if (role != other.role) return false + + return true + } + + override fun hashCode(): Int { + var result = name.hashCode() + result = 31 * result + role.hashCode() + return result + } } diff --git a/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProviderTest.kt b/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProviderTest.kt new file mode 100644 index 00000000..abd8a004 --- /dev/null +++ b/komga/src/test/kotlin/org/gotson/komga/infrastructure/metadata/epub/EpubMetadataProviderTest.kt @@ -0,0 +1,109 @@ +package org.gotson.komga.infrastructure.metadata.epub + +import io.mockk.every +import io.mockk.mockk +import org.apache.commons.validator.routines.ISBNValidator +import org.assertj.core.api.Assertions.assertThat +import org.gotson.komga.domain.model.Author +import org.gotson.komga.domain.model.BookWithMedia +import org.gotson.komga.domain.model.Media +import org.gotson.komga.domain.model.SeriesMetadata +import org.gotson.komga.domain.model.makeBook +import org.gotson.komga.infrastructure.mediacontainer.EpubExtractor +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test +import org.springframework.core.io.ClassPathResource +import java.time.LocalDate + +class EpubMetadataProviderTest { + + private val mockExtractor = mockk() + private val isbnValidator = ISBNValidator(true) + private val epubMetadataProvider = EpubMetadataProvider(mockExtractor, isbnValidator) + + private val book = makeBook("book") + private val media = Media( + status = Media.Status.READY, + mediaType = "application/epub+zip", + ) + + @Nested + inner class Book { + + @Test + fun `given epub 3 opf when getting book metadata then metadata patch is valid`() { + val opf = ClassPathResource("epub/Panik im Paradies.opf") + every { mockExtractor.getPackageFile(any()) } returns opf.file.readText() + + val patch = epubMetadataProvider.getBookMetadataFromBook(BookWithMedia(book, media)) + + with(patch!!) { + assertThat(title).isEqualTo("Panik im Paradies") + assertThat(summary).isEqualTo("Bereits im ersten Band \"Panik im Paradies\" machen die drei berühmten Detektive ihrem Namen alle Ehre. Eigentlich haben sie ja gerade Ferien. Doch dann treffen sie auf diesen schrulligen Kapitän Larsson, der sich einen kleinen Privatzoo mit exotischen Tieren hält. Als plötzlich alle Tiere an rätselhaften Infektionen erkranken und die Besucher ausbleiben, werden Justus, Peter und Bob neugierig. Schon bald merken sie, daß da jemand ein düsteres Geheimnis hütet...") + assertThat(releaseDate).isEqualTo(LocalDate.of(1999, 7, 31)) + assertThat(authors).containsExactlyInAnyOrder( + Author("Blanck, Ulf", "writer"), + Author("Editor, The", "editor"), + ) + assertThat(isbn).isEqualTo("9783440077894") + } + } + + @Test + fun `given epub 2 opf when getting book metadata then metadata patch is valid`() { + val opf = ClassPathResource("epub/1979.opf") + every { mockExtractor.getPackageFile(any()) } returns opf.file.readText() + + val patch = epubMetadataProvider.getBookMetadataFromBook(BookWithMedia(book, media)) + + with(patch!!) { + assertThat(title).isEqualTo("1979") + assertThat(summary).isEqualTo("Auf dem Weg nach Teheran sah ich aus dem Autofenster, mir wurde etwas übel und ich hielt mich an Christophers Knie fest. Sein Hosenbein war von den aufgeplatzten Blasen ganz naß. Wir fuhren an endlosen Reihen von Birken vorbei. Ich schlief.Später hielten wir an, um uns zu erfrischen. Ich trank ein Glas Tee, Christopher eine Limonade. Es wurde sehr rasch Nacht.Es gab einige Militärkontrollen, denn seit September herrschte Kriegsrecht, was ja eigentlich nichts zu bedeuten hatte in diesen Ländern, sagte Christopher. Wir wurden weitergewunken, einmal sah ich einen Arm, eine weiße Bandage darum und eine Taschenlampe, die uns ins Gesicht schien, dann ging es weiter.Die Luft war staubig, ab und zu roch es im Wagen nach Mais. Wir hatten nur zwei Kassetten dabei; wir hörten erst Blondie, dann Devo, dann wieder Blondie. Es waren Christophers Kassetten.CHRISTIAN KRACHT, 1966 geboren, ist Schweizer. Das Foto zeigt den Autor auf der Landstraße nach Tashigang, Tibet, Volksrepublik China.GESTALTUNG: PAUL BARNES UND PETER SAVILLEFOTO: ECKHART NICKEL") + assertThat(releaseDate).isEqualTo(LocalDate.of(101, 1, 1)) + assertThat(authors).containsExactlyInAnyOrder( + Author("Kracht, Christian", "writer"), + Author("Editor, The", "editor"), + ) + assertThat(isbn).isNull() + } + } + } + + @Nested + inner class Series { + + @Test + fun `given epub 3 opf when getting series metadata then metadata patch is valid`() { + val opf = ClassPathResource("epub/Panik im Paradies.opf") + every { mockExtractor.getPackageFile(any()) } returns opf.file.readText() + + val patch = epubMetadataProvider.getSeriesMetadataFromBook(BookWithMedia(book, media)) + + with(patch!!) { + assertThat(title).isEqualTo("Die drei ??? Kids") + assertThat(titleSort).isEqualTo("Die drei ??? Kids") + assertThat(readingDirection).isEqualTo(SeriesMetadata.ReadingDirection.RIGHT_TO_LEFT) + assertThat(publisher).isEqualTo("Kosmos") + assertThat(language).isEqualTo("de") + assertThat(genres).containsExactlyInAnyOrder("Kinder- und Jugendbücher") + } + } + + @Test + fun `given epub 2 opf when getting series metadata then metadata patch is valid`() { + val opf = ClassPathResource("epub/1979.opf") + every { mockExtractor.getPackageFile(any()) } returns opf.file.readText() + + val patch = epubMetadataProvider.getSeriesMetadataFromBook(BookWithMedia(book, media)) + + with(patch!!) { + assertThat(title).isNull() + assertThat(titleSort).isNull() + assertThat(readingDirection).isNull() + assertThat(publisher).isNull() + assertThat(language).isEqualTo("de") + assertThat(genres).isNull() + } + } + } +} diff --git a/komga/src/test/resources/epub/1979.opf b/komga/src/test/resources/epub/1979.opf new file mode 100755 index 00000000..ffd65bc7 --- /dev/null +++ b/komga/src/test/resources/epub/1979.opf @@ -0,0 +1,78 @@ + + + + de + + + calibre (2.10.0) [http://calibre-ebook.com] + <div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;">Auf dem Weg nach Teheran sah ich aus dem Autofenster, mir wurde etwas übel und ich hielt mich an Christophers Knie fest. Sein Hosenbein war von den aufgeplatzten Blasen ganz naß. Wir fuhren an endlosen Reihen von Birken vorbei. Ich schlief.</span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;"><br></span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;">Später hielten wir an, um uns zu erfrischen. Ich trank ein Glas Tee, Christopher eine Limonade. Es wurde sehr rasch Nacht.</span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;"><br></span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;">Es gab einige Militärkontrollen, denn seit September herrschte Kriegsrecht, was ja eigentlich nichts zu bedeuten hatte in diesen Ländern, sagte Christopher. Wir wurden weitergewunken, einmal sah ich einen Arm, eine weiße Bandage darum und eine Taschenlampe, die uns ins Gesicht schien, dann ging es weiter.</span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;"><br></span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;">Die Luft war staubig, ab und zu roch es im Wagen nach Mais. Wir hatten nur zwei Kassetten dabei; wir hörten erst Blondie, dann Devo, dann wieder Blondie. Es waren Christophers Kassetten.</span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;"><br></span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;"><br></span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;">CHRISTIAN KRACHT, 1966 geboren, ist Schweizer. Das Foto zeigt den Autor auf der Landstraße nach Tashigang, Tibet, Volksrepublik China.</span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;"><br></span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;">GESTALTUNG: PAUL BARNES UND PETER SAVILLE</span></font></div><div><font face="MS Shell Dlg 2, sans-serif"><span style="font-size: 14px;">FOTO: ECKHART NICKEL</span></font></div><div style="font-family: 'MS Shell Dlg 2', sans-serif; font-size: 14px;"><br></div></div> + Kracht, Christian + The Editor + + 84b3a7d8-eb3f-4fd8-ad65-4e3f75d019f9 + 84b3a7d8-eb3f-4fd8-ad65-4e3f75d019f9 + 0101-01-01T00:00:00+00:00 + 1979 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/komga/src/test/resources/epub/Panik im Paradies.opf b/komga/src/test/resources/epub/Panik im Paradies.opf new file mode 100644 index 00000000..b5159fbf --- /dev/null +++ b/komga/src/test/resources/epub/Panik im Paradies.opf @@ -0,0 +1,128 @@ + + + Panik im Paradies + Ulf Blanck + The Editor + goodreads:222735 + isbn:9783440077894 + calibre:255 + uuid:499def46-39dc-4e79-b474-d0ec12ea5dc5 + uuid:499def46-39dc-4e79-b474-d0ec12ea5dc5 + de + 1999-07-31T16:00:00+00:00 + <div> + <p>Bereits im ersten Band "Panik im Paradies" machen die drei berühmten Detektive ihrem Namen alle Ehre. Eigentlich haben sie ja gerade Ferien. Doch dann treffen sie auf diesen schrulligen Kapitän Larsson, der sich einen kleinen Privatzoo mit exotischen Tieren hält. Als plötzlich alle Tiere an rätselhaften Infektionen erkranken und die Besucher ausbleiben, werden Justus, Peter und Bob neugierig. Schon bald merken sie, daß da jemand ein düsteres Geheimnis hütet...</p></div> + Kosmos + Kinder- und Jugendbücher + main + Panik im Paradies + + 2020-08-09T08:40:58Z + 2021-06-19T08:20:33Z + aut + Blanck, Ulf + edt + Editor, The + 6 + Die drei ??? Kids + series + 1 + {"Ulf Blanck": ""} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +