Skip to content

Commit 2c98ece

Browse files
committed
Cover PostUpdaterFactory
Signed-off-by: Matt Ramotar <[email protected]>
1 parent 454bdbd commit 2c98ece

File tree

2 files changed

+208
-3
lines changed
  • xplat/lib/repositories/post/impl/src
    • commonMain/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/updater
    • commonTest/kotlin/org/mobilenativefoundation/trails/xplat/lib/repositories/post/impl/store/updater

2 files changed

+208
-3
lines changed

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

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,48 @@ class PostUpdaterFactory(
6262
// So, before we can pull the latest value for this key from the network, we need to push our latest local value for this key to the network
6363

6464
is Operation.Query -> {
65+
// We don't support updating many
66+
// So the post must be a single rather than a collection
6567
require(post is PostOutput.Single)
66-
updateOne(post)
68+
updateOne(post, operation)
6769
}
6870
}
6971
}
7072

7173
private suspend fun updateOne(post: PostOutput.Single): UpdaterResult {
7274
val count = when (val value = post.value) {
73-
is Post.Composite -> client.updateOne(value.node)
74-
is Post.Node -> client.updateOne(value)
75+
is Post.Composite -> {
76+
client.updateOne(value.node)
77+
}
78+
79+
is Post.Node -> {
80+
client.updateOne(value)
81+
}
82+
83+
is Post.Properties -> {
84+
throw UnsupportedOperationException()
85+
}
86+
}
87+
88+
return UpdaterResult.Success.Typed(PostWriteResponse.Update(count))
89+
}
90+
91+
92+
private suspend fun updateOne(
93+
post: PostOutput.Single,
94+
operation: Operation.Query<Post.Key, Post.Properties, Post.Edges, Post.Node>
95+
): UpdaterResult {
96+
val count = when (val value = post.value) {
97+
is Post.Composite -> {
98+
require(operation is Operation.Query.FindOneComposite || operation is Operation.Query.ObserveOneComposite)
99+
client.updateOne(value.node)
100+
}
101+
102+
is Post.Node -> {
103+
require(operation is Operation.Query.FindOne || operation is Operation.Query.ObserveOne || operation is Operation.Query.QueryOne)
104+
client.updateOne(value)
105+
}
106+
75107
is Post.Properties -> {
76108
throw UnsupportedOperationException()
77109
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
package org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.updater
2+
3+
import dev.mokkery.answering.returns
4+
import dev.mokkery.everySuspend
5+
import dev.mokkery.mock
6+
import kotlinx.coroutines.test.runTest
7+
import org.mobilenativefoundation.store.store5.Updater
8+
import org.mobilenativefoundation.store.store5.UpdaterResult
9+
import org.mobilenativefoundation.trails.xplat.lib.models.post.PostOutput
10+
import org.mobilenativefoundation.trails.xplat.lib.models.post.PostWriteResponse
11+
import org.mobilenativefoundation.trails.xplat.lib.operations.io.Operation
12+
import org.mobilenativefoundation.trails.xplat.lib.operations.query.DataSources
13+
import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.PostOperation
14+
import org.mobilenativefoundation.trails.xplat.lib.repositories.post.test.utils.FakePostFactory.createCompositePost
15+
import org.mobilenativefoundation.trails.xplat.lib.repositories.post.test.utils.FakePostFactory.createPost
16+
import org.mobilenativefoundation.trails.xplat.lib.rest.api.post.PostOperations
17+
import kotlin.test.Test
18+
import kotlin.test.assertEquals
19+
import kotlin.test.assertIs
20+
21+
class PostUpdaterFactoryTest {
22+
private val client = mock<PostOperations>()
23+
private val factory = PostUpdaterFactory(client)
24+
25+
@Test
26+
fun create_whenCalled_thenShouldReturnUpdater() {
27+
// When
28+
val updater = factory.create()
29+
30+
// Then
31+
assertIs<Updater<PostOperation, PostOutput, PostWriteResponse>>(updater)
32+
}
33+
34+
@Test
35+
fun handleOperation_givenUpdater_whenCalledWithInsertOne_thenShouldMakeNetworkRequestAndReturnUpdaterResult() =
36+
runTest {
37+
// Given
38+
val node = createPost(1)
39+
val properties = node.properties
40+
val updater = factory.create()
41+
val operation = Operation.Mutation.Create.InsertOne(properties)
42+
everySuspend { client.insertOne(properties) }.returns(node.key)
43+
44+
// When
45+
val result = updater.post(operation, PostOutput.Single(properties))
46+
47+
// Then
48+
assertIs<UpdaterResult.Success.Typed<PostWriteResponse.Create>>(result)
49+
assertEquals(UpdaterResult.Success.Typed(PostWriteResponse.Create(node.key)), result)
50+
}
51+
52+
@Test
53+
fun handleOperation_givenUpdater_whenCalledWithDeleteAll_thenShouldMakeNetworkRequestAndReturnUpdaterResult() =
54+
runTest {
55+
// Given
56+
val node = createPost(1)
57+
val properties = node.properties
58+
val updater = factory.create()
59+
val operation = Operation.Mutation.Delete.DeleteAll
60+
everySuspend { client.deleteAll() }.returns(1)
61+
62+
// When
63+
val result = updater.post(operation, PostOutput.Single(properties))
64+
65+
// Then
66+
assertIs<UpdaterResult.Success.Typed<PostWriteResponse.Delete>>(result)
67+
assertEquals(UpdaterResult.Success.Typed(PostWriteResponse.Delete(1)), result)
68+
}
69+
70+
@Test
71+
fun handleOperation_givenUpdater_whenCalledWithDeleteMany_thenShouldMakeNetworkRequestAndReturnUpdaterResult() =
72+
runTest {
73+
// Given
74+
val node1 = createPost(1)
75+
val node2 = createPost(2)
76+
val updater = factory.create()
77+
val operation = Operation.Mutation.Delete.DeleteMany(listOf(node1.key, node2.key))
78+
everySuspend { client.deleteMany(listOf(node1.key, node2.key)) }.returns(2)
79+
80+
// When
81+
val result = updater.post(operation, PostOutput.Collection(listOf(node1, node2)))
82+
83+
// Then
84+
assertIs<UpdaterResult.Success.Typed<PostWriteResponse.Delete>>(result)
85+
assertEquals(UpdaterResult.Success.Typed(PostWriteResponse.Delete(2)), result)
86+
}
87+
88+
89+
@Test
90+
fun handleOperation_givenUpdater_whenCalledWithDeleteOne_thenShouldMakeNetworkRequestAndReturnUpdaterResult() =
91+
runTest {
92+
// Given
93+
val node1 = createPost(1)
94+
val updater = factory.create()
95+
val operation = Operation.Mutation.Delete.DeleteOne(node1.key)
96+
everySuspend { client.deleteOne(node1.key) }.returns(1)
97+
98+
// When
99+
val result = updater.post(operation, PostOutput.Single(node1))
100+
101+
// Then
102+
assertIs<UpdaterResult.Success.Typed<PostWriteResponse.Delete>>(result)
103+
assertEquals(UpdaterResult.Success.Typed(PostWriteResponse.Delete(1)), result)
104+
}
105+
106+
@Test
107+
fun handleOperation_givenUpdater_whenCalledWithUpdateOne_thenShouldMakeNetworkRequestAndReturnUpdaterResult() =
108+
runTest {
109+
// Given
110+
val node1 = createPost(1)
111+
val updater = factory.create()
112+
val operation = Operation.Mutation.Update.UpdateOne(node1)
113+
everySuspend { client.updateOne(node1) }.returns(1)
114+
115+
// When
116+
val result = updater.post(operation, PostOutput.Single(node1))
117+
118+
// Then
119+
assertIs<UpdaterResult.Success.Typed<PostWriteResponse.Update>>(result)
120+
assertEquals(UpdaterResult.Success.Typed(PostWriteResponse.Update(1)), result)
121+
}
122+
123+
@Test
124+
fun handleOperation_givenUpdater_whenCalledWithUpsertOne_thenShouldMakeNetworkRequestAndReturnUpdaterResult() =
125+
runTest {
126+
// Given
127+
val node1 = createPost(1)
128+
val updater = factory.create()
129+
val operation = Operation.Mutation.Upsert.UpsertOne(node1.properties)
130+
everySuspend { client.upsertOne(node1.properties) }.returns(node1.key)
131+
132+
// When
133+
val result = updater.post(operation, PostOutput.Single(node1.properties))
134+
135+
// Then
136+
assertIs<UpdaterResult.Success.Typed<PostWriteResponse.Upsert>>(result)
137+
assertEquals(UpdaterResult.Success.Typed(PostWriteResponse.Upsert(node1.key)), result)
138+
}
139+
140+
@Test
141+
fun handleOperation_givenUpdater_whenCalledWithFindOne_thenShouldMakeNetworkRequestAndReturnUpdaterResult() =
142+
runTest {
143+
// Given
144+
val node1 = createPost(1)
145+
val updater = factory.create()
146+
val operation = Operation.Query.FindOne(node1.key, DataSources.all)
147+
everySuspend { client.updateOne(node1) }.returns(1)
148+
149+
// When
150+
val result = updater.post(operation, PostOutput.Single(node1))
151+
152+
// Then
153+
assertIs<UpdaterResult.Success.Typed<PostWriteResponse.Update>>(result)
154+
assertEquals(UpdaterResult.Success.Typed(PostWriteResponse.Update(1)), result)
155+
}
156+
157+
@Test
158+
fun handleOperation_givenUpdater_whenCalledWithFindOneComposite_thenShouldMakeNetworkRequestAndReturnUpdaterResult() =
159+
runTest {
160+
// Given
161+
val node1 = createCompositePost(1)
162+
val updater = factory.create()
163+
val operation = Operation.Query.FindOneComposite(node1.node.key, DataSources.all)
164+
everySuspend { client.updateOne(node1.node) }.returns(1)
165+
166+
// When
167+
val result = updater.post(operation, PostOutput.Single(node1))
168+
169+
// Then
170+
assertIs<UpdaterResult.Success.Typed<PostWriteResponse.Update>>(result)
171+
assertEquals(UpdaterResult.Success.Typed(PostWriteResponse.Update(1)), result)
172+
}
173+
}

0 commit comments

Comments
 (0)