From 47890fa9bbddfc833bb2812946d668e88b82bab0 Mon Sep 17 00:00:00 2001 From: Matt Ramotar Date: Thu, 28 Nov 2024 02:24:55 -0500 Subject: [PATCH] Cover RealPostSourceOfTruthWriter Signed-off-by: Matt Ramotar --- .../post/impl/store/PostStoreFactory.kt | 5 +- .../database/PostSourceOfTruthFactory.kt | 37 +++++++++++++- .../store/database/PostSourceOfTruthWriter.kt | 50 ++----------------- .../database/RealPostSourceOfTruthWriter.kt | 21 ++++++++ .../RealPostSourceOfTruthWriterTest.kt | 48 ++++++++++++++++++ 5 files changed, 112 insertions(+), 49 deletions(-) create mode 100644 xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/RealPostSourceOfTruthWriter.kt create mode 100644 xplat/lib/repositories/post/impl/src/commonTest/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/RealPostSourceOfTruthWriterTest.kt diff --git a/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/PostStoreFactory.kt b/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/PostStoreFactory.kt index e1d1e57..b66016b 100644 --- a/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/PostStoreFactory.kt +++ b/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/PostStoreFactory.kt @@ -33,8 +33,9 @@ class PostStoreFactory( comparer: PostComparer ) { - private val sourceOfTruthReader = RealPostSourceOfTruthReader(postDAO, predicateEvaluator, comparer, coroutineDispatcher) - private val sourceOfTruthWriter = PostSourceOfTruthWriter(trailsDatabase, coroutineDispatcher) + private val sourceOfTruthReader = + RealPostSourceOfTruthReader(postDAO, predicateEvaluator, comparer, coroutineDispatcher) + private val sourceOfTruthWriter = RealPostSourceOfTruthWriter(postDAO) private val sourceOfTruthFactory = PostSourceOfTruthFactory(sourceOfTruthReader, sourceOfTruthWriter) private val fetcherFactory = PostFetcherFactory(postFetcherServices) private val updaterFactory = PostUpdaterFactory(client) diff --git a/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthFactory.kt b/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthFactory.kt index b98045a..3e48fed 100644 --- a/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthFactory.kt +++ b/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthFactory.kt @@ -5,9 +5,9 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import org.mobilenativefoundation.store.store5.SourceOfTruth import org.mobilenativefoundation.trails.xplat.lib.models.post.Post +import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.PostOperation -import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput class PostSourceOfTruthFactory( private val reader: PostSourceOfTruthReader, @@ -34,7 +34,7 @@ class PostSourceOfTruthFactory( mutableSharedFlow.asSharedFlow() }, writer = { operation, output -> - writer.handleWrite(operation, output) + handleWrite(operation, output) }, delete = { operation -> TODO() @@ -62,4 +62,37 @@ class PostSourceOfTruthFactory( is Operation.Query.QueryManyComposite -> reader.queryManyComposite(operation.query, emit) } } + + // We write to the SOT on mutations and queries + // So we need to handle all cases + + private suspend fun handleWrite( + operation: PostOperation, + value: PostOutput + ) { + + when (operation) { + is Operation.Mutation.Create.InsertOne -> TODO() + Operation.Mutation.Delete.DeleteAll -> TODO() + is Operation.Mutation.Delete.DeleteMany -> TODO() + is Operation.Mutation.Delete.DeleteOne -> TODO() + is Operation.Mutation.Update.ReplaceOne -> TODO() + is Operation.Mutation.Update.UpdateOne -> TODO() + is Operation.Mutation.Upsert.UpsertOne -> TODO() + is Operation.Query.FindAll -> TODO() + is Operation.Query.FindMany -> TODO() + is Operation.Query.FindOne -> TODO() + is Operation.Query.FindOneComposite -> TODO() + is Operation.Query.ObserveMany -> TODO() + is Operation.Query.ObserveOne -> TODO() + is Operation.Query.ObserveOneComposite -> TODO() + is Operation.Query.QueryMany -> TODO() + is Operation.Query.QueryManyComposite -> { + writer.queryManyComposite(operation, value) + } + + is Operation.Query.QueryOne -> TODO() + } + + } } \ No newline at end of file diff --git a/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthWriter.kt b/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthWriter.kt index 418009a..19cf61a 100644 --- a/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthWriter.kt +++ b/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthWriter.kt @@ -1,54 +1,14 @@ package org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.database -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.CoroutineScope -import org.mobilenativefoundation.trails.xplat.lib.db.TrailsDatabase import org.mobilenativefoundation.trails.xplat.lib.models.post.Post import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation -import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.extensions.PostQueriesExtensions.saveComposite -import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.PostOperation -class PostSourceOfTruthWriter( - private val trailsDatabase: TrailsDatabase, - private val coroutineDispatcher: CoroutineDispatcher -) { - private val coroutineScope = CoroutineScope(coroutineDispatcher) - - // We write to the SOT on mutations and queries - // So we need to handle all cases - - suspend fun handleWrite( - operation: PostOperation, +interface PostSourceOfTruthWriter { + suspend fun queryManyComposite( + operation: Operation.Query.QueryManyComposite, value: PostOutput - ) { - - when (operation) { - is Operation.Mutation.Create.InsertOne -> TODO() - Operation.Mutation.Delete.DeleteAll -> TODO() - is Operation.Mutation.Delete.DeleteMany -> TODO() - is Operation.Mutation.Delete.DeleteOne -> TODO() - is Operation.Mutation.Update.ReplaceOne -> TODO() - is Operation.Mutation.Update.UpdateOne -> TODO() - is Operation.Mutation.Upsert.UpsertOne -> TODO() - is Operation.Query.FindAll -> TODO() - is Operation.Query.FindMany -> TODO() - is Operation.Query.FindOne -> TODO() - is Operation.Query.FindOneComposite -> TODO() - is Operation.Query.ObserveMany -> TODO() - is Operation.Query.ObserveOne -> TODO() - is Operation.Query.ObserveOneComposite -> TODO() - is Operation.Query.QueryMany -> TODO() - is Operation.Query.QueryManyComposite -> { - require(value is PostOutput.Collection) - - value.values.filterIsInstance().forEach { composite -> - trailsDatabase.postQueries.saveComposite(composite) - } - } + ) +} - is Operation.Query.QueryOne -> TODO() - } - } -} \ No newline at end of file diff --git a/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/RealPostSourceOfTruthWriter.kt b/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/RealPostSourceOfTruthWriter.kt new file mode 100644 index 0000000..65d0b97 --- /dev/null +++ b/xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/RealPostSourceOfTruthWriter.kt @@ -0,0 +1,21 @@ +package org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.database + +import org.mobilenativefoundation.trails.xplat.lib.models.post.Post +import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput +import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation + +class RealPostSourceOfTruthWriter( + private val postDAO: PostDAO +) : PostSourceOfTruthWriter { + + override suspend fun queryManyComposite( + operation: Operation.Query.QueryManyComposite, + value: PostOutput + ) { + require(value is PostOutput.Collection) + + value.values.filterIsInstance().forEach { composite -> + postDAO.insertOneComposite(composite) + } + } +} \ No newline at end of file diff --git a/xplat/lib/repositories/post/impl/src/commonTest/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/RealPostSourceOfTruthWriterTest.kt b/xplat/lib/repositories/post/impl/src/commonTest/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/RealPostSourceOfTruthWriterTest.kt new file mode 100644 index 0000000..dff8cf2 --- /dev/null +++ b/xplat/lib/repositories/post/impl/src/commonTest/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/RealPostSourceOfTruthWriterTest.kt @@ -0,0 +1,48 @@ +package org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.database + +import dev.mokkery.MockMode +import dev.mokkery.matcher.eq +import dev.mokkery.mock +import dev.mokkery.verifySuspend +import kotlinx.coroutines.test.runTest +import org.mobilenativefoundation.trails.xplat.lib.models.post.Post +import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput +import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation.Query.QueryManyComposite +import org.mobilenativefoundation.trails.xplat.lib.operations.query.DataSources +import org.mobilenativefoundation.trails.xplat.lib.operations.query.Query +import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.test_utils.FakePostFactory.createCompositePost +import kotlin.test.Test + +class RealPostSourceOfTruthWriterTest { + + private val postDAO = mock(MockMode.autoUnit) + private val writer = RealPostSourceOfTruthWriter(postDAO) + + + @Test + fun queryManyComposite_givenNormalDAO_whenCalledWithValidValue_thenShouldSaveUsingDAO() = runTest { + // Given + val composite1 = createCompositePost(1) + val composite2 = createCompositePost(2) + val value = PostOutput.Collection( + values = listOf(composite1, composite2) + ) + + val operation = QueryManyComposite( + query = Query.Many( + DataSources.all, + null, + null, + null + ), + dataSources = DataSources.all + ) + + // When + writer.queryManyComposite(operation, value) + + // Then + verifySuspend { postDAO.insertOneComposite(eq(composite1)) } + verifySuspend { postDAO.insertOneComposite(eq(composite2)) } + } +} \ No newline at end of file