diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeAuthorsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeAuthorsRepository.kt index 566214dd7..056e1e861 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeAuthorsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeAuthorsRepository.kt @@ -21,18 +21,13 @@ import com.google.samples.apps.nowinandroid.core.data.repository.AuthorsReposito import com.google.samples.apps.nowinandroid.core.model.data.Author import com.google.samples.apps.nowinandroid.core.network.Dispatcher import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO -import com.google.samples.apps.nowinandroid.core.network.fake.FakeAssetManager -import com.google.samples.apps.nowinandroid.core.network.fake.FakeDataSource -import com.google.samples.apps.nowinandroid.core.network.model.NetworkAuthor -import java.io.InputStream +import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.decodeFromStream /** * Fake implementation of the [AuthorsRepository] that returns hardcoded authors. @@ -42,27 +37,23 @@ import kotlinx.serialization.json.decodeFromStream */ class FakeAuthorsRepository @Inject constructor( @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, - private val networkJson: Json, - private val assets: FakeAssetManager, + private val datasource: FakeNiaNetworkDataSource ) : AuthorsRepository { override fun getAuthorsStream(): Flow> = flow { emit( - assets.open(FakeDataSource.AUTHORS) - .use>(networkJson::decodeFromStream) - .map { - Author( - id = it.id, - name = it.name, - imageUrl = it.imageUrl, - twitter = it.twitter, - mediumPage = it.mediumPage, - bio = it.bio, - ) - } + datasource.getAuthors().map { + Author( + id = it.id, + name = it.name, + imageUrl = it.imageUrl, + twitter = it.twitter, + mediumPage = it.mediumPage, + bio = it.bio, + ) + } ) - } - .flowOn(ioDispatcher) + }.flowOn(ioDispatcher) override fun getAuthorStream(id: String): Flow { return getAuthorsStream().map { it.first { author -> author.id == id } } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt index e9d965ae6..d55db1709 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt @@ -24,17 +24,13 @@ import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.network.Dispatcher import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO -import com.google.samples.apps.nowinandroid.core.network.fake.FakeAssetManager -import com.google.samples.apps.nowinandroid.core.network.fake.FakeDataSource +import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource -import java.io.InputStream import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.decodeFromStream /** * Fake implementation of the [NewsRepository] that retrieves the news resources from a JSON String. @@ -44,20 +40,17 @@ import kotlinx.serialization.json.decodeFromStream */ class FakeNewsRepository @Inject constructor( @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, - private val networkJson: Json, - private val assets: FakeAssetManager, + private val datasource: FakeNiaNetworkDataSource ) : NewsRepository { override fun getNewsResourcesStream(): Flow> = flow { emit( - assets.open(FakeDataSource.DATA) - .use>(networkJson::decodeFromStream) + datasource.getNewsResources() .map(NetworkNewsResource::asEntity) .map(NewsResourceEntity::asExternalModel) ) - } - .flowOn(ioDispatcher) + }.flowOn(ioDispatcher) override fun getNewsResourcesStream( filterAuthorIds: Set, @@ -65,18 +58,16 @@ class FakeNewsRepository @Inject constructor( ): Flow> = flow { emit( - assets.open(FakeDataSource.DATA).use { stream -> - networkJson.decodeFromStream>(stream) - .filter { - it.authors.intersect(filterAuthorIds).isNotEmpty() || - it.topics.intersect(filterTopicIds).isNotEmpty() - } - .map(NetworkNewsResource::asEntity) - .map(NewsResourceEntity::asExternalModel) - } + datasource + .getNewsResources() + .filter { + it.authors.intersect(filterAuthorIds).isNotEmpty() || + it.topics.intersect(filterTopicIds).isNotEmpty() + } + .map(NetworkNewsResource::asEntity) + .map(NewsResourceEntity::asExternalModel) ) - } - .flowOn(ioDispatcher) + }.flowOn(ioDispatcher) override suspend fun syncWith(synchronizer: Synchronizer) = true } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt index d8cdaa51a..ff4be8604 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt @@ -21,18 +21,13 @@ import com.google.samples.apps.nowinandroid.core.data.repository.TopicsRepositor import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.Dispatcher import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO -import com.google.samples.apps.nowinandroid.core.network.fake.FakeAssetManager -import com.google.samples.apps.nowinandroid.core.network.fake.FakeDataSource -import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import java.io.InputStream +import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.decodeFromStream /** * Fake implementation of the [TopicsRepository] that retrieves the topics from a JSON String, and @@ -43,26 +38,22 @@ import kotlinx.serialization.json.decodeFromStream */ class FakeTopicsRepository @Inject constructor( @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, - private val networkJson: Json, - private val assets: FakeAssetManager, + private val datasource: FakeNiaNetworkDataSource ) : TopicsRepository { override fun getTopicsStream(): Flow> = flow { emit( - assets.open(FakeDataSource.TOPICS) - .use>(networkJson::decodeFromStream) - .map { - Topic( - id = it.id, - name = it.name, - shortDescription = it.shortDescription, - longDescription = it.longDescription, - url = it.url, - imageUrl = it.imageUrl - ) - } + datasource.getTopics().map { + Topic( + id = it.id, + name = it.name, + shortDescription = it.shortDescription, + longDescription = it.longDescription, + url = it.url, + imageUrl = it.imageUrl + ) + } ) - } - .flowOn(ioDispatcher) + }.flowOn(ioDispatcher) override fun getTopic(id: String): Flow { return getTopicsStream().map { it.first { topic -> topic.id == id } } diff --git a/core/network/src/main/assets/data.json b/core/network/src/main/assets/news.json similarity index 100% rename from core/network/src/main/assets/data.json rename to core/network/src/main/assets/news.json diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeDataSource.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeDataSource.kt deleted file mode 100644 index cf6aff8b5..000000000 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeDataSource.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.samples.apps.nowinandroid.core.network.fake - -object FakeDataSource { - const val AUTHORS = "authors.json" - const val DATA = "data.json" - const val TOPICS = "topics.json" -} diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt index 027034169..dcf3722fe 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt @@ -27,6 +27,7 @@ import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream @@ -38,19 +39,29 @@ class FakeNiaNetworkDataSource @Inject constructor( private val networkJson: Json, private val assets: FakeAssetManager = JvmUnitTestFakeAssetManager, ) : NiaNetworkDataSource { + + companion object { + private const val AUTHORS_ASSET = "authors.json" + private const val NEWS_ASSET = "news.json" + private const val TOPICS_ASSET = "topics.json" + } + + @OptIn(ExperimentalSerializationApi::class) override suspend fun getTopics(ids: List?): List = withContext(ioDispatcher) { - assets.open(FakeDataSource.TOPICS).use(networkJson::decodeFromStream) + assets.open(TOPICS_ASSET).use(networkJson::decodeFromStream) } + @OptIn(ExperimentalSerializationApi::class) override suspend fun getNewsResources(ids: List?): List = withContext(ioDispatcher) { - assets.open(FakeDataSource.DATA).use(networkJson::decodeFromStream) + assets.open(NEWS_ASSET).use(networkJson::decodeFromStream) } + @OptIn(ExperimentalSerializationApi::class) override suspend fun getAuthors(ids: List?): List = withContext(ioDispatcher) { - assets.open(FakeDataSource.AUTHORS).use(networkJson::decodeFromStream) + assets.open(AUTHORS_ASSET).use(networkJson::decodeFromStream) } override suspend fun getTopicChangeList(after: Int?): List =