Skip to content

Commit 3caf26d

Browse files
committed
Fix passing parameters
1 parent 2c2332f commit 3caf26d

File tree

5 files changed

+47
-2
lines changed

5 files changed

+47
-2
lines changed

core/src/commonIntegrationTest/kotlin/com/powersync/sync/SyncIntegrationTest.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,22 @@ import com.powersync.db.schema.Schema
1717
import com.powersync.testutils.UserRow
1818
import com.powersync.testutils.databaseTest
1919
import com.powersync.testutils.waitFor
20+
import com.powersync.utils.JsonParam
2021
import com.powersync.utils.JsonUtil
2122
import dev.mokkery.answering.returns
2223
import dev.mokkery.every
2324
import dev.mokkery.verify
2425
import dev.mokkery.verifyNoMoreCalls
2526
import dev.mokkery.verifySuspend
27+
import io.kotest.matchers.collections.shouldHaveSingleElement
2628
import io.kotest.matchers.collections.shouldHaveSize
2729
import io.kotest.matchers.shouldBe
2830
import kotlinx.coroutines.CompletableDeferred
2931
import kotlinx.coroutines.DelicateCoroutinesApi
3032
import kotlinx.coroutines.launch
3133
import kotlinx.serialization.encodeToString
34+
import kotlinx.serialization.json.jsonObject
35+
import kotlinx.serialization.json.jsonPrimitive
3236
import kotlin.test.Test
3337
import kotlin.test.assertEquals
3438
import kotlin.test.assertFailsWith
@@ -60,6 +64,26 @@ abstract class BaseSyncIntegrationTest(
6064
}
6165
}
6266

67+
@Test
68+
fun useParameters() =
69+
databaseTest {
70+
database.connect(connector, options = options, params = mapOf("foo" to JsonParam.String("bar")))
71+
turbineScope(timeout = 10.0.seconds) {
72+
val turbine = database.currentStatus.asFlow().testIn(this)
73+
turbine.waitFor { it.connected }
74+
turbine.cancel()
75+
}
76+
77+
requestedSyncStreams shouldHaveSingleElement {
78+
val params = it.jsonObject["parameters"]!!.jsonObject
79+
params.keys shouldHaveSingleElement "foo"
80+
params.values
81+
.first()
82+
.jsonPrimitive.content shouldBe "bar"
83+
true
84+
}
85+
}
86+
6387
@Test
6488
@OptIn(DelicateCoroutinesApi::class)
6589
fun closesResponseStreamOnDatabaseClose() =

core/src/commonIntegrationTest/kotlin/com/powersync/testutils/TestUtils.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,18 @@ import com.powersync.db.PowerSyncDatabaseImpl
1818
import com.powersync.db.schema.Schema
1919
import com.powersync.sync.LegacySyncImplementation
2020
import com.powersync.sync.SyncLine
21+
import com.powersync.utils.JsonUtil
2122
import dev.mokkery.answering.returns
2223
import dev.mokkery.everySuspend
2324
import dev.mokkery.mock
2425
import io.ktor.client.HttpClient
2526
import io.ktor.client.HttpClientConfig
27+
import io.ktor.client.engine.mock.toByteArray
2628
import kotlinx.coroutines.channels.Channel
2729
import kotlinx.coroutines.test.TestScope
2830
import kotlinx.coroutines.test.runTest
2931
import kotlinx.io.files.Path
32+
import kotlinx.serialization.json.JsonElement
3033

3134
expect val factory: DatabaseDriverFactory
3235

@@ -87,6 +90,7 @@ internal class ActiveDatabaseTest(
8790

8891
@OptIn(LegacySyncImplementation::class)
8992
var syncLines = Channel<SyncLine>()
93+
var requestedSyncStreams = mutableListOf<JsonElement>()
9094
var checkpointResponse: () -> WriteCheckpointResponse = {
9195
WriteCheckpointResponse(WriteCheckpointData("1000"))
9296
}
@@ -129,7 +133,15 @@ internal class ActiveDatabaseTest(
129133
suspend fun openDatabaseAndInitialize(): PowerSyncDatabaseImpl = openDatabase().also { it.readLock { } }
130134

131135
private fun createClient(config: HttpClientConfig<*>.() -> Unit): HttpClient {
132-
val engine = MockSyncService(syncLines) { checkpointResponse() }
136+
val engine =
137+
MockSyncService(
138+
lines = syncLines,
139+
generateCheckpoint = { checkpointResponse() },
140+
trackSyncRequest = {
141+
val parsed = JsonUtil.json.parseToJsonElement(it.body.toByteArray().decodeToString())
142+
requestedSyncStreams.add(parsed)
143+
},
144+
)
133145

134146
return HttpClient(engine) {
135147
config()

core/src/commonMain/kotlin/com/powersync/sync/SyncStream.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import kotlinx.coroutines.flow.flow
4848
import kotlinx.coroutines.launch
4949
import kotlinx.coroutines.withContext
5050
import kotlinx.datetime.Clock
51+
import kotlinx.serialization.Serializable
5152
import kotlinx.serialization.encodeToString
5253
import kotlinx.serialization.json.JsonElement
5354
import kotlinx.serialization.json.JsonObject
@@ -300,7 +301,12 @@ internal class SyncStream(
300301
var credentialsInvalidation: Job? = null,
301302
) {
302303
suspend fun start() {
303-
control("start", JsonUtil.json.encodeToString(params))
304+
@Serializable
305+
class StartParameters(
306+
val parameters: JsonObject,
307+
)
308+
309+
control("start", JsonUtil.json.encodeToString(StartParameters(params)))
304310
fetchLinesJob?.join()
305311
}
306312

core/src/commonTest/kotlin/com/powersync/testutils/MockSyncService.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import kotlinx.serialization.encodeToString
3737
internal class MockSyncService(
3838
private val lines: ReceiveChannel<SyncLine>,
3939
private val generateCheckpoint: () -> WriteCheckpointResponse,
40+
private val trackSyncRequest: suspend (HttpRequestData) -> Unit,
4041
) : HttpClientEngineBase("sync-service") {
4142
override val config: HttpClientEngineConfig
4243
get() = Config
@@ -52,6 +53,7 @@ internal class MockSyncService(
5253
val scope = CoroutineScope(context)
5354

5455
return if (data.url.encodedPath == "/sync/stream") {
56+
trackSyncRequest(data)
5557
val job =
5658
scope.writer {
5759
lines.consume {

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ kotlin.code.style=official
22
# Gradle
33
org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx2048M"
44
org.gradle.caching=true
5+
org.gradle.configuration-cache=true
56
# Compose
67
org.jetbrains.compose.experimental.uikit.enabled=true
78
# Android

0 commit comments

Comments
 (0)