From 3bbd1fb16b5b0b926d52dc5e44494ea9313fc31e Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Fri, 10 Nov 2017 21:31:48 +0100 Subject: [PATCH] Add methods to convert api share entity to domain entity. Signed-off-by: Yahor Berdnikau --- .../org/moire/ultrasonic/domain/Share.java | 39 +++++++++++++- .../ultrasonic/data/APIPlaylistConverter.kt | 5 +- .../ultrasonic/data/APIShareConverter.kt | 26 +++++++++ .../data/APIPlaylistConverterTest.kt | 6 +-- .../ultrasonic/data/APIShareConverterTest.kt | 54 +++++++++++++++++++ 5 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/APIShareConverter.kt create mode 100644 ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIShareConverterTest.kt diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/domain/Share.java b/ultrasonic/src/main/java/org/moire/ultrasonic/domain/Share.java index 3c5e5392..30111698 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/domain/Share.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/domain/Share.java @@ -7,8 +7,7 @@ import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; -public class Share implements Serializable -{ +public class Share implements Serializable { private static final long serialVersionUID = 1487561657691009668L; private static final Pattern urlPattern = Pattern.compile(".*/([^/?]+).*"); private String id; @@ -120,4 +119,40 @@ public class Share implements Serializable { entries.add(entry); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Share share = (Share) o; + + if (id != null ? !id.equals(share.id) : share.id != null) return false; + if (url != null ? !url.equals(share.url) : share.url != null) return false; + if (description != null ? !description.equals(share.description) : share.description != null) + return false; + if (username != null ? !username.equals(share.username) : share.username != null) + return false; + if (created != null ? !created.equals(share.created) : share.created != null) return false; + if (lastVisited != null ? !lastVisited.equals(share.lastVisited) : share.lastVisited != null) + return false; + if (expires != null ? !expires.equals(share.expires) : share.expires != null) return false; + if (visitCount != null ? !visitCount.equals(share.visitCount) : share.visitCount != null) + return false; + return entries != null ? entries.equals(share.entries) : share.entries == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (url != null ? url.hashCode() : 0); + result = 31 * result + (description != null ? description.hashCode() : 0); + result = 31 * result + (username != null ? username.hashCode() : 0); + result = 31 * result + (created != null ? created.hashCode() : 0); + result = 31 * result + (lastVisited != null ? lastVisited.hashCode() : 0); + result = 31 * result + (expires != null ? expires.hashCode() : 0); + result = 31 * result + (visitCount != null ? visitCount.hashCode() : 0); + result = 31 * result + (entries != null ? entries.hashCode() : 0); + return result; + } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/APIPlaylistConverter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/APIPlaylistConverter.kt index 1dfc0efb..28c6e678 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/APIPlaylistConverter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/APIPlaylistConverter.kt @@ -6,8 +6,11 @@ package org.moire.ultrasonic.data import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.domain.Playlist import java.text.SimpleDateFormat +import kotlin.LazyThreadSafetyMode.NONE import org.moire.ultrasonic.api.subsonic.models.Playlist as APIPlaylist +internal val playlistDateFormat by lazy(NONE) { SimpleDateFormat.getInstance() } + fun APIPlaylist.toMusicDirectoryDomainEntity(): MusicDirectory = MusicDirectory().apply { name = this@toMusicDirectoryDomainEntity.name addAll(this@toMusicDirectoryDomainEntity.entriesList.map { it.toDomainEntity() }) @@ -15,7 +18,7 @@ fun APIPlaylist.toMusicDirectoryDomainEntity(): MusicDirectory = MusicDirectory( fun APIPlaylist.toDomainEntity(): Playlist = Playlist(this.id.toString(), this.name, this.owner, this.comment, this.songCount.toString(), - this.created?.let { SimpleDateFormat.getDateTimeInstance().format(it.time) }, + this.created?.let { playlistDateFormat.format(it.time) }, public.toString()) fun List.toDomainEntitiesList(): List = this.map { it.toDomainEntity() } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/APIShareConverter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/APIShareConverter.kt new file mode 100644 index 00000000..c0275878 --- /dev/null +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/APIShareConverter.kt @@ -0,0 +1,26 @@ +// Contains helper method to convert subsonic api share to domain model +@file:JvmName("APIShareConverter") +package org.moire.ultrasonic.data + +import org.moire.ultrasonic.domain.Share +import java.text.SimpleDateFormat +import kotlin.LazyThreadSafetyMode.NONE +import org.moire.ultrasonic.api.subsonic.models.Share as APIShare + +internal val shareTimeFormat by lazy(NONE) { SimpleDateFormat.getInstance() } + +fun List.toDomainEntitiesList(): List = this.map { + it.toDomainEntity() +} + +fun APIShare.toDomainEntity(): Share = Share().apply { + created = this@toDomainEntity.created?.let { shareTimeFormat.format(it.time) } + description = this@toDomainEntity.description + expires = this@toDomainEntity.expires?.let { shareTimeFormat.format(it.time) } + id = this@toDomainEntity.id.toString() + lastVisited = this@toDomainEntity.lastVisited?.let { shareTimeFormat.format(it.time) } + url = this@toDomainEntity.url + username = this@toDomainEntity.username + visitCount = this@toDomainEntity.visitCount.toLong() + entries.addAll(this@toDomainEntity.items.toDomainEntityList()) +} diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIPlaylistConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIPlaylistConverterTest.kt index e04fc01a..4f1be508 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIPlaylistConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIPlaylistConverterTest.kt @@ -7,11 +7,10 @@ import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild import org.moire.ultrasonic.api.subsonic.models.Playlist -import java.text.SimpleDateFormat import java.util.Calendar /** - * Unit test for extension functions in [APIPlaylistConverter.kt] file. + * Unit test for extension functions that converts api playlist entity to domain. */ class APIPlaylistConverterTest { @Test @@ -47,8 +46,7 @@ class APIPlaylistConverterTest { owner `should equal to` entity.owner public `should equal to` entity.public songCount `should equal to` entity.songCount.toString() - created `should equal to` SimpleDateFormat.getDateTimeInstance() - .format(entity.created?.time) + created `should equal to` playlistDateFormat.format(entity.created?.time) } } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIShareConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIShareConverterTest.kt new file mode 100644 index 00000000..bd40d5f3 --- /dev/null +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIShareConverterTest.kt @@ -0,0 +1,54 @@ +@file:Suppress("IllegalIdentifier") + +package org.moire.ultrasonic.data + +import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should equal` +import org.junit.Test +import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild +import org.moire.ultrasonic.api.subsonic.models.Share +import java.util.Calendar + +/** + * Unit test for api to domain share entity converter functions. + */ +class APIShareConverterTest { + @Test + fun `Should convert share entity to domain`() { + val entity = createFakeShare() + + val domainEntity = entity.toDomainEntity() + + with(domainEntity) { + id `should equal to` entity.id.toString() + url `should equal to` entity.url + description `should equal to` entity.description + username `should equal to` entity.username + created `should equal to` shareTimeFormat.format(entity.created?.time) + lastVisited `should equal to` shareTimeFormat.format(entity.lastVisited?.time) + expires `should equal to` shareTimeFormat.format(entity.expires?.time) + visitCount `should equal to` entity.visitCount.toLong() + entries `should equal` entity.items.toDomainEntityList() + } + } + + private fun createFakeShare(): Share { + return Share(id = 45L, url = "some-long-url", username = "Bender", + created = Calendar.getInstance(), expires = Calendar.getInstance(), visitCount = 24, + description = "Kiss my shiny metal ass", lastVisited = Calendar.getInstance(), + items = listOf(MusicDirectoryChild())) + } + + @Test + fun `Should parse list of shares into domain entity list`() { + val entityList = listOf( + createFakeShare(), + createFakeShare().copy(id = 554L, lastVisited = null)) + + val domainEntityList = entityList.toDomainEntitiesList() + + domainEntityList.size `should equal to` entityList.size + domainEntityList[0] `should equal` entityList[0].toDomainEntity() + domainEntityList[1] `should equal` entityList[1].toDomainEntity() + } +}