Skip to content

Commit

Permalink
Fix correct date time in TMDB responses
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisKruegerDev committed Apr 5, 2024
1 parent 3f21183 commit 734b4d0
Show file tree
Hide file tree
Showing 9 changed files with 1,175 additions and 431 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package app.moviebase.tmdb.core

import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.TimeZone
import kotlinx.datetime.Instant
import kotlinx.datetime.toInstant
import kotlinx.datetime.toLocalDateTime
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
Expand All @@ -14,19 +12,19 @@ import kotlinx.serialization.encoding.Encoder
/**
* Custom serializer for handle the TMDB pattern: 2023-03-05 10:38:01 UTC
*/
internal class LocalDateTimeTmdbUtcSerializer : KSerializer<LocalDateTime> {
internal class TmdbInstantSerializer : KSerializer<Instant> {

override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor("LocalDateTime", PrimitiveKind.STRING)
PrimitiveSerialDescriptor("Instant", PrimitiveKind.STRING)

override fun deserialize(decoder: Decoder): LocalDateTime {
override fun deserialize(decoder: Decoder): Instant {
val string = decoder.decodeString()
val splits = string.split(" ")
val isoString = "${splits[0]}T${splits[1]}Z"
return isoString.toInstant().toLocalDateTime(TimeZone.currentSystemDefault())
return isoString.toInstant()
}

override fun serialize(encoder: Encoder, value: LocalDateTime) {
override fun serialize(encoder: Encoder, value: Instant) {
encoder.encodeString(value.toString())
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package app.moviebase.tmdb.model

import app.moviebase.tmdb.core.LocalDateTimeSerializer
import kotlinx.datetime.LocalDateTime
import app.moviebase.tmdb.core.TmdbInstantSerializer
import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand All @@ -15,11 +15,11 @@ data class Tmdb4ListMeta(
@SerialName("public") val publicInt: Int,
val name: String,
@SerialName("updated_at")
@Serializable(LocalDateTimeSerializer::class)
val updatedAt: LocalDateTime?,
@Serializable(TmdbInstantSerializer::class)
val updatedAt: Instant?,
@SerialName("created_at")
@Serializable(LocalDateTimeSerializer::class)
val createdAt: LocalDateTime?,
@Serializable(TmdbInstantSerializer::class)
val createdAt: Instant?,
@SerialName("sort_by") val sortBy: Int,
@SerialName("backdrop_path") val backdropPath: String? = null,
@SerialName("runtime") val runtime: Int? = null,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package app.moviebase.tmdb.model

import app.moviebase.tmdb.core.LocalDateTimeTmdbUtcSerializer
import app.moviebase.tmdb.core.TmdbInstantSerializer
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDateTime
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand All @@ -12,8 +13,8 @@ import kotlinx.serialization.Serializable
data class TmdbRequestToken(
@SerialName("success") val success: Boolean,
@SerialName("expires_at")
@Serializable(LocalDateTimeTmdbUtcSerializer::class)
val expiredAt: LocalDateTime?,
@Serializable(TmdbInstantSerializer::class)
val expiredAt: Instant?,
@SerialName("request_token") val requestToken: String
)

Expand All @@ -30,7 +31,7 @@ data class TmdbSession(
data class TmdbGuestSession(
@SerialName("success") val success: Boolean,
@SerialName("expires_at")
@Serializable(LocalDateTimeTmdbUtcSerializer::class)
val expiredAt: LocalDateTime?,
@Serializable(TmdbInstantSerializer::class)
val expiredAt: Instant?,
@SerialName("guest_session_id") val guestSessionId: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ package app.moviebase.tmdb.model

import app.moviebase.tmdb.image.TmdbImage
import app.moviebase.tmdb.core.LocalDateSerializer
import app.moviebase.tmdb.core.LocalDateTimeSerializer
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand Down Expand Up @@ -150,11 +149,9 @@ data class TmdbReleaseDates(
@Serializable
data class TmdbReleaseDate(
@SerialName("iso_639_1") val iso639: String? = null,
@SerialName("release_date")
@Serializable(LocalDateTimeSerializer::class)
val releaseDate: LocalDateTime?,
val certification: String? = null,
val type: TmdbReleaseType
@SerialName("release_date") val releaseDate: Instant?,
@SerialName("certification") val certification: String? = null,
@SerialName("type") val type: TmdbReleaseType
)

@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package app.moviebase.tmdb.api
import app.moviebase.tmdb.core.mockHttpClient
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import kotlinx.datetime.toInstant
import org.junit.jupiter.api.Test

class Tmdb4AccountApiTest {
Expand All @@ -22,6 +23,12 @@ class Tmdb4AccountApiTest {

assertThat(results).isNotNull()
assertThat(results.page).isEqualTo(1)
assertThat(results.totalResults).isEqualTo(20)
assertThat(results.results).isNotEmpty()

val result = results.results.first()
assertThat(result.id).isEqualTo(44676)
assertThat(result.updatedAt).isEqualTo("2021-11-20T19:26:52Z".toInstant())
assertThat(result.createdAt).isEqualTo("2018-01-08T18:03:08Z".toInstant())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import app.moviebase.tmdb.model.getReleaseDateBy
import app.moviebase.tmdb.model.getReleaseDatesBy
import app.moviebase.tmdb.core.mockHttpClient
import com.google.common.truth.Truth.assertThat
import kotlin.test.assertNotNull
import kotlinx.coroutines.test.runTest
import kotlinx.datetime.toInstant
import org.junit.jupiter.api.Test

class TmdbMoviesApiTest {
Expand All @@ -24,6 +26,8 @@ class TmdbMoviesApiTest {
to "movie/movie_images_10140.json",
"movie/607?language=en-US&append_to_response=external_ids,videos,release_dates,credits,reviews,content_ratings,watch/providers"
to "movie/movie_details_607.json",
"movie/526896?language=en-US&append_to_response=release_dates"
to "movie/movie_images_526896.json",
"movie/popular?page=1&language=en-US"
to "movie/movie_popular.json",
)
Expand Down Expand Up @@ -95,6 +99,31 @@ class TmdbMoviesApiTest {
assertThat(releaseDates).hasSize(5)
assertThat(releaseDate?.type).isEqualTo(TmdbReleaseType.THEATRICAL)
}
@Test
fun `it can serialize release dates correctly`() = runTest {
val movieDetails = classToTest.getDetails(
movieId = 526896,
language = "en-US",
appendResponses = listOf(
AppendResponse.RELEASES_DATES,
)
)

val releaseDates = movieDetails.releaseDates?.getReleaseDatesBy("US")
assertThat(releaseDates).hasSize(6)

val expectedReleaseDates = listOf(
"2022-04-01T00:00:00.000Z",
"2022-05-17T00:00:00.000Z",
"2022-09-07T00:00:00.000Z",
"2024-03-01T00:00:00.000Z",
"2022-06-14T00:00:00.000Z",
"2024-03-20T00:00:00.000Z"
).map { it.toInstant() }

val releaseDateInstants = releaseDates?.map { it.releaseDate }
assertThat(releaseDateInstants).isEqualTo(expectedReleaseDates)
}

@Test
fun `it can fetch popular movies`() = runTest {
Expand Down

0 comments on commit 734b4d0

Please sign in to comment.