From 8f874048f85391a81bc43a5a1587bfcd1721399b Mon Sep 17 00:00:00 2001 From: Mohsen Mirhoseini Date: Mon, 8 Jul 2024 09:58:24 +0200 Subject: [PATCH] Separate Character and Episode API Services (#66) --- .../mohsenoid/rickandmorty/data/DataModule.kt | 4 +- .../characters/CharacterRepositoryImpl.kt | 78 ++++++++++--------- .../characters/{ => db}/dao/CharacterDao.kt | 4 +- .../{ => db}/entity/CharacterEntity.kt | 2 +- .../data/characters/mapper/CharacterMapper.kt | 4 +- .../characters/remote/CharacterApiService.kt | 19 +++++ .../remote/model/CharacterRemoteModel.kt | 2 +- .../remote/model/CharactersResponse.kt | 2 +- .../remote/model/LocationRemoteModel.kt | 2 +- .../remote/model/OriginRemoteModel.kt | 2 +- .../rickandmorty/data/db/Database.kt | 8 +- .../data/episodes/EpisodeRepositoryImpl.kt | 41 +++++----- .../data/episodes/{ => db}/dao/EpisodeDao.kt | 4 +- .../episodes/{ => db}/entity/EpisodeEntity.kt | 2 +- .../data/episodes/mapper/EpisodeMapper.kt | 4 +- .../data/episodes/remote/EpisodeApiService.kt | 13 ++++ .../remote/model/EpisodeRemoteModel.kt | 2 +- .../remote/model/EpisodesResponse.kt | 2 +- .../remote/model/InfoRemoteModel.kt | 2 +- .../rickandmorty/data/remote/ApiService.kt | 26 ------- .../data/remote/ApiServiceProvider.kt | 46 +++++++++++ .../rickandmorty/data/remote/RemoteModule.kt | 47 +++-------- .../characters/CharacterRepositoryImplTest.kt | 30 +++---- .../data/characters/dao/CharacterDaoTest.kt | 1 + .../characters/mapper/CharacterMapperTest.kt | 8 +- .../episodes/EpisodeRepositoryImplTest.kt | 22 +++--- .../data/episodes/dao/EpisodeDaoTest.kt | 1 + .../GetEpisodesUseCaseIntegrationTest.kt | 2 +- .../util/CharacterEntityFactory.kt | 2 +- .../util/CharacterRemoteModelFactory.kt | 8 +- .../rickandmorty/util/EpisodeEntityFactory.kt | 2 +- .../util/EpisodeRemoteModelFactory.kt | 6 +- 32 files changed, 213 insertions(+), 185 deletions(-) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/{ => db}/dao/CharacterDao.kt (84%) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/{ => db}/entity/CharacterEntity.kt (92%) create mode 100644 app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/CharacterApiService.kt rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/{ => characters}/remote/model/CharacterRemoteModel.kt (92%) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/{ => characters}/remote/model/CharactersResponse.kt (51%) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/{ => characters}/remote/model/LocationRemoteModel.kt (75%) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/{ => characters}/remote/model/OriginRemoteModel.kt (74%) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/{ => db}/dao/EpisodeDao.kt (80%) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/{ => db}/entity/EpisodeEntity.kt (91%) create mode 100644 app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/EpisodeApiService.kt rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/{ => episodes}/remote/model/EpisodeRemoteModel.kt (88%) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/{ => episodes}/remote/model/EpisodesResponse.kt (78%) rename app/src/main/kotlin/com/mohsenoid/rickandmorty/data/{ => episodes}/remote/model/InfoRemoteModel.kt (82%) delete mode 100644 app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/ApiService.kt create mode 100644 app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/ApiServiceProvider.kt diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/DataModule.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/DataModule.kt index 136271e..77780d1 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/DataModule.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/DataModule.kt @@ -12,14 +12,14 @@ private val dataModule = module { single { EpisodeRepositoryImpl( - apiService = get(), + episodeApiService = get(), episodeDao = get(), ) } single { CharacterRepositoryImpl( - apiService = get(), + characterApiService = get(), characterDao = get(), ) } diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/CharacterRepositoryImpl.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/CharacterRepositoryImpl.kt index beedfe0..b0cda9a 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/CharacterRepositoryImpl.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/CharacterRepositoryImpl.kt @@ -1,10 +1,10 @@ package com.mohsenoid.rickandmorty.data.characters -import com.mohsenoid.rickandmorty.data.characters.dao.CharacterDao +import com.mohsenoid.rickandmorty.data.characters.db.dao.CharacterDao import com.mohsenoid.rickandmorty.data.characters.mapper.CharacterMapper.toCharacter import com.mohsenoid.rickandmorty.data.characters.mapper.CharacterMapper.toCharacterEntity -import com.mohsenoid.rickandmorty.data.remote.ApiService -import com.mohsenoid.rickandmorty.data.remote.model.CharacterRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.CharacterApiService +import com.mohsenoid.rickandmorty.data.characters.remote.model.CharacterRemoteModel import com.mohsenoid.rickandmorty.domain.NoInternetConnectionException import com.mohsenoid.rickandmorty.domain.characters.CharacterRepository import com.mohsenoid.rickandmorty.domain.characters.model.Character @@ -15,7 +15,7 @@ import java.net.UnknownHostException import java.util.SortedMap internal class CharacterRepositoryImpl( - private val apiService: ApiService, + private val characterApiService: CharacterApiService, private val characterDao: CharacterDao, ) : CharacterRepository { private val charactersCache: SortedMap = sortedMapOf() @@ -44,25 +44,26 @@ internal class CharacterRepositoryImpl( return getCharactersFromCache(charactersIds) } - private suspend fun getCharactersFromRemote(charactersIds: Set): Result> { - val missingCharactersIds = charactersIds - charactersCache.keys - val missingCharactersIdsString = missingCharactersIds.joinToString(",") - - return try { - val response = apiService.getCharacters(missingCharactersIdsString) - val remoteCharacters: List? = response.body() - if (response.isSuccessful && remoteCharacters != null) { - handleSuccessfulRemoteResponse(remoteCharacters) - getCharactersFromCache(charactersIds)!! // All characters should be cached - } else { - Result.failure(Exception(response.message().ifEmpty { "Unknown Error" })) + private suspend fun getCharactersFromRemote(charactersIds: Set): Result> = + withContext(Dispatchers.IO) { + val missingCharactersIds = charactersIds - charactersCache.keys + val missingCharactersIdsString = missingCharactersIds.joinToString(",") + + try { + val response = characterApiService.getCharacters(missingCharactersIdsString) + val remoteCharacters: List? = response.body() + if (response.isSuccessful && remoteCharacters != null) { + handleSuccessfulRemoteResponse(remoteCharacters) + getCharactersFromCache(charactersIds)!! // All characters should be cached + } else { + Result.failure(Exception(response.message().ifEmpty { "Unknown Error" })) + } + } catch (e: UnknownHostException) { + Result.failure(NoInternetConnectionException(e.message)) + } catch (e: SocketTimeoutException) { + Result.failure(NoInternetConnectionException(e.message)) } - } catch (e: UnknownHostException) { - Result.failure(NoInternetConnectionException(e.message)) - } catch (e: SocketTimeoutException) { - Result.failure(NoInternetConnectionException(e.message)) } - } private suspend fun handleSuccessfulRemoteResponse(remoteCharacters: List) { val charactersEntity = remoteCharacters.map { it.toCharacterEntity() } @@ -94,25 +95,26 @@ internal class CharacterRepositoryImpl( } } - private suspend fun getCharacterFromRemote(characterId: Int): Result { - return try { - val response = apiService.getCharacter(characterId) - val remoteCharacter: CharacterRemoteModel? = response.body() - if (response.isSuccessful && remoteCharacter != null) { - val characterEntity = remoteCharacter.toCharacterEntity() - characterDao.insertCharacter(characterEntity) - val character = characterEntity.toCharacter() - charactersCache += character.id to character - Result.success(character) - } else { - Result.failure(Exception(response.message().ifEmpty { "Unknown Error" })) + private suspend fun getCharacterFromRemote(characterId: Int): Result = + withContext(Dispatchers.IO) { + try { + val response = characterApiService.getCharacter(characterId) + val remoteCharacter: CharacterRemoteModel? = response.body() + if (response.isSuccessful && remoteCharacter != null) { + val characterEntity = remoteCharacter.toCharacterEntity() + characterDao.insertCharacter(characterEntity) + val character = characterEntity.toCharacter() + charactersCache += character.id to character + Result.success(character) + } else { + Result.failure(Exception(response.message().ifEmpty { "Unknown Error" })) + } + } catch (e: UnknownHostException) { + Result.failure(NoInternetConnectionException(e.message)) + } catch (e: SocketTimeoutException) { + Result.failure(NoInternetConnectionException(e.message)) } - } catch (e: UnknownHostException) { - Result.failure(NoInternetConnectionException(e.message)) - } catch (e: SocketTimeoutException) { - Result.failure(NoInternetConnectionException(e.message)) } - } override suspend fun updateCharacterStatus( characterId: Int, diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/dao/CharacterDao.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/db/dao/CharacterDao.kt similarity index 84% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/dao/CharacterDao.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/db/dao/CharacterDao.kt index b371e5f..87c0ad8 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/dao/CharacterDao.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/db/dao/CharacterDao.kt @@ -1,10 +1,10 @@ -package com.mohsenoid.rickandmorty.data.characters.dao +package com.mohsenoid.rickandmorty.data.characters.db.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.mohsenoid.rickandmorty.data.characters.entity.CharacterEntity +import com.mohsenoid.rickandmorty.data.characters.db.entity.CharacterEntity @Dao internal interface CharacterDao { diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/entity/CharacterEntity.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/db/entity/CharacterEntity.kt similarity index 92% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/entity/CharacterEntity.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/db/entity/CharacterEntity.kt index cba7ff6..6032528 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/entity/CharacterEntity.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/db/entity/CharacterEntity.kt @@ -1,4 +1,4 @@ -package com.mohsenoid.rickandmorty.data.characters.entity +package com.mohsenoid.rickandmorty.data.characters.db.entity import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/mapper/CharacterMapper.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/mapper/CharacterMapper.kt index 543f0c0..83acf3e 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/mapper/CharacterMapper.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/mapper/CharacterMapper.kt @@ -1,7 +1,7 @@ package com.mohsenoid.rickandmorty.data.characters.mapper -import com.mohsenoid.rickandmorty.data.characters.entity.CharacterEntity -import com.mohsenoid.rickandmorty.data.remote.model.CharacterRemoteModel +import com.mohsenoid.rickandmorty.data.characters.db.entity.CharacterEntity +import com.mohsenoid.rickandmorty.data.characters.remote.model.CharacterRemoteModel import com.mohsenoid.rickandmorty.domain.characters.model.Character internal object CharacterMapper { diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/CharacterApiService.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/CharacterApiService.kt new file mode 100644 index 0000000..6fdb485 --- /dev/null +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/CharacterApiService.kt @@ -0,0 +1,19 @@ +package com.mohsenoid.rickandmorty.data.characters.remote + +import com.mohsenoid.rickandmorty.data.characters.remote.model.CharacterRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.model.CharactersResponse +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Path + +internal interface CharacterApiService { + @GET("character/{characterIds}") + suspend fun getCharacters( + @Path("characterIds") characterIds: String, + ): Response + + @GET("character/{characterId}") + suspend fun getCharacter( + @Path("characterId") characterId: Int, + ): Response +} diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/CharacterRemoteModel.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/CharacterRemoteModel.kt similarity index 92% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/CharacterRemoteModel.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/CharacterRemoteModel.kt index 18ac1b8..159aea9 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/CharacterRemoteModel.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/CharacterRemoteModel.kt @@ -1,4 +1,4 @@ -package com.mohsenoid.rickandmorty.data.remote.model +package com.mohsenoid.rickandmorty.data.characters.remote.model import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/CharactersResponse.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/CharactersResponse.kt similarity index 51% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/CharactersResponse.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/CharactersResponse.kt index 0c7debf..4944272 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/CharactersResponse.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/CharactersResponse.kt @@ -1,3 +1,3 @@ -package com.mohsenoid.rickandmorty.data.remote.model +package com.mohsenoid.rickandmorty.data.characters.remote.model internal typealias CharactersResponse = List diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/LocationRemoteModel.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/LocationRemoteModel.kt similarity index 75% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/LocationRemoteModel.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/LocationRemoteModel.kt index eee3425..53065dc 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/LocationRemoteModel.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/LocationRemoteModel.kt @@ -1,4 +1,4 @@ -package com.mohsenoid.rickandmorty.data.remote.model +package com.mohsenoid.rickandmorty.data.characters.remote.model import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/OriginRemoteModel.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/OriginRemoteModel.kt similarity index 74% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/OriginRemoteModel.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/OriginRemoteModel.kt index a52976e..67ab7c8 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/OriginRemoteModel.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/characters/remote/model/OriginRemoteModel.kt @@ -1,4 +1,4 @@ -package com.mohsenoid.rickandmorty.data.remote.model +package com.mohsenoid.rickandmorty.data.characters.remote.model import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/db/Database.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/db/Database.kt index b21389e..d52bfee 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/db/Database.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/db/Database.kt @@ -2,10 +2,10 @@ package com.mohsenoid.rickandmorty.data.db import androidx.room.Database import androidx.room.RoomDatabase -import com.mohsenoid.rickandmorty.data.characters.dao.CharacterDao -import com.mohsenoid.rickandmorty.data.characters.entity.CharacterEntity -import com.mohsenoid.rickandmorty.data.episodes.dao.EpisodeDao -import com.mohsenoid.rickandmorty.data.episodes.entity.EpisodeEntity +import com.mohsenoid.rickandmorty.data.characters.db.dao.CharacterDao +import com.mohsenoid.rickandmorty.data.characters.db.entity.CharacterEntity +import com.mohsenoid.rickandmorty.data.episodes.db.dao.EpisodeDao +import com.mohsenoid.rickandmorty.data.episodes.db.entity.EpisodeEntity @Database( entities = [EpisodeEntity::class, CharacterEntity::class], diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/EpisodeRepositoryImpl.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/EpisodeRepositoryImpl.kt index d2f8079..f0a3729 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/EpisodeRepositoryImpl.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/EpisodeRepositoryImpl.kt @@ -1,10 +1,10 @@ package com.mohsenoid.rickandmorty.data.episodes -import com.mohsenoid.rickandmorty.data.episodes.dao.EpisodeDao +import com.mohsenoid.rickandmorty.data.episodes.db.dao.EpisodeDao import com.mohsenoid.rickandmorty.data.episodes.mapper.EpisodeMapper.toEpisode import com.mohsenoid.rickandmorty.data.episodes.mapper.EpisodeMapper.toEpisodeEntity -import com.mohsenoid.rickandmorty.data.remote.ApiService -import com.mohsenoid.rickandmorty.data.remote.model.EpisodeRemoteModel +import com.mohsenoid.rickandmorty.data.episodes.remote.EpisodeApiService +import com.mohsenoid.rickandmorty.data.episodes.remote.model.EpisodeRemoteModel import com.mohsenoid.rickandmorty.domain.EndOfListException import com.mohsenoid.rickandmorty.domain.NoInternetConnectionException import com.mohsenoid.rickandmorty.domain.episodes.EpisodeRepository @@ -16,7 +16,7 @@ import java.net.SocketTimeoutException import java.net.UnknownHostException internal class EpisodeRepositoryImpl( - private val apiService: ApiService, + private val episodeApiService: EpisodeApiService, private val episodeDao: EpisodeDao, ) : EpisodeRepository { private val episodesCache: MutableMap> = mutableMapOf() @@ -42,24 +42,25 @@ internal class EpisodeRepositoryImpl( } } - private suspend fun getEpisodesFromRemote(page: Int): Result> { - return try { - val response = apiService.getEpisodes(page) - val remoteEpisodes = response.body()?.results - if (response.isSuccessful && remoteEpisodes != null) { - handleSuccessfulRemoteResponse(page, remoteEpisodes) - getEpisodesFromCache(page)!! // All episodes should be cached - } else if (response.code() == HttpURLConnection.HTTP_NOT_FOUND && page != 0) { - Result.failure(EndOfListException()) - } else { - Result.failure(Exception(response.message().ifEmpty { "Unknown Error" })) + private suspend fun getEpisodesFromRemote(page: Int): Result> = + withContext(Dispatchers.IO) { + try { + val response = episodeApiService.getEpisodes(page) + val remoteEpisodes = response.body()?.results + if (response.isSuccessful && remoteEpisodes != null) { + handleSuccessfulRemoteResponse(page, remoteEpisodes) + getEpisodesFromCache(page)!! // All episodes should be cached + } else if (response.code() == HttpURLConnection.HTTP_NOT_FOUND && page != 0) { + Result.failure(EndOfListException()) + } else { + Result.failure(Exception(response.message().ifEmpty { "Unknown Error" })) + } + } catch (e: UnknownHostException) { + Result.failure(NoInternetConnectionException(e.message)) + } catch (e: SocketTimeoutException) { + Result.failure(NoInternetConnectionException(e.message)) } - } catch (e: UnknownHostException) { - Result.failure(NoInternetConnectionException(e.message)) - } catch (e: SocketTimeoutException) { - Result.failure(NoInternetConnectionException(e.message)) } - } private suspend fun handleSuccessfulRemoteResponse( page: Int, diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/dao/EpisodeDao.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/db/dao/EpisodeDao.kt similarity index 80% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/dao/EpisodeDao.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/db/dao/EpisodeDao.kt index d1e2770..532fa5c 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/dao/EpisodeDao.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/db/dao/EpisodeDao.kt @@ -1,10 +1,10 @@ -package com.mohsenoid.rickandmorty.data.episodes.dao +package com.mohsenoid.rickandmorty.data.episodes.db.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.mohsenoid.rickandmorty.data.episodes.entity.EpisodeEntity +import com.mohsenoid.rickandmorty.data.episodes.db.entity.EpisodeEntity @Dao internal interface EpisodeDao { diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/entity/EpisodeEntity.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/db/entity/EpisodeEntity.kt similarity index 91% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/entity/EpisodeEntity.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/db/entity/EpisodeEntity.kt index f6aa668..07904b3 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/entity/EpisodeEntity.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/db/entity/EpisodeEntity.kt @@ -1,4 +1,4 @@ -package com.mohsenoid.rickandmorty.data.episodes.entity +package com.mohsenoid.rickandmorty.data.episodes.db.entity import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/mapper/EpisodeMapper.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/mapper/EpisodeMapper.kt index 529a0e3..04a7090 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/mapper/EpisodeMapper.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/mapper/EpisodeMapper.kt @@ -1,7 +1,7 @@ package com.mohsenoid.rickandmorty.data.episodes.mapper -import com.mohsenoid.rickandmorty.data.episodes.entity.EpisodeEntity -import com.mohsenoid.rickandmorty.data.remote.model.EpisodeRemoteModel +import com.mohsenoid.rickandmorty.data.episodes.db.entity.EpisodeEntity +import com.mohsenoid.rickandmorty.data.episodes.remote.model.EpisodeRemoteModel import com.mohsenoid.rickandmorty.domain.episodes.model.Episode internal object EpisodeMapper { diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/EpisodeApiService.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/EpisodeApiService.kt new file mode 100644 index 0000000..83cdae9 --- /dev/null +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/EpisodeApiService.kt @@ -0,0 +1,13 @@ +package com.mohsenoid.rickandmorty.data.episodes.remote + +import com.mohsenoid.rickandmorty.data.episodes.remote.model.EpisodesResponse +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + +internal interface EpisodeApiService { + @GET("episode") + suspend fun getEpisodes( + @Query("page") page: Int, + ): Response +} diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/EpisodeRemoteModel.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/EpisodeRemoteModel.kt similarity index 88% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/EpisodeRemoteModel.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/EpisodeRemoteModel.kt index 95b70a6..b6abe7b 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/EpisodeRemoteModel.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/EpisodeRemoteModel.kt @@ -1,4 +1,4 @@ -package com.mohsenoid.rickandmorty.data.remote.model +package com.mohsenoid.rickandmorty.data.episodes.remote.model import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/EpisodesResponse.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/EpisodesResponse.kt similarity index 78% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/EpisodesResponse.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/EpisodesResponse.kt index 9d0fe13..7a3ed2b 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/EpisodesResponse.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/EpisodesResponse.kt @@ -1,4 +1,4 @@ -package com.mohsenoid.rickandmorty.data.remote.model +package com.mohsenoid.rickandmorty.data.episodes.remote.model import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/InfoRemoteModel.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/InfoRemoteModel.kt similarity index 82% rename from app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/InfoRemoteModel.kt rename to app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/InfoRemoteModel.kt index 22193bc..bd9c341 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/model/InfoRemoteModel.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/episodes/remote/model/InfoRemoteModel.kt @@ -1,4 +1,4 @@ -package com.mohsenoid.rickandmorty.data.remote.model +package com.mohsenoid.rickandmorty.data.episodes.remote.model import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/ApiService.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/ApiService.kt deleted file mode 100644 index 744a464..0000000 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/ApiService.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.mohsenoid.rickandmorty.data.remote - -import com.mohsenoid.rickandmorty.data.remote.model.CharacterRemoteModel -import com.mohsenoid.rickandmorty.data.remote.model.CharactersResponse -import com.mohsenoid.rickandmorty.data.remote.model.EpisodesResponse -import retrofit2.Response -import retrofit2.http.GET -import retrofit2.http.Path -import retrofit2.http.Query - -internal interface ApiService { - @GET("episode") - suspend fun getEpisodes( - @Query("page") page: Int, - ): Response - - @GET("character/{characterIds}") - suspend fun getCharacters( - @Path("characterIds") characterIds: String, - ): Response - - @GET("character/{characterId}") - suspend fun getCharacter( - @Path("characterId") characterId: Int, - ): Response -} diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/ApiServiceProvider.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/ApiServiceProvider.kt new file mode 100644 index 0000000..f145dc4 --- /dev/null +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/ApiServiceProvider.kt @@ -0,0 +1,46 @@ +package com.mohsenoid.rickandmorty.data.remote + +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import com.mohsenoid.rickandmorty.BuildConfig +import com.mohsenoid.rickandmorty.data.db.Database +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +internal object ApiServiceProvider { + private lateinit var instance: Retrofit + + fun getRetrofit(baseUrl: String): Retrofit { + if (!::instance.isInitialized) { + synchronized(Database::class.java) { + val gson: Gson = GsonBuilder().create() + + val gsonConverterFactory: GsonConverterFactory = GsonConverterFactory.create(gson) + + val logging: HttpLoggingInterceptor = + HttpLoggingInterceptor().apply { + level = + if (BuildConfig.DEBUG) { + HttpLoggingInterceptor.Level.BODY + } else { + HttpLoggingInterceptor.Level.NONE + } + } + + val httpClient = OkHttpClient.Builder() + httpClient.addInterceptor(logging) + val okHttpClient: OkHttpClient = httpClient.build() + + instance = + Retrofit.Builder() + .addConverterFactory(gsonConverterFactory) + .baseUrl(baseUrl) + .client(okHttpClient) + .build() + } + } + return instance + } +} diff --git a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/RemoteModule.kt b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/RemoteModule.kt index 90c4474..2883761 100644 --- a/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/RemoteModule.kt +++ b/app/src/main/kotlin/com/mohsenoid/rickandmorty/data/remote/RemoteModule.kt @@ -1,54 +1,25 @@ package com.mohsenoid.rickandmorty.data.remote -import com.google.gson.Gson -import com.google.gson.GsonBuilder import com.mohsenoid.rickandmorty.BASE_URL_QUALIFIER -import com.mohsenoid.rickandmorty.BuildConfig -import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor +import com.mohsenoid.rickandmorty.data.characters.remote.CharacterApiService +import com.mohsenoid.rickandmorty.data.episodes.remote.EpisodeApiService import org.koin.core.qualifier.named import org.koin.dsl.module -import retrofit2.Converter import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory internal val remoteModule = module { - single { - GsonBuilder().create() + single { + ApiServiceProvider.getRetrofit(get(named(BASE_URL_QUALIFIER))) } - single { - val gson: Gson = get() - GsonConverterFactory.create(gson) - } - - single { - val logging: HttpLoggingInterceptor = - HttpLoggingInterceptor().apply { - level = - if (BuildConfig.DEBUG) { - HttpLoggingInterceptor.Level.BODY - } else { - HttpLoggingInterceptor.Level.NONE - } - } - - val httpClient = OkHttpClient.Builder() - httpClient.addInterceptor(logging) - httpClient.build() - } - - single { - Retrofit.Builder() - .addConverterFactory(get()) - .baseUrl(get(named(BASE_URL_QUALIFIER))) - .client(get()) - .build() + single { + val retrofit: Retrofit = get() + retrofit.create(CharacterApiService::class.java) } - single { + single { val retrofit: Retrofit = get() - retrofit.create(ApiService::class.java) + retrofit.create(EpisodeApiService::class.java) } } diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/CharacterRepositoryImplTest.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/CharacterRepositoryImplTest.kt index 99ee0b7..c9c51a9 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/CharacterRepositoryImplTest.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/CharacterRepositoryImplTest.kt @@ -1,11 +1,11 @@ package com.mohsenoid.rickandmorty.data.characters -import com.mohsenoid.rickandmorty.data.characters.dao.CharacterDao -import com.mohsenoid.rickandmorty.data.characters.entity.CharacterEntity +import com.mohsenoid.rickandmorty.data.characters.db.dao.CharacterDao +import com.mohsenoid.rickandmorty.data.characters.db.entity.CharacterEntity import com.mohsenoid.rickandmorty.data.characters.mapper.CharacterMapper.toCharacter import com.mohsenoid.rickandmorty.data.characters.mapper.CharacterMapper.toCharacterEntity -import com.mohsenoid.rickandmorty.data.remote.ApiService -import com.mohsenoid.rickandmorty.data.remote.model.CharacterRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.CharacterApiService +import com.mohsenoid.rickandmorty.data.characters.remote.model.CharacterRemoteModel import com.mohsenoid.rickandmorty.domain.characters.CharacterRepository import com.mohsenoid.rickandmorty.domain.characters.model.Character import com.mohsenoid.rickandmorty.util.createCharacterEntity @@ -27,19 +27,19 @@ import kotlin.test.assertEquals import kotlin.test.assertTrue class CharacterRepositoryImplTest { - private lateinit var apiService: ApiService + private lateinit var characterApiService: CharacterApiService private lateinit var characterDao: CharacterDao private lateinit var repository: CharacterRepository @Before fun setUp() { - apiService = mockk() + characterApiService = mockk() characterDao = mockk() repository = CharacterRepositoryImpl( - apiService = apiService, + characterApiService = characterApiService, characterDao = characterDao, ) } @@ -58,7 +58,7 @@ class CharacterRepositoryImplTest { // THEN assertEquals(expectedCharacter, actualCharacter) coVerify(exactly = 1) { characterDao.getCharacter(any()) } - coVerify(exactly = 0) { apiService.getCharacter(any()) } + coVerify(exactly = 0) { characterApiService.getCharacter(any()) } } @Test @@ -74,7 +74,7 @@ class CharacterRepositoryImplTest { // THEN coVerify(exactly = 1) { characterDao.getCharacter(any()) } - coVerify(exactly = 0) { apiService.getCharacter(any()) } + coVerify(exactly = 0) { characterApiService.getCharacter(any()) } // WHEN val actualCharacter: Character? = repository.getCharacter(TEST_CHARACTER_ID).getOrNull() @@ -92,7 +92,7 @@ class CharacterRepositoryImplTest { val expectedCharacter: Character = characterEntity.toCharacter() coEvery { characterDao.getCharacter(TEST_CHARACTER_ID) } returns null coEvery { characterDao.insertCharacter(characterEntity) } just runs - coEvery { apiService.getCharacter(TEST_CHARACTER_ID) } returns Response.success(characterRemoteModel) + coEvery { characterApiService.getCharacter(TEST_CHARACTER_ID) } returns Response.success(characterRemoteModel) // WHEN val actualCharacter: Character? = repository.getCharacter(TEST_CHARACTER_ID).getOrNull() @@ -100,7 +100,7 @@ class CharacterRepositoryImplTest { // THEN assertEquals(expectedCharacter, actualCharacter) coVerify(exactly = 1) { characterDao.getCharacter(any()) } - coVerify(exactly = 1) { apiService.getCharacter(any()) } + coVerify(exactly = 1) { characterApiService.getCharacter(any()) } coVerify(exactly = 1) { characterDao.insertCharacter(any()) } } @@ -122,7 +122,7 @@ class CharacterRepositoryImplTest { // THEN assertContentEquals(expectedCharacters, actualCharacters) coVerify(exactly = 1) { characterDao.getCharacters(any()) } - coVerify(exactly = 0) { apiService.getCharacters(any()) } + coVerify(exactly = 0) { characterApiService.getCharacters(any()) } } @Test @@ -142,7 +142,7 @@ class CharacterRepositoryImplTest { // THEN coVerify(exactly = 1) { characterDao.getCharacters(any()) } - coVerify(exactly = 0) { apiService.getCharacters(any()) } + coVerify(exactly = 0) { characterApiService.getCharacters(any()) } // WHEN val actualCharacters: List? = repository.getCharacters(TEST_CHARACTERS_IDS.toSet()).getOrNull() @@ -171,7 +171,7 @@ class CharacterRepositoryImplTest { } val pendingCharactersIds = TEST_CHARACTERS_IDS - dbCharacters.map { it.id }.toSet() val pendingCharactersIdsString = pendingCharactersIds.joinToString(",") - coEvery { apiService.getCharacters(pendingCharactersIdsString) } returns Response.success(characterResponse) + coEvery { characterApiService.getCharacters(pendingCharactersIdsString) } returns Response.success(characterResponse) // WHEN val actualCharacters: List? = repository.getCharacters(TEST_CHARACTERS_IDS.toSet()).getOrNull() @@ -179,7 +179,7 @@ class CharacterRepositoryImplTest { // THEN assertContentEquals(expectedCharacters, actualCharacters) coVerify(exactly = 1) { characterDao.getCharacters(any()) } - coVerify(exactly = 1) { apiService.getCharacters(any()) } + coVerify(exactly = 1) { characterApiService.getCharacters(any()) } coVerify(exactly = TEST_CHARACTERS_SIZE) { characterDao.insertCharacter(any()) } } diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/dao/CharacterDaoTest.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/dao/CharacterDaoTest.kt index 2398d39..9c646d5 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/dao/CharacterDaoTest.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/dao/CharacterDaoTest.kt @@ -3,6 +3,7 @@ package com.mohsenoid.rickandmorty.data.characters.dao import android.content.Context import androidx.room.Room import androidx.test.core.app.ApplicationProvider +import com.mohsenoid.rickandmorty.data.characters.db.dao.CharacterDao import com.mohsenoid.rickandmorty.data.db.Database import com.mohsenoid.rickandmorty.util.MainDispatcherRule import com.mohsenoid.rickandmorty.util.createCharacterEntity diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/mapper/CharacterMapperTest.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/mapper/CharacterMapperTest.kt index 1a66b1d..28914ff 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/mapper/CharacterMapperTest.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/characters/mapper/CharacterMapperTest.kt @@ -1,11 +1,11 @@ package com.mohsenoid.rickandmorty.data.characters.mapper -import com.mohsenoid.rickandmorty.data.characters.entity.CharacterEntity +import com.mohsenoid.rickandmorty.data.characters.db.entity.CharacterEntity import com.mohsenoid.rickandmorty.data.characters.mapper.CharacterMapper.toCharacter import com.mohsenoid.rickandmorty.data.characters.mapper.CharacterMapper.toCharacterEntity -import com.mohsenoid.rickandmorty.data.remote.model.CharacterRemoteModel -import com.mohsenoid.rickandmorty.data.remote.model.LocationRemoteModel -import com.mohsenoid.rickandmorty.data.remote.model.OriginRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.model.CharacterRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.model.LocationRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.model.OriginRemoteModel import com.mohsenoid.rickandmorty.domain.characters.model.Character import kotlin.test.Test import kotlin.test.assertEquals diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/episodes/EpisodeRepositoryImplTest.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/episodes/EpisodeRepositoryImplTest.kt index 95c5dc6..13d3069 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/episodes/EpisodeRepositoryImplTest.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/episodes/EpisodeRepositoryImplTest.kt @@ -1,11 +1,11 @@ package com.mohsenoid.rickandmorty.data.episodes -import com.mohsenoid.rickandmorty.data.episodes.dao.EpisodeDao -import com.mohsenoid.rickandmorty.data.episodes.entity.EpisodeEntity +import com.mohsenoid.rickandmorty.data.episodes.db.dao.EpisodeDao +import com.mohsenoid.rickandmorty.data.episodes.db.entity.EpisodeEntity import com.mohsenoid.rickandmorty.data.episodes.mapper.EpisodeMapper.toEpisode import com.mohsenoid.rickandmorty.data.episodes.mapper.EpisodeMapper.toEpisodeEntity -import com.mohsenoid.rickandmorty.data.remote.ApiService -import com.mohsenoid.rickandmorty.data.remote.model.EpisodeRemoteModel +import com.mohsenoid.rickandmorty.data.episodes.remote.EpisodeApiService +import com.mohsenoid.rickandmorty.data.episodes.remote.model.EpisodeRemoteModel import com.mohsenoid.rickandmorty.domain.episodes.EpisodeRepository import com.mohsenoid.rickandmorty.domain.episodes.model.Episode import com.mohsenoid.rickandmorty.util.createEpisodeResponse @@ -23,19 +23,19 @@ import kotlin.test.Test import kotlin.test.assertContentEquals class EpisodeRepositoryImplTest { - private lateinit var apiService: ApiService + private lateinit var episodeApiService: EpisodeApiService private lateinit var episodeDao: EpisodeDao private lateinit var repository: EpisodeRepository @Before fun setUp() { - apiService = mockk() + episodeApiService = mockk() episodeDao = mockk() repository = EpisodeRepositoryImpl( - apiService = apiService, + episodeApiService = episodeApiService, episodeDao = episodeDao, ) } @@ -54,7 +54,7 @@ class EpisodeRepositoryImplTest { // THEN assertContentEquals(expectedEpisodes, actualEpisodes) coVerify(exactly = 1) { episodeDao.getEpisodes(any()) } - coVerify(exactly = 0) { apiService.getEpisodes(any()) } + coVerify(exactly = 0) { episodeApiService.getEpisodes(any()) } } @Test @@ -70,7 +70,7 @@ class EpisodeRepositoryImplTest { // THEN coVerify(exactly = 1) { episodeDao.getEpisodes(any()) } - coVerify(exactly = 0) { apiService.getEpisodes(any()) } + coVerify(exactly = 0) { episodeApiService.getEpisodes(any()) } // WHEN val actualEpisodes: List? = repository.getEpisodes(TEST_PAGE).getOrNull() @@ -93,7 +93,7 @@ class EpisodeRepositoryImplTest { episodeEntities.forEach { episodeEntity -> coEvery { episodeDao.insertEpisode(episodeEntity) } just runs } - coEvery { apiService.getEpisodes(TEST_PAGE) } returns Response.success(episodeResponse) + coEvery { episodeApiService.getEpisodes(TEST_PAGE) } returns Response.success(episodeResponse) // WHEN val actualEpisodes: List? = repository.getEpisodes(TEST_PAGE).getOrNull() @@ -101,7 +101,7 @@ class EpisodeRepositoryImplTest { // THEN assertContentEquals(expectedEpisodes, actualEpisodes) coVerify(exactly = 1) { episodeDao.getEpisodes(any()) } - coVerify(exactly = 1) { apiService.getEpisodes(any()) } + coVerify(exactly = 1) { episodeApiService.getEpisodes(any()) } coVerify(exactly = TEST_EPISODES_SIZE) { episodeDao.insertEpisode(any()) } } diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/episodes/dao/EpisodeDaoTest.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/episodes/dao/EpisodeDaoTest.kt index 3887c7d..96aab40 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/episodes/dao/EpisodeDaoTest.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/data/episodes/dao/EpisodeDaoTest.kt @@ -4,6 +4,7 @@ import android.content.Context import androidx.room.Room import androidx.test.core.app.ApplicationProvider import com.mohsenoid.rickandmorty.data.db.Database +import com.mohsenoid.rickandmorty.data.episodes.db.dao.EpisodeDao import com.mohsenoid.rickandmorty.util.MainDispatcherRule import com.mohsenoid.rickandmorty.util.createEpisodeEntity import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/domain/episodes/usecase/GetEpisodesUseCaseIntegrationTest.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/domain/episodes/usecase/GetEpisodesUseCaseIntegrationTest.kt index c46c5c0..f205b5b 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/domain/episodes/usecase/GetEpisodesUseCaseIntegrationTest.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/domain/episodes/usecase/GetEpisodesUseCaseIntegrationTest.kt @@ -79,7 +79,7 @@ class GetEpisodesUseCaseIntegrationTest : KoinTest { server = MockWebServer().apply { dispatcher = mockDispatcher - start() + start(8080) } val baseUrl = server.url("/").toString() diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/CharacterEntityFactory.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/CharacterEntityFactory.kt index 3892f6b..3ac552b 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/CharacterEntityFactory.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/CharacterEntityFactory.kt @@ -1,6 +1,6 @@ package com.mohsenoid.rickandmorty.util -import com.mohsenoid.rickandmorty.data.characters.entity.CharacterEntity +import com.mohsenoid.rickandmorty.data.characters.db.entity.CharacterEntity internal fun createCharactersEntityList( count: Int, diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/CharacterRemoteModelFactory.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/CharacterRemoteModelFactory.kt index b3e61f3..610cc11 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/CharacterRemoteModelFactory.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/CharacterRemoteModelFactory.kt @@ -1,9 +1,9 @@ package com.mohsenoid.rickandmorty.util -import com.mohsenoid.rickandmorty.data.remote.model.CharacterRemoteModel -import com.mohsenoid.rickandmorty.data.remote.model.CharactersResponse -import com.mohsenoid.rickandmorty.data.remote.model.LocationRemoteModel -import com.mohsenoid.rickandmorty.data.remote.model.OriginRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.model.CharacterRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.model.CharactersResponse +import com.mohsenoid.rickandmorty.data.characters.remote.model.LocationRemoteModel +import com.mohsenoid.rickandmorty.data.characters.remote.model.OriginRemoteModel internal fun createCharactersResponse( characters: List = diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/EpisodeEntityFactory.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/EpisodeEntityFactory.kt index 3748f0f..d4992d7 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/EpisodeEntityFactory.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/EpisodeEntityFactory.kt @@ -1,6 +1,6 @@ package com.mohsenoid.rickandmorty.util -import com.mohsenoid.rickandmorty.data.episodes.entity.EpisodeEntity +import com.mohsenoid.rickandmorty.data.episodes.db.entity.EpisodeEntity internal fun createEpisodesEntityList( count: Int, diff --git a/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/EpisodeRemoteModelFactory.kt b/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/EpisodeRemoteModelFactory.kt index ad4d4c9..c7ddb00 100644 --- a/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/EpisodeRemoteModelFactory.kt +++ b/app/src/test/kotlin/com/mohsenoid/rickandmorty/util/EpisodeRemoteModelFactory.kt @@ -1,8 +1,8 @@ package com.mohsenoid.rickandmorty.util -import com.mohsenoid.rickandmorty.data.remote.model.EpisodeRemoteModel -import com.mohsenoid.rickandmorty.data.remote.model.EpisodesResponse -import com.mohsenoid.rickandmorty.data.remote.model.InfoRemoteModel +import com.mohsenoid.rickandmorty.data.episodes.remote.model.EpisodeRemoteModel +import com.mohsenoid.rickandmorty.data.episodes.remote.model.EpisodesResponse +import com.mohsenoid.rickandmorty.data.episodes.remote.model.InfoRemoteModel internal fun createEpisodeResponse( info: InfoRemoteModel = createInfoRemoteModel(),