Skip to content

Commit 47890fa

Browse files
committed
Cover RealPostSourceOfTruthWriter
Signed-off-by: Matt Ramotar <[email protected]>
1 parent 2d7033d commit 47890fa

File tree

5 files changed

+112
-49
lines changed

5 files changed

+112
-49
lines changed

xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/PostStoreFactory.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ class PostStoreFactory(
3333
comparer: PostComparer
3434
) {
3535

36-
private val sourceOfTruthReader = RealPostSourceOfTruthReader(postDAO, predicateEvaluator, comparer, coroutineDispatcher)
37-
private val sourceOfTruthWriter = PostSourceOfTruthWriter(trailsDatabase, coroutineDispatcher)
36+
private val sourceOfTruthReader =
37+
RealPostSourceOfTruthReader(postDAO, predicateEvaluator, comparer, coroutineDispatcher)
38+
private val sourceOfTruthWriter = RealPostSourceOfTruthWriter(postDAO)
3839
private val sourceOfTruthFactory = PostSourceOfTruthFactory(sourceOfTruthReader, sourceOfTruthWriter)
3940
private val fetcherFactory = PostFetcherFactory(postFetcherServices)
4041
private val updaterFactory = PostUpdaterFactory(client)

xplat/lib/repositories/post/impl/src/commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/database/PostSourceOfTruthFactory.kt

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import kotlinx.coroutines.flow.MutableSharedFlow
55
import kotlinx.coroutines.flow.asSharedFlow
66
import org.mobilenativefoundation.store.store5.SourceOfTruth
77
import org.mobilenativefoundation.trails.xplat.lib.models.post.Post
8+
import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput
89
import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation
910
import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.PostOperation
10-
import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput
1111

1212
class PostSourceOfTruthFactory(
1313
private val reader: PostSourceOfTruthReader,
@@ -34,7 +34,7 @@ class PostSourceOfTruthFactory(
3434
mutableSharedFlow.asSharedFlow()
3535
},
3636
writer = { operation, output ->
37-
writer.handleWrite(operation, output)
37+
handleWrite(operation, output)
3838
},
3939
delete = { operation ->
4040
TODO()
@@ -62,4 +62,37 @@ class PostSourceOfTruthFactory(
6262
is Operation.Query.QueryManyComposite -> reader.queryManyComposite(operation.query, emit)
6363
}
6464
}
65+
66+
// We write to the SOT on mutations and queries
67+
// So we need to handle all cases
68+
69+
private suspend fun handleWrite(
70+
operation: PostOperation,
71+
value: PostOutput
72+
) {
73+
74+
when (operation) {
75+
is Operation.Mutation.Create.InsertOne -> TODO()
76+
Operation.Mutation.Delete.DeleteAll -> TODO()
77+
is Operation.Mutation.Delete.DeleteMany -> TODO()
78+
is Operation.Mutation.Delete.DeleteOne -> TODO()
79+
is Operation.Mutation.Update.ReplaceOne -> TODO()
80+
is Operation.Mutation.Update.UpdateOne -> TODO()
81+
is Operation.Mutation.Upsert.UpsertOne -> TODO()
82+
is Operation.Query.FindAll -> TODO()
83+
is Operation.Query.FindMany -> TODO()
84+
is Operation.Query.FindOne -> TODO()
85+
is Operation.Query.FindOneComposite -> TODO()
86+
is Operation.Query.ObserveMany -> TODO()
87+
is Operation.Query.ObserveOne -> TODO()
88+
is Operation.Query.ObserveOneComposite -> TODO()
89+
is Operation.Query.QueryMany -> TODO()
90+
is Operation.Query.QueryManyComposite -> {
91+
writer.queryManyComposite(operation, value)
92+
}
93+
94+
is Operation.Query.QueryOne -> TODO()
95+
}
96+
97+
}
6598
}
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,14 @@
11
package org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.database
22

3-
import kotlinx.coroutines.CoroutineDispatcher
4-
import kotlinx.coroutines.CoroutineScope
5-
import org.mobilenativefoundation.trails.xplat.lib.db.TrailsDatabase
63
import org.mobilenativefoundation.trails.xplat.lib.models.post.Post
74
import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput
85
import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation
9-
import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.extensions.PostQueriesExtensions.saveComposite
10-
import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.PostOperation
116

12-
class PostSourceOfTruthWriter(
13-
private val trailsDatabase: TrailsDatabase,
14-
private val coroutineDispatcher: CoroutineDispatcher
15-
) {
16-
private val coroutineScope = CoroutineScope(coroutineDispatcher)
17-
18-
// We write to the SOT on mutations and queries
19-
// So we need to handle all cases
20-
21-
suspend fun handleWrite(
22-
operation: PostOperation,
7+
interface PostSourceOfTruthWriter {
8+
suspend fun queryManyComposite(
9+
operation: Operation.Query.QueryManyComposite<Post.Key, Post.Properties, Post.Edges, Post.Node>,
2310
value: PostOutput
24-
) {
25-
26-
when (operation) {
27-
is Operation.Mutation.Create.InsertOne -> TODO()
28-
Operation.Mutation.Delete.DeleteAll -> TODO()
29-
is Operation.Mutation.Delete.DeleteMany -> TODO()
30-
is Operation.Mutation.Delete.DeleteOne -> TODO()
31-
is Operation.Mutation.Update.ReplaceOne -> TODO()
32-
is Operation.Mutation.Update.UpdateOne -> TODO()
33-
is Operation.Mutation.Upsert.UpsertOne -> TODO()
34-
is Operation.Query.FindAll -> TODO()
35-
is Operation.Query.FindMany -> TODO()
36-
is Operation.Query.FindOne -> TODO()
37-
is Operation.Query.FindOneComposite -> TODO()
38-
is Operation.Query.ObserveMany -> TODO()
39-
is Operation.Query.ObserveOne -> TODO()
40-
is Operation.Query.ObserveOneComposite -> TODO()
41-
is Operation.Query.QueryMany -> TODO()
42-
is Operation.Query.QueryManyComposite -> {
43-
require(value is PostOutput.Collection)
44-
45-
value.values.filterIsInstance<Post.Composite>().forEach { composite ->
46-
trailsDatabase.postQueries.saveComposite(composite)
47-
}
48-
}
11+
)
12+
}
4913

50-
is Operation.Query.QueryOne -> TODO()
51-
}
5214

53-
}
54-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.database
2+
3+
import org.mobilenativefoundation.trails.xplat.lib.models.post.Post
4+
import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput
5+
import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation
6+
7+
class RealPostSourceOfTruthWriter(
8+
private val postDAO: PostDAO
9+
) : PostSourceOfTruthWriter {
10+
11+
override suspend fun queryManyComposite(
12+
operation: Operation.Query.QueryManyComposite<Post.Key, Post.Properties, Post.Edges, Post.Node>,
13+
value: PostOutput
14+
) {
15+
require(value is PostOutput.Collection)
16+
17+
value.values.filterIsInstance<Post.Composite>().forEach { composite ->
18+
postDAO.insertOneComposite(composite)
19+
}
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.database
2+
3+
import dev.mokkery.MockMode
4+
import dev.mokkery.matcher.eq
5+
import dev.mokkery.mock
6+
import dev.mokkery.verifySuspend
7+
import kotlinx.coroutines.test.runTest
8+
import org.mobilenativefoundation.trails.xplat.lib.models.post.Post
9+
import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput
10+
import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation.Query.QueryManyComposite
11+
import org.mobilenativefoundation.trails.xplat.lib.operations.query.DataSources
12+
import org.mobilenativefoundation.trails.xplat.lib.operations.query.Query
13+
import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.test_utils.FakePostFactory.createCompositePost
14+
import kotlin.test.Test
15+
16+
class RealPostSourceOfTruthWriterTest {
17+
18+
private val postDAO = mock<PostDAO>(MockMode.autoUnit)
19+
private val writer = RealPostSourceOfTruthWriter(postDAO)
20+
21+
22+
@Test
23+
fun queryManyComposite_givenNormalDAO_whenCalledWithValidValue_thenShouldSaveUsingDAO() = runTest {
24+
// Given
25+
val composite1 = createCompositePost(1)
26+
val composite2 = createCompositePost(2)
27+
val value = PostOutput.Collection(
28+
values = listOf(composite1, composite2)
29+
)
30+
31+
val operation = QueryManyComposite(
32+
query = Query.Many<Post.Node>(
33+
DataSources.all,
34+
null,
35+
null,
36+
null
37+
),
38+
dataSources = DataSources.all
39+
)
40+
41+
// When
42+
writer.queryManyComposite(operation, value)
43+
44+
// Then
45+
verifySuspend { postDAO.insertOneComposite(eq(composite1)) }
46+
verifySuspend { postDAO.insertOneComposite(eq(composite2)) }
47+
}
48+
}

0 commit comments

Comments
 (0)