diff --git a/libraries/apollo-api/src/commonMain/kotlin/com/apollographql/apollo3/api/Operations.kt b/libraries/apollo-api/src/commonMain/kotlin/com/apollographql/apollo3/api/Operations.kt index 55057e0f100..d314ac5ea60 100644 --- a/libraries/apollo-api/src/commonMain/kotlin/com/apollographql/apollo3/api/Operations.kt +++ b/libraries/apollo-api/src/commonMain/kotlin/com/apollographql/apollo3/api/Operations.kt @@ -6,6 +6,7 @@ import com.apollographql.apollo3.annotations.ApolloExperimental import com.apollographql.apollo3.api.internal.ResponseParser import com.apollographql.apollo3.api.json.JsonReader import com.apollographql.apollo3.api.json.JsonWriter +import com.apollographql.apollo3.api.json.buildJsonString import com.apollographql.apollo3.api.json.writeObject import com.apollographql.apollo3.exception.ApolloException import com.apollographql.apollo3.exception.ApolloNetworkException @@ -145,6 +146,19 @@ fun Operation.composeJsonResponse( } } +@ApolloExperimental +fun Operation.composeJsonResponse( + data: D, + customScalarAdapters: CustomScalarAdapters = CustomScalarAdapters.Empty, +): String { + return buildJsonString { + writeObject { + name("data") + adapter().toJson(this, customScalarAdapters, data) + } + } +} + /** * Parses the [JsonReader] into an [ApolloResponse] * diff --git a/libraries/apollo-runtime/src/commonTest/kotlin/test/network/NetworkMonitorTest.kt b/libraries/apollo-runtime/src/commonTest/kotlin/test/network/NetworkMonitorTest.kt index 9bf68846072..c3f511962c0 100644 --- a/libraries/apollo-runtime/src/commonTest/kotlin/test/network/NetworkMonitorTest.kt +++ b/libraries/apollo-runtime/src/commonTest/kotlin/test/network/NetworkMonitorTest.kt @@ -1,18 +1,21 @@ package test.network import app.cash.turbine.test +import com.apollographql.apollo3.ApolloClient import com.apollographql.apollo3.api.ApolloRequest import com.apollographql.apollo3.api.ApolloResponse import com.apollographql.apollo3.api.Operation import com.apollographql.apollo3.exception.ApolloNetworkException import com.apollographql.apollo3.interceptor.ApolloInterceptor import com.apollographql.apollo3.interceptor.ApolloInterceptorChain +import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.assertNoRequest import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.network.NetworkMonitor import com.apollographql.apollo3.testing.FooQuery import com.apollographql.apollo3.testing.internal.ApolloTestResult -import com.apollographql.apollo3.testing.mockServerTest +import com.apollographql.apollo3.testing.internal.runTest +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collect @@ -21,6 +24,7 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.takeWhile +import okio.use import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFails @@ -107,3 +111,19 @@ class NetworkMonitorInterceptor(private val networkMonitor: NetworkMonitor): Apo } } +class MockServerTest(val mockServer: MockServer, val apolloClient: ApolloClient, val scope: CoroutineScope) + +fun mockServerTest( + clientBuilder: ApolloClient.Builder.() -> Unit = {}, + block: suspend MockServerTest.() -> Unit +) = runTest(true) { + MockServer().use { mockServer -> + ApolloClient.Builder() + .serverUrl(mockServer.url()) + .apply(clientBuilder) + .build() + .use {apolloClient -> + MockServerTest(mockServer, apolloClient, this).block() + } + } +} diff --git a/libraries/apollo-runtime/src/commonTest/kotlin/test/network/WebSocketNetworkTransportTest.kt b/libraries/apollo-runtime/src/commonTest/kotlin/test/network/WebSocketNetworkTransportTest.kt index 4c9718fe6ef..98d52d088a1 100644 --- a/libraries/apollo-runtime/src/commonTest/kotlin/test/network/WebSocketNetworkTransportTest.kt +++ b/libraries/apollo-runtime/src/commonTest/kotlin/test/network/WebSocketNetworkTransportTest.kt @@ -11,6 +11,8 @@ import com.apollographql.apollo3.interceptor.addRetryOnErrorInterceptor import com.apollographql.apollo3.mockserver.CloseFrame import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.TextMessage +import com.apollographql.apollo3.mockserver.WebSocketBody +import com.apollographql.apollo3.mockserver.WebsocketMockRequest import com.apollographql.apollo3.mockserver.awaitWebSocketRequest import com.apollographql.apollo3.mockserver.enqueueWebSocket import com.apollographql.apollo3.mpp.Platform @@ -24,7 +26,7 @@ import com.apollographql.apollo3.testing.FooSubscription.Companion.nextMessage import com.apollographql.apollo3.testing.awaitSubscribe import com.apollographql.apollo3.testing.connectionAckMessage import com.apollographql.apollo3.testing.internal.runTest -import com.apollographql.apollo3.testing.mockServerWebSocketTest +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.merge import okio.use @@ -351,4 +353,57 @@ class WebSocketNetworkTransportTest { assertEquals("oh no!", message) } } -} \ No newline at end of file +} + +internal fun WebSocketBody.enqueueMessage(message: String) { + enqueueMessage(TextMessage(message)) +} + +class MockServerWebSocketTest( + val apolloClient: ApolloClient, + private val mockServer: MockServer, + val coroutineScope: CoroutineScope, +) { + /** + * Enqueue the response straight away + */ + val serverWriter: WebSocketBody = mockServer.enqueueWebSocket() + private var _serverReader: WebsocketMockRequest? = null + + val serverReader: WebsocketMockRequest + get() { + check(_serverReader != null) { + "You need to call awaitConnectionInit or awaitWebSocketRequest first" + } + return _serverReader!! + } + + suspend fun awaitWebSocketRequest() { + _serverReader = mockServer.awaitWebSocketRequest() + } + + suspend fun awaitConnectionInit() { + awaitWebSocketRequest() + + serverReader.awaitMessage() + serverWriter.enqueueMessage(TextMessage(connectionAckMessage())) + } +} + +fun mockServerWebSocketTest(customizeTransport: WebSocketNetworkTransport.Builder.() -> Unit = {}, block: suspend MockServerWebSocketTest.() -> Unit) = runTest(false) { + MockServer().use { mockServer -> + + ApolloClient.Builder() + .serverUrl(mockServer.url()) + .subscriptionNetworkTransport( + WebSocketNetworkTransport.Builder() + .serverUrl(mockServer.url()) + .apply(customizeTransport) + .build() + ) + .build().use { apolloClient -> + @Suppress("DEPRECATION") + MockServerWebSocketTest(apolloClient, mockServer, this@runTest).block() + } + } +} diff --git a/libraries/apollo-runtime/src/jvmTest/kotlin/RetryWebSocketsTest.kt b/libraries/apollo-runtime/src/jvmTest/kotlin/RetryWebSocketsTest.kt index 1d932a9668b..bc73212210b 100644 --- a/libraries/apollo-runtime/src/jvmTest/kotlin/RetryWebSocketsTest.kt +++ b/libraries/apollo-runtime/src/jvmTest/kotlin/RetryWebSocketsTest.kt @@ -17,7 +17,6 @@ import com.apollographql.apollo3.testing.FooSubscription.Companion.nextMessage import com.apollographql.apollo3.testing.awaitSubscribe import com.apollographql.apollo3.testing.connectionAckMessage import com.apollographql.apollo3.testing.internal.runTest -import com.apollographql.apollo3.testing.mockServerTest import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collect @@ -25,6 +24,8 @@ import kotlinx.coroutines.flow.take import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeout import okio.use +import test.network.enqueueMessage +import test.network.mockServerTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertIs @@ -231,7 +232,6 @@ class RetryWebSocketsTest { clientBuilder = { retryOnError { it.operation is Subscription } }, - skipDelays = false ) { mockServer.enqueue(MockResponse.Builder().statusCode(500).build()) diff --git a/libraries/apollo-testing-support/api/apollo-testing-support.api b/libraries/apollo-testing-support/api/apollo-testing-support.api index 17979d1c81f..517ac993781 100644 --- a/libraries/apollo-testing-support/api/apollo-testing-support.api +++ b/libraries/apollo-testing-support/api/apollo-testing-support.api @@ -15,9 +15,9 @@ public final class com/apollographql/apollo3/testing/FooQuery$Companion { } public final class com/apollographql/apollo3/testing/FooSubscription$Companion { - public final fun completeMessage (Ljava/lang/String;)Lcom/apollographql/apollo3/mockserver/TextMessage; - public final fun errorMessage (Ljava/lang/String;Ljava/lang/String;)Lcom/apollographql/apollo3/mockserver/TextMessage; - public final fun nextMessage (Ljava/lang/String;I)Lcom/apollographql/apollo3/mockserver/TextMessage; + public final fun completeMessage (Ljava/lang/String;)Ljava/lang/String; + public final fun errorMessage (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + public final fun nextMessage (Ljava/lang/String;I)Ljava/lang/String; } public final class com/apollographql/apollo3/testing/MockserverKt { diff --git a/libraries/apollo-testing-support/src/appleMain/kotlin/com/apollographql/apollo3/testing/readFile.apple.kt b/libraries/apollo-testing-support/src/appleMain/kotlin/com/apollographql/apollo3/testing/readFile.apple.kt index 4e87227ec8c..a1392e22e58 100644 --- a/libraries/apollo-testing-support/src/appleMain/kotlin/com/apollographql/apollo3/testing/readFile.apple.kt +++ b/libraries/apollo-testing-support/src/appleMain/kotlin/com/apollographql/apollo3/testing/readFile.apple.kt @@ -1,5 +1,11 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince + +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") actual fun shouldUpdateTestFixtures(): Boolean = false +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") actual val testsPath: String = "../" diff --git a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/FilesystemCommon.kt b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/FilesystemCommon.kt index 7a6d14d18b8..c9e19e4541b 100644 --- a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/FilesystemCommon.kt +++ b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/FilesystemCommon.kt @@ -2,9 +2,11 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import com.apollographql.apollo3.api.json.JsonReader import com.apollographql.apollo3.api.json.jsonReader import okio.IOException +import okio.Path import okio.Path.Companion.toPath import okio.buffer import okio.use @@ -17,10 +19,14 @@ import kotlin.jvm.JvmName * * @param path: the path to the file, from the "tests" directory */ +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) fun checkFile(actualText: String, path: String) { + @Suppress("DEPRECATION") val updateTestFixtures = shouldUpdateTestFixtures() val expected = path.toTestsPath() val expectedText = try { + @Suppress("DEPRECATION") HostFileSystem.openReadOnly(expected).source().buffer().readUtf8() } catch (e: IOException) { if (updateTestFixtures) { @@ -34,7 +40,9 @@ fun checkFile(actualText: String, path: String) { if (actualText != expectedText) { if (updateTestFixtures) { + @Suppress("DEPRECATION") HostFileSystem.delete(expected) + @Suppress("DEPRECATION") HostFileSystem.openReadWrite( file = expected, ).use { @@ -53,18 +61,27 @@ fun checkFile(actualText: String, path: String) { } } -private fun String.toTestsPath() = testsPath.toPath().resolve(this.toPath()) +private fun String.toTestsPath(): Path { + @Suppress("DEPRECATION") + return testsPath.toPath().resolve(this.toPath()) +} /** * @param path: the path to the file, from the "tests" directory */ +@Deprecated("This function is not Apollo specific and will be removed in a future version. Copy/paste it in your codebase if you need it") +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) fun pathToUtf8(path: String): String { + @Suppress("DEPRECATION") return HostFileSystem.openReadOnly(path.toTestsPath()).source().buffer().readUtf8() } /** * @param path: the path to the file, from the "tests" directory */ +@Deprecated("This function is not Apollo specific and will be removed in a future version. Copy/paste it in your codebase if you need it") +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) fun pathToJsonReader(path: String): JsonReader { + @Suppress("DEPRECATION") return HostFileSystem.openReadOnly(path.toTestsPath()).source().buffer().jsonReader() } diff --git a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/FooOperation.kt b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/FooOperation.kt index 34e2fbec062..fe078b25ead 100644 --- a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/FooOperation.kt +++ b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/FooOperation.kt @@ -1,5 +1,6 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import com.apollographql.apollo3.annotations.ApolloExperimental import com.apollographql.apollo3.api.Adapter import com.apollographql.apollo3.api.CompiledField @@ -14,7 +15,6 @@ import com.apollographql.apollo3.api.json.buildJsonString import com.apollographql.apollo3.api.json.writeArray import com.apollographql.apollo3.api.json.writeObject import com.apollographql.apollo3.api.missingField -import com.apollographql.apollo3.mockserver.TextMessage /** * [FooQuery] is a query for tests that doesn't require codegen. @@ -22,6 +22,9 @@ import com.apollographql.apollo3.mockserver.TextMessage * Use it to test parts of the runtime without having to use included builds. */ @ApolloExperimental +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Suppress("DEPRECATION") class FooQuery: FooOperation("query"), Query { companion object { val successResponse = "{\"data\": {\"foo\": 42}}" @@ -34,9 +37,12 @@ class FooQuery: FooOperation("query"), Query { * Use it to test parts of the runtime without having to use included builds. */ @ApolloExperimental +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Suppress("DEPRECATION") class FooSubscription: FooOperation("subscription"), Subscription { companion object { - fun nextMessage(id: String, foo: Int): TextMessage { + fun nextMessage(id: String, foo: Int): String { return buildJsonString { writeObject { name("id") @@ -52,10 +58,10 @@ class FooSubscription: FooOperation("subscription"), Subscription { class Data(val foo: Int): Query.Data, Subscription.Data { override fun toString(): String { diff --git a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/channels.kt b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/channels.kt index c3e27cbd00f..835bee5392f 100644 --- a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/channels.kt +++ b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/channels.kt @@ -1,16 +1,21 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import com.apollographql.apollo3.annotations.ApolloExperimental import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.withTimeout @ApolloExperimental +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This function is not Apollo specific and will be removed in a future version. Copy/paste it in your codebase if you need it") suspend fun Channel.awaitElement(timeoutMillis: Long = 30000) = withTimeout(timeoutMillis) { receive() } @ApolloExperimental +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This function is not Apollo specific and will be removed in a future version. Copy/paste it in your codebase if you need it") suspend fun Channel.assertNoElement(timeoutMillis: Long = 300): Unit { try { withTimeout(timeoutMillis) { diff --git a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/mockserver.kt b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/mockserver.kt index 2d5e896266f..034b063d3e0 100644 --- a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/mockserver.kt +++ b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/mockserver.kt @@ -1,5 +1,6 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import com.apollographql.apollo3.annotations.ApolloExperimental import com.apollographql.apollo3.api.AnyAdapter import com.apollographql.apollo3.api.CustomScalarAdapters @@ -12,13 +13,21 @@ import com.apollographql.apollo3.api.toJson import com.apollographql.apollo3.mockserver.MockResponse import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.TextMessage -import com.apollographql.apollo3.mockserver.WebSocketMessage import com.apollographql.apollo3.mockserver.WebsocketMockRequest import com.apollographql.apollo3.mockserver.enqueueString import okio.Buffer import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated( + "This is only used for internal Apollo tests and will be removed in a future version.", + ReplaceWith( + "enqueueString(operation.composeJsonResponse(data, customScalarAdapters), delayMs)", + "com.apollographql.apollo3.mockserver.enqueueString", + "com.apollographql.apollo3.api.composeJsonResponse", + ) +) fun MockServer.enqueue( operation: Operation, data: D, @@ -31,6 +40,10 @@ fun MockServer.enqueue( enqueueString(json, delayMs) } +@Deprecated( + "This is only used for internal Apollo tests and will be removed in a future version.", +) +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) fun MockServer.enqueueData( data: Map, customScalarAdapters: CustomScalarAdapters = CustomScalarAdapters.Empty, @@ -50,7 +63,15 @@ fun MockServer.enqueueData( ) } - +@Deprecated( + "This is only used for internal Apollo tests and will be removed in a future version.", + ReplaceWith( + "enqueueString(data.toResponseJson(customScalarAdapters), delayMillis, statusCode)", + "com.apollographql.apollo3.mockserver.enqueueString", + "com.apollographql.apollo3.api.toResponseJson", + ) +) +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) fun MockServer.enqueueData( data: Operation.Data, customScalarAdapters: CustomScalarAdapters = CustomScalarAdapters.Empty, @@ -110,5 +131,5 @@ suspend fun WebsocketMockRequest.awaitComplete(timeout: Duration = 1.seconds) { } @ApolloExperimental -fun connectionAckMessage(): WebSocketMessage = TextMessage("{\"type\": \"connection_ack\"}") +fun connectionAckMessage(): String = "{\"type\": \"connection_ack\"}" diff --git a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/readFile.kt b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/readFile.kt index 1f1997a5207..c558239f7bd 100644 --- a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/readFile.kt +++ b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/readFile.kt @@ -1,5 +1,6 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import com.apollographql.apollo3.annotations.ApolloExperimental import okio.FileSystem @@ -7,9 +8,13 @@ import okio.FileSystem * The host filesystem */ @ApolloExperimental +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This function is not Apollo specific and will be removed in a future version. Copy/paste it in your codebase if you need it") expect val HostFileSystem: FileSystem @ApolloExperimental +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") expect fun shouldUpdateTestFixtures(): Boolean /** @@ -17,5 +22,7 @@ expect fun shouldUpdateTestFixtures(): Boolean * We need this for JS tests where the CWD is not properly set at the beginning of tests */ @ApolloExperimental +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") expect val testsPath: String diff --git a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/runTest.kt b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/runTest.kt index bb8ee37e3c8..d202374e0fa 100644 --- a/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/runTest.kt +++ b/libraries/apollo-testing-support/src/commonMain/kotlin/com/apollographql/apollo3/testing/runTest.kt @@ -1,91 +1,37 @@ package com.apollographql.apollo3.testing import com.apollographql.apollo3.ApolloClient +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import com.apollographql.apollo3.annotations.ApolloExperimental import com.apollographql.apollo3.mockserver.MockServer -import com.apollographql.apollo3.mockserver.WebSocketBody -import com.apollographql.apollo3.mockserver.WebsocketMockRequest -import com.apollographql.apollo3.mockserver.awaitWebSocketRequest -import com.apollographql.apollo3.mockserver.enqueueWebSocket -import com.apollographql.apollo3.network.websocket.WebSocketNetworkTransport import com.apollographql.apollo3.testing.internal.runTest import kotlinx.coroutines.CoroutineScope import okio.use @ApolloExperimental +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) class MockServerTest(val mockServer: MockServer, val apolloClient: ApolloClient, val scope: CoroutineScope) /** * A convenience function that makes sure the MockServer and ApolloClient are properly closed at the end of the test */ @ApolloExperimental +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Suppress("DEPRECATION") fun mockServerTest( skipDelays: Boolean = true, clientBuilder: ApolloClient.Builder.() -> Unit = {}, block: suspend MockServerTest.() -> Unit ) = runTest(skipDelays) { - val mockServer = MockServer() - - val apolloClient = ApolloClient.Builder() - .serverUrl(mockServer.url()) - .apply(clientBuilder) - .build() - - try { - apolloClient.use { - MockServerTest(mockServer, it, this).block() - } - } finally { - mockServer.close() - } -} - -@ApolloExperimental -class MockServerWebSocketTest( - val apolloClient: ApolloClient, - private val mockServer: MockServer, - val coroutineScope: CoroutineScope, -) { - /** - * Enqueue the response straight away - */ - val serverWriter: WebSocketBody = mockServer.enqueueWebSocket() - private var _serverReader: WebsocketMockRequest? = null - - val serverReader: WebsocketMockRequest - get() { - check(_serverReader != null) { - "You need to call awaitConnectionInit or awaitWebSocketRequest first" - } - return _serverReader!! - } - - suspend fun awaitWebSocketRequest() { - _serverReader = mockServer.awaitWebSocketRequest() - } - - suspend fun awaitConnectionInit() { - awaitWebSocketRequest() - - serverReader.awaitMessage() - serverWriter.enqueueMessage(connectionAckMessage()) - } -} - -@ApolloExperimental -fun mockServerWebSocketTest(customizeTransport: WebSocketNetworkTransport.Builder.() -> Unit = {}, block: suspend MockServerWebSocketTest.() -> Unit) = runTest(false) { MockServer().use { mockServer -> - ApolloClient.Builder() .serverUrl(mockServer.url()) - .subscriptionNetworkTransport( - WebSocketNetworkTransport.Builder() - .serverUrl(mockServer.url()) - .apply(customizeTransport) - .build() - ) - .build().use { apolloClient -> - MockServerWebSocketTest(apolloClient, mockServer, this@runTest).block() + .apply(clientBuilder) + .build() + .use {apolloClient -> + MockServerTest(mockServer, apolloClient, this).block() } } -} \ No newline at end of file +} diff --git a/libraries/apollo-testing-support/src/concurrentMain/kotlin/com/apollographql/apollo3/testing/readFile.concurrent.kt b/libraries/apollo-testing-support/src/concurrentMain/kotlin/com/apollographql/apollo3/testing/readFile.concurrent.kt index 9342e50114a..da28415a124 100644 --- a/libraries/apollo-testing-support/src/concurrentMain/kotlin/com/apollographql/apollo3/testing/readFile.concurrent.kt +++ b/libraries/apollo-testing-support/src/concurrentMain/kotlin/com/apollographql/apollo3/testing/readFile.concurrent.kt @@ -1,5 +1,6 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import com.apollographql.apollo3.annotations.ApolloExperimental import okio.FileSystem import okio.SYSTEM @@ -8,5 +9,7 @@ import okio.SYSTEM * The host filesystem */ @ApolloExperimental +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This function is not Apollo specific and will be removed in a future version. Copy/paste it in your codebase if you need it") actual val HostFileSystem: FileSystem get() = FileSystem.SYSTEM \ No newline at end of file diff --git a/libraries/apollo-testing-support/src/jsMain/kotlin/com/apollographql/apollo3/testing/readFile.js.kt b/libraries/apollo-testing-support/src/jsMain/kotlin/com/apollographql/apollo3/testing/readFile.js.kt index 77a6685b7c9..9b5e320b067 100644 --- a/libraries/apollo-testing-support/src/jsMain/kotlin/com/apollographql/apollo3/testing/readFile.js.kt +++ b/libraries/apollo-testing-support/src/jsMain/kotlin/com/apollographql/apollo3/testing/readFile.js.kt @@ -1,11 +1,18 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import okio.FileSystem import okio.NodeJsFileSystem +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This function is not Apollo specific and will be removed in a future version. Copy/paste it in your codebase if you need it") actual val HostFileSystem: FileSystem = NodeJsFileSystem +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") actual fun shouldUpdateTestFixtures(): Boolean = false // Workaround for https://youtrack.jetbrains.com/issue/KT-49125 +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") actual val testsPath: String = "../../../../../tests/" \ No newline at end of file diff --git a/libraries/apollo-testing-support/src/jvmMain/kotlin/com/apollographql/apollo3/testing/readFile.jvm.kt b/libraries/apollo-testing-support/src/jvmMain/kotlin/com/apollographql/apollo3/testing/readFile.jvm.kt index 457d7ac8a02..69fd5096e7f 100644 --- a/libraries/apollo-testing-support/src/jvmMain/kotlin/com/apollographql/apollo3/testing/readFile.jvm.kt +++ b/libraries/apollo-testing-support/src/jvmMain/kotlin/com/apollographql/apollo3/testing/readFile.jvm.kt @@ -1,5 +1,9 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince + +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") actual fun shouldUpdateTestFixtures(): Boolean { if (System.getenv("updateTestFixtures") != null) { return true @@ -11,4 +15,6 @@ actual fun shouldUpdateTestFixtures(): Boolean { } } +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") actual val testsPath: String = "../" \ No newline at end of file diff --git a/libraries/apollo-testing-support/src/wasmJsMain/kotlin/com/apollographql/apollo3/testing/readFile.wasmJs.kt b/libraries/apollo-testing-support/src/wasmJsMain/kotlin/com/apollographql/apollo3/testing/readFile.wasmJs.kt index 16afb996645..b743c81dece 100644 --- a/libraries/apollo-testing-support/src/wasmJsMain/kotlin/com/apollographql/apollo3/testing/readFile.wasmJs.kt +++ b/libraries/apollo-testing-support/src/wasmJsMain/kotlin/com/apollographql/apollo3/testing/readFile.wasmJs.kt @@ -1,16 +1,21 @@ package com.apollographql.apollo3.testing +import com.apollographql.apollo3.annotations.ApolloDeprecatedSince import com.apollographql.apollo3.annotations.ApolloExperimental import okio.FileSystem /** * The host filesystem */ +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This function is not Apollo specific and will be removed in a future version. Copy/paste it in your codebase if you need it") @ApolloExperimental actual val HostFileSystem: FileSystem get() = TODO("Not yet implemented") @ApolloExperimental +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") actual fun shouldUpdateTestFixtures(): Boolean { TODO("Not yet implemented") } @@ -20,5 +25,7 @@ actual fun shouldUpdateTestFixtures(): Boolean { * We need this for JS tests where the CWD is not properly set at the beginning of tests */ @ApolloExperimental +@ApolloDeprecatedSince(ApolloDeprecatedSince.Version.v4_0_0) +@Deprecated("This is only used for internal Apollo tests and will be removed in a future version.") actual val testsPath: String get() = TODO("Not yet implemented") \ No newline at end of file diff --git a/tests/gzip/src/commonTest/kotlin/test/GzipTest.kt b/tests/gzip/src/commonTest/kotlin/test/GzipTest.kt index 074d509eea1..4d45a37d028 100644 --- a/tests/gzip/src/commonTest/kotlin/test/GzipTest.kt +++ b/tests/gzip/src/commonTest/kotlin/test/GzipTest.kt @@ -1,10 +1,13 @@ package test +import com.apollographql.apollo3.ApolloClient import com.apollographql.apollo3.mockserver.MockResponse +import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.testing.HostFileSystem -import com.apollographql.apollo3.testing.mockServerTest +import com.apollographql.apollo3.testing.internal.runTest import com.apollographql.apollo3.testing.testsPath import gzip.GetStringQuery +import kotlinx.coroutines.CoroutineScope import okio.Path.Companion.toPath import okio.buffer import okio.use @@ -16,6 +19,7 @@ class GzipTest { @Test fun gzipTest() = mockServerTest { // This contains a valid response encoded with gzip + @Suppress("DEPRECATION") val byteString = HostFileSystem.openReadOnly(testsPath.toPath().resolve("gzip/lorem.txt.gz")).use { it.source().buffer().readByteString() } @@ -31,4 +35,21 @@ class GzipTest { assertEquals(2225, response.data?.longString?.length) assertTrue(response.data?.longString?.startsWith("Lorem ipsum dolor sit amet") == true) } -} \ No newline at end of file +} + +class MockServerTest(val mockServer: MockServer, val apolloClient: ApolloClient, val scope: CoroutineScope) + +fun mockServerTest( + clientBuilder: ApolloClient.Builder.() -> Unit = {}, + block: suspend MockServerTest.() -> Unit +) = runTest(true) { + MockServer().use { mockServer -> + ApolloClient.Builder() + .serverUrl(mockServer.url()) + .apply(clientBuilder) + .build() + .use {apolloClient -> + MockServerTest(mockServer, apolloClient, this).block() + } + } +} diff --git a/tests/http-cache/src/test/kotlin/HttpCacheTest.kt b/tests/http-cache/src/test/kotlin/HttpCacheTest.kt index b1b6ae35463..b30d7196e53 100644 --- a/tests/http-cache/src/test/kotlin/HttpCacheTest.kt +++ b/tests/http-cache/src/test/kotlin/HttpCacheTest.kt @@ -1,5 +1,7 @@ + import com.apollographql.apollo3.ApolloClient import com.apollographql.apollo3.api.http.HttpResponse +import com.apollographql.apollo3.api.toResponseJson import com.apollographql.apollo3.cache.http.ApolloHttpCache import com.apollographql.apollo3.cache.http.DiskLruHttpCache import com.apollographql.apollo3.cache.http.HttpFetchPolicy @@ -14,7 +16,6 @@ import com.apollographql.apollo3.mockserver.awaitRequest import com.apollographql.apollo3.mockserver.enqueueError import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.network.okHttpClient -import com.apollographql.apollo3.testing.enqueueData import com.apollographql.apollo3.testing.internal.runTest import httpcache.GetRandom2Query import httpcache.GetRandomQuery @@ -53,14 +54,14 @@ class HttpCacheTest { .build() } - private suspend fun tearDown() { + private fun tearDown() { apolloClient.close() mockServer.close() } @Test fun DefaultIsCacheFirst() = runTest(before = { before() }, after = { tearDown() }) { - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) runBlocking { var response = apolloClient.query(GetRandomQuery()).execute() @@ -75,7 +76,7 @@ class HttpCacheTest { @Test fun CacheFirst() = runTest(before = { before() }, after = { tearDown() }) { - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) runBlocking { var response = apolloClient.query(GetRandomQuery()).execute() @@ -92,7 +93,7 @@ class HttpCacheTest { @Test fun NetworkOnly() = runTest(before = { before() }, after = { tearDown() }) { - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) mockServer.enqueueError(statusCode = 500) runBlocking { @@ -111,7 +112,7 @@ class HttpCacheTest { @Test fun NetworkFirst() = runTest(before = { before() }, after = { tearDown() }) { - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) mockServer.enqueueError(statusCode = 500) runBlocking { @@ -130,7 +131,7 @@ class HttpCacheTest { @Test fun Timeout() = runTest(before = { before() }, after = { tearDown() }) { - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) runBlocking { var response = apolloClient.query(GetRandomQuery()).execute() @@ -154,8 +155,8 @@ class HttpCacheTest { @Test fun DifferentQueriesDoNotOverlap() = runTest(before = { before() }, after = { tearDown() }) { - mockServer.enqueueData(data) - mockServer.enqueueData(data2) + mockServer.enqueueString(data.toResponseJson()) + mockServer.enqueueString(data2.toResponseJson()) runBlocking { val response = apolloClient.query(GetRandomQuery()).execute() @@ -250,7 +251,7 @@ class HttpCacheTest { .httpFetchPolicy(HttpFetchPolicy.CacheOnly) .build() - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) assertNotNull( apolloClient.query(GetRandomQuery()) @@ -263,12 +264,12 @@ class HttpCacheTest { @Test fun errorInSubscriptionDoesntRemoveCachedResult() = runTest(before = { before() }, after = { tearDown() }) { runBlocking { - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) var response = apolloClient.query(GetRandomQuery()).execute() assertEquals(42, response.data?.random) assertEquals(false, response.isFromHttpCache) - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) try { apolloClient.subscription(RandomSubscription()).execute() } catch (ignored: Exception) { @@ -284,7 +285,7 @@ class HttpCacheTest { fun httpCacheCleansPreviousInterceptor() = runTest { mockServer = MockServer() val httpCache1 = CountingApolloHttpCache() - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) val apolloClient = ApolloClient.Builder() .serverUrl(mockServer.url()) .httpCache(httpCache1) @@ -296,7 +297,7 @@ class HttpCacheTest { val apolloClient2 = apolloClient.newBuilder() .httpCache(httpCache2) .build() - mockServer.enqueueData(data) + mockServer.enqueueString(data.toResponseJson()) apolloClient2.query(GetRandomQuery()).execute() assertEquals(1, httpCache1.writes) assertEquals(1, httpCache2.writes) diff --git a/tests/http-headers/src/test/kotlin/HttpHeaderTest.kt b/tests/http-headers/src/test/kotlin/HttpHeaderTest.kt index 14f9bcc291a..ff0c7cf1006 100644 --- a/tests/http-headers/src/test/kotlin/HttpHeaderTest.kt +++ b/tests/http-headers/src/test/kotlin/HttpHeaderTest.kt @@ -1,11 +1,15 @@ +import com.apollographql.apollo3.ApolloClient import com.apollographql.apollo3.api.DefaultUpload import com.apollographql.apollo3.api.Optional +import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.mockserver.headerValueOf -import com.apollographql.apollo3.testing.mockServerTest +import com.apollographql.apollo3.testing.internal.runTest import httpheaders.GetRandomQuery import httpheaders.UploadMutation +import kotlinx.coroutines.CoroutineScope +import okio.use import kotlin.test.Test import kotlin.test.assertEquals @@ -54,3 +58,20 @@ class HttpHeadersTest { } } } + +class MockServerTest(val mockServer: MockServer, val apolloClient: ApolloClient, val scope: CoroutineScope) + +fun mockServerTest( + clientBuilder: ApolloClient.Builder.() -> Unit = {}, + block: suspend MockServerTest.() -> Unit +) = runTest(true) { + MockServer().use { mockServer -> + ApolloClient.Builder() + .serverUrl(mockServer.url()) + .apply(clientBuilder) + .build() + .use {apolloClient -> + MockServerTest(mockServer, apolloClient, this).block() + } + } +} diff --git a/tests/integration-tests/src/commonTest/kotlin/test/FetchPolicyTest.kt b/tests/integration-tests/src/commonTest/kotlin/test/FetchPolicyTest.kt index 971d4180821..2320ead7b86 100644 --- a/tests/integration-tests/src/commonTest/kotlin/test/FetchPolicyTest.kt +++ b/tests/integration-tests/src/commonTest/kotlin/test/FetchPolicyTest.kt @@ -37,7 +37,6 @@ import com.apollographql.apollo3.mockserver.enqueueError import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.testing.assertNoElement import com.apollographql.apollo3.testing.awaitElement -import com.apollographql.apollo3.testing.enqueue import com.apollographql.apollo3.testing.internal.runTest import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay @@ -76,7 +75,7 @@ class FetchPolicyTest { fun cacheFirst() = runTest(before = { setUp() }, after = { tearDown() }) { val query = HeroNameQuery() val data = HeroNameQuery.Data(HeroNameQuery.Hero("R2-D2")) - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) // First query should hit the network and save in cache var response = apolloClient.query(query) @@ -106,7 +105,7 @@ class FetchPolicyTest { apolloClient = apolloClient.newBuilder().build() val query = HeroNameQuery() val data = HeroNameQuery.Data(HeroNameQuery.Hero("R2-D2")) - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) // First query should hit the network and save in cache @Suppress("DEPRECATION") @@ -146,7 +145,7 @@ class FetchPolicyTest { val query = HeroNameQuery() val data = HeroNameQuery.Data(HeroNameQuery.Hero("R2-D2")) - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) // First query should hit the network and save in cache @Suppress("DEPRECATION") @@ -194,14 +193,14 @@ class FetchPolicyTest { val call = apolloClient.query(query).fetchPolicy(FetchPolicy.NetworkFirst) // First query should hit the network and save in cache - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) var response = call.execute() assertNotNull(response.data) assertFalse(response.isFromCache) // Now data is cached but it shouldn't be used since network will go through - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) response = call.execute() assertNotNull(response.data) @@ -233,14 +232,14 @@ class FetchPolicyTest { val call = apolloClient.query(query).fetchPolicy(FetchPolicy.NetworkFirst) // First query should hit the network and save in cache - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) var response = call.execute() assertNotNull(response.data) assertFalse(response.isFromCache) // Now data is cached but it shouldn't be used since network will go through - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) response = call.execute() assertNotNull(response.data) @@ -275,7 +274,7 @@ class FetchPolicyTest { val call = apolloClient.query(query).fetchPolicy(FetchPolicy.NetworkFirst) // First query should hit the network and save in cache - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) @Suppress("DEPRECATION") var responses = call.toFlowV3() responses.test { @@ -286,7 +285,7 @@ class FetchPolicyTest { } // Now data is cached but it shouldn't be used since network will go through - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) @Suppress("DEPRECATION") responses = call.toFlowV3() responses.test { @@ -324,7 +323,7 @@ class FetchPolicyTest { val data = HeroNameQuery.Data(HeroNameQuery.Hero("R2-D2")) // First query should hit the network and save in cache - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) var response = apolloClient.query(query).execute() assertNotNull(response.data) @@ -346,7 +345,7 @@ class FetchPolicyTest { val call = apolloClient.query(query).fetchPolicy(FetchPolicy.NetworkOnly) // First query should hit the network and save in cache - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) val response = call.execute() assertNotNull(response.data) @@ -366,7 +365,7 @@ class FetchPolicyTest { val call = apolloClient.query(query).fetchPolicy(FetchPolicy.NetworkOnly) // First query should hit the network and save in cache - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) @Suppress("DEPRECATION") val response = call.executeV3() @@ -400,7 +399,7 @@ class FetchPolicyTest { // Make the network return something // Cache Error + Network Success => 2 responses - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) var responses = apolloClient.query(query).fetchPolicy(FetchPolicy.CacheAndNetwork).toFlow().catch { caught = it }.toList() assertNull(caught) @@ -426,7 +425,7 @@ class FetchPolicyTest { assertIs(responses[1].exception) // Cache Success + Network Success => 2 responses - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) responses = apolloClient.query(query).fetchPolicy(FetchPolicy.CacheAndNetwork).toFlow().toList() assertEquals(2, responses.size) @@ -476,7 +475,7 @@ class FetchPolicyTest { // Make the network return something // Cache Error + Network Success => 1 response (no exception) - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) @Suppress("DEPRECATION") var responses = apolloClient.query(query).fetchPolicy(FetchPolicy.CacheAndNetwork) .toFlowV3().catch { caught = it }.toList() @@ -501,7 +500,7 @@ class FetchPolicyTest { assertEquals("R2-D2", responses[0].data?.hero?.name) // Cache Success + Network Success => 1 response - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) @Suppress("DEPRECATION") responses = apolloClient.query(query).fetchPolicy(FetchPolicy.CacheAndNetwork).toFlowV3().toList() @@ -628,7 +627,7 @@ class FetchPolicyTest { fun isFromCache() = runTest(before = { setUp() }, after = { tearDown() }) { val query = HeroNameQuery() val data = HeroNameQuery.Data(HeroNameQuery.Hero("R2-D2")) - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) // NetworkOnly / hit var response = apolloClient.query(query) @@ -681,7 +680,7 @@ class FetchPolicyTest { assertTrue(responses[1].isFromCache) // CacheAndNetwork / hit / hit - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) responses = apolloClient.query(query) .fetchPolicy(FetchPolicy.CacheAndNetwork) .toFlow() diff --git a/tests/integration-tests/src/commonTest/kotlin/test/HTTPHeadersTest.kt b/tests/integration-tests/src/commonTest/kotlin/test/HTTPHeadersTest.kt index cbf4cbf338b..be273ac38de 100644 --- a/tests/integration-tests/src/commonTest/kotlin/test/HTTPHeadersTest.kt +++ b/tests/integration-tests/src/commonTest/kotlin/test/HTTPHeadersTest.kt @@ -8,8 +8,8 @@ import com.apollographql.apollo3.integration.normalizer.HeroNameQuery import com.apollographql.apollo3.mockserver.MockResponse import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.awaitRequest +import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.network.http.HttpInfo -import com.apollographql.apollo3.testing.enqueue import com.apollographql.apollo3.testing.internal.runTest import kotlin.test.Test import kotlin.test.assertEquals @@ -34,7 +34,7 @@ class HTTPHeadersTest { val query = HeroNameQuery() val data = HeroNameQuery.Data(HeroNameQuery.Hero("R2-D2")) - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) val response = apolloClient.query(query).execute() diff --git a/tests/integration-tests/src/commonTest/kotlin/test/HttpGetTest.kt b/tests/integration-tests/src/commonTest/kotlin/test/HttpGetTest.kt index cc395a1ec71..aab9f6883fa 100644 --- a/tests/integration-tests/src/commonTest/kotlin/test/HttpGetTest.kt +++ b/tests/integration-tests/src/commonTest/kotlin/test/HttpGetTest.kt @@ -1,13 +1,16 @@ package test +import com.apollographql.apollo3.ApolloClient import com.apollographql.apollo3.api.http.HttpMethod import com.apollographql.apollo3.integration.normalizer.HeroAndFriendsNamesQuery import com.apollographql.apollo3.integration.normalizer.SearchHeroQuery import com.apollographql.apollo3.integration.normalizer.type.Episode +import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.awaitRequest import com.apollographql.apollo3.mockserver.enqueueString -import com.apollographql.apollo3.testing.enqueueData -import com.apollographql.apollo3.testing.mockServerTest +import com.apollographql.apollo3.testing.internal.runTest +import kotlinx.coroutines.CoroutineScope +import okio.use import kotlin.test.Test import kotlin.test.assertEquals @@ -42,7 +45,7 @@ class HttpGetTest { @Test fun encodeReservedCharactersTest() = mockServerTest { // Response not needed, just testing generated url - mockServer.enqueueData(data = emptyMap()) + mockServer.enqueueString("") apolloClient.query(SearchHeroQuery("!#$&'()*+,/:;=?@[]{}% ")) .httpMethod(HttpMethod.Get) .execute() @@ -52,3 +55,20 @@ class HttpGetTest { ) } } + +class MockServerTest(val mockServer: MockServer, val apolloClient: ApolloClient, val scope: CoroutineScope) + +fun mockServerTest( + clientBuilder: ApolloClient.Builder.() -> Unit = {}, + block: suspend MockServerTest.() -> Unit +) = runTest(true) { + MockServer().use { mockServer -> + ApolloClient.Builder() + .serverUrl(mockServer.url()) + .apply(clientBuilder) + .build() + .use {apolloClient -> + MockServerTest(mockServer, apolloClient, this).block() + } + } +} diff --git a/tests/integration-tests/src/commonTest/kotlin/test/OtherCacheTest.kt b/tests/integration-tests/src/commonTest/kotlin/test/OtherCacheTest.kt index 71fd9048a44..5059ef52f7e 100644 --- a/tests/integration-tests/src/commonTest/kotlin/test/OtherCacheTest.kt +++ b/tests/integration-tests/src/commonTest/kotlin/test/OtherCacheTest.kt @@ -4,6 +4,7 @@ import IdCacheKeyGenerator import IdCacheResolver import assertEquals2 import com.apollographql.apollo3.ApolloClient +import com.apollographql.apollo3.api.composeJsonResponse import com.apollographql.apollo3.cache.normalized.ApolloStore import com.apollographql.apollo3.cache.normalized.FetchPolicy import com.apollographql.apollo3.cache.normalized.api.MemoryCacheFactory @@ -20,7 +21,6 @@ import com.apollographql.apollo3.integration.normalizer.UpdateReviewWithoutVaria import com.apollographql.apollo3.integration.normalizer.type.Episode import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.enqueueString -import com.apollographql.apollo3.testing.enqueue import com.apollographql.apollo3.testing.internal.runTest import kotlinx.datetime.Instant import testFixtureToUtf8 @@ -160,7 +160,7 @@ class OtherCacheTest { // Store in the cache val instant = Instant.fromEpochMilliseconds(0L) val data = InstantQuery.Data(instant) - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) apolloClient.query(query).execute() // Get from the cache @@ -181,7 +181,7 @@ class OtherCacheTest { "Great" ) ) - mockServer.enqueue(mutation, data) + mockServer.enqueueString(mutation.composeJsonResponse(data)) apolloClient.mutation(mutation).execute() val storeData = store.readOperation(mutation) diff --git a/tests/integration-tests/src/commonTest/kotlin/test/WatcherTest.kt b/tests/integration-tests/src/commonTest/kotlin/test/WatcherTest.kt index 03c4a91567d..94faa869825 100644 --- a/tests/integration-tests/src/commonTest/kotlin/test/WatcherTest.kt +++ b/tests/integration-tests/src/commonTest/kotlin/test/WatcherTest.kt @@ -4,6 +4,7 @@ import IdCacheKeyGenerator import com.apollographql.apollo3.ApolloClient import com.apollographql.apollo3.api.ApolloResponse import com.apollographql.apollo3.api.CustomScalarAdapters +import com.apollographql.apollo3.api.composeJsonResponse import com.apollographql.apollo3.cache.normalized.ApolloStore import com.apollographql.apollo3.cache.normalized.FetchPolicy import com.apollographql.apollo3.cache.normalized.api.CacheHeaders @@ -22,6 +23,7 @@ import com.apollographql.apollo3.integration.normalizer.StarshipByIdQuery import com.apollographql.apollo3.integration.normalizer.type.Episode import com.apollographql.apollo3.mockserver.MockResponse import com.apollographql.apollo3.mockserver.MockServer +import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.testing.QueueTestNetworkTransport import com.apollographql.apollo3.testing.assertNoElement import com.apollographql.apollo3.testing.awaitElement @@ -533,7 +535,7 @@ class WatcherTest { val query = EpisodeHeroNameQuery(Episode.EMPIRE) // Set up the cache with a "R2-D2" name - mockServer.enqueue(query, episodeHeroNameData) + mockServer.enqueueString(query.composeJsonResponse(episodeHeroNameData)) apolloClient.query(query).fetchPolicy(FetchPolicy.NetworkOnly).execute() // Prepare next call to be a network error diff --git a/tests/integration-tests/src/jvmTest/kotlin/test/ApqCacheTest.kt b/tests/integration-tests/src/jvmTest/kotlin/test/ApqCacheTest.kt index af35be02424..4ba7e7baac3 100644 --- a/tests/integration-tests/src/jvmTest/kotlin/test/ApqCacheTest.kt +++ b/tests/integration-tests/src/jvmTest/kotlin/test/ApqCacheTest.kt @@ -1,14 +1,13 @@ package test import com.apollographql.apollo3.ApolloClient +import com.apollographql.apollo3.api.composeJsonResponse import com.apollographql.apollo3.api.http.HttpMethod -import com.apollographql.apollo3.cache.normalized.FetchPolicy import com.apollographql.apollo3.cache.normalized.api.MemoryCacheFactory -import com.apollographql.apollo3.cache.normalized.fetchPolicy import com.apollographql.apollo3.cache.normalized.normalizedCache import com.apollographql.apollo3.integration.normalizer.HeroNameQuery import com.apollographql.apollo3.mockserver.MockServer -import com.apollographql.apollo3.testing.enqueue +import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.testing.internal.runTest import org.junit.Test import kotlin.test.fail @@ -24,8 +23,8 @@ class ApqCacheTest { val data = HeroNameQuery.Data(HeroNameQuery.Hero("R2-D2")) val query = HeroNameQuery() - mockServer.enqueue(query, data) - mockServer.enqueue(query, data) + mockServer.enqueueString(query.composeJsonResponse(data)) + mockServer.enqueueString(query.composeJsonResponse(data)) try { ApolloClient.Builder() diff --git a/tests/ios-test/src/commonTest/kotlin/iOSTest.kt b/tests/ios-test/src/commonTest/kotlin/iOSTest.kt index eba3ebc9956..dd0111ab11a 100644 --- a/tests/ios-test/src/commonTest/kotlin/iOSTest.kt +++ b/tests/ios-test/src/commonTest/kotlin/iOSTest.kt @@ -2,7 +2,7 @@ import com.apollographql.apollo3.ApolloClient import com.apollographql.apollo3.api.GlobalBuilder import com.apollographql.apollo3.mockserver.MockServer -import com.apollographql.apollo3.testing.enqueueData +import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.testing.internal.runTest import ios.test.type.buildQuery import kotlin.test.Test @@ -13,7 +13,8 @@ class iOSTest { val mockServer = MockServer() val apolloClient = ApolloClient.Builder().serverUrl(mockServer.url()).build() - mockServer.enqueueData(GlobalBuilder.buildQuery { random = 42 }) + // What is passed does not matter + mockServer.enqueueString(GlobalBuilder.buildQuery { random = 42 }.toString()) apolloClient.close() mockServer.close() diff --git a/tests/multipart/src/commonTest/kotlin/test/GraphQLYogaTest.kt b/tests/multipart/src/commonTest/kotlin/test/GraphQLYogaTest.kt index 463d7df65e6..222492d23b5 100644 --- a/tests/multipart/src/commonTest/kotlin/test/GraphQLYogaTest.kt +++ b/tests/multipart/src/commonTest/kotlin/test/GraphQLYogaTest.kt @@ -1,8 +1,12 @@ package test +import com.apollographql.apollo3.ApolloClient import com.apollographql.apollo3.mockserver.MockResponse -import com.apollographql.apollo3.testing.mockServerTest +import com.apollographql.apollo3.mockserver.MockServer +import com.apollographql.apollo3.testing.internal.runTest +import kotlinx.coroutines.CoroutineScope import multipart.MyQuery +import okio.use import kotlin.test.Test class GraphQLYogaTest { @@ -28,4 +32,21 @@ class GraphQLYogaTest { apolloClient.query(MyQuery()).execute() } -} \ No newline at end of file +} + +class MockServerTest(val mockServer: MockServer, val apolloClient: ApolloClient, val scope: CoroutineScope) + +fun mockServerTest( + clientBuilder: ApolloClient.Builder.() -> Unit = {}, + block: suspend MockServerTest.() -> Unit +) = runTest(true) { + MockServer().use { mockServer -> + ApolloClient.Builder() + .serverUrl(mockServer.url()) + .apply(clientBuilder) + .build() + .use {apolloClient -> + MockServerTest(mockServer, apolloClient, this).block() + } + } +} diff --git a/tests/native-benchmarks/src/appleTest/kotlin/benchmarks/BenchmarksTest.kt b/tests/native-benchmarks/src/appleTest/kotlin/benchmarks/BenchmarksTest.kt index 01031743089..fbcd51a6c53 100644 --- a/tests/native-benchmarks/src/appleTest/kotlin/benchmarks/BenchmarksTest.kt +++ b/tests/native-benchmarks/src/appleTest/kotlin/benchmarks/BenchmarksTest.kt @@ -1,16 +1,15 @@ package benchmarks import com.apollographql.apollo3.ApolloClient +import com.apollographql.apollo3.api.toResponseJson import com.apollographql.apollo3.cache.normalized.api.MemoryCacheFactory import com.apollographql.apollo3.cache.normalized.normalizedCache import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.enqueueString -import com.apollographql.apollo3.testing.enqueueData import com.apollographql.apollo3.testing.internal.runTest import okio.FileSystem import okio.Path.Companion.toPath import kotlin.test.AfterClass -import kotlin.test.Ignore import kotlin.test.Test import kotlin.time.Duration import kotlin.time.measureTime @@ -38,11 +37,11 @@ class BenchmarksTest { .build() } - mockServer.enqueueData( + mockServer.enqueueString( GetRandomQuery.Data { random = 42 } - ) + .toResponseJson()) client .query(GetRandomQuery()) .execute() diff --git a/tests/runtime/src/test/kotlin/test/HeadersTest.kt b/tests/runtime/src/test/kotlin/test/HeadersTest.kt index 7505207eaec..b97689bcb26 100644 --- a/tests/runtime/src/test/kotlin/test/HeadersTest.kt +++ b/tests/runtime/src/test/kotlin/test/HeadersTest.kt @@ -1,10 +1,11 @@ package test import com.apollographql.apollo3.ApolloClient +import com.apollographql.apollo3.api.composeJsonResponse import com.apollographql.apollo3.api.http.HttpHeader import com.apollographql.apollo3.mockserver.MockServer import com.apollographql.apollo3.mockserver.awaitRequest -import com.apollographql.apollo3.testing.enqueue +import com.apollographql.apollo3.mockserver.enqueueString import com.apollographql.apollo3.testing.internal.runTest import com.example.GetRandomQuery import org.junit.Test @@ -23,7 +24,7 @@ class HeadersTest { .addHttpHeader("clientKey", "clientValue") .build() - mockServer.enqueue(operation, data) + mockServer.enqueueString(operation.composeJsonResponse(data)) apolloClient.query(GetRandomQuery()).addHttpHeader("requestKey", "requestValue").execute() mockServer.awaitRequest().also { @@ -43,7 +44,7 @@ class HeadersTest { .addHttpHeader("clientKey", "clientValue") .build() - mockServer.enqueue(operation, data) + mockServer.enqueueString(operation.composeJsonResponse(data)) apolloClient.query(GetRandomQuery()).httpHeaders(listOf(HttpHeader("requestKey", "requestValue"))).execute() mockServer.awaitRequest().also { @@ -63,7 +64,7 @@ class HeadersTest { .addHttpHeader("clientKey", "clientValue") .build() - mockServer.enqueue(operation, data) + mockServer.enqueueString(operation.composeJsonResponse(data)) apolloClient.query(GetRandomQuery()).addHttpHeader("requestKey", "requestValue").ignoreApolloClientHttpHeaders(true).execute() mockServer.awaitRequest().also { @@ -83,7 +84,7 @@ class HeadersTest { .addHttpHeader("clientKey", "clientValue") .build() - mockServer.enqueue(operation, data) + mockServer.enqueueString(operation.composeJsonResponse(data)) apolloClient.query(GetRandomQuery()).httpHeaders(listOf(HttpHeader("requestKey", "requestValue"))).ignoreApolloClientHttpHeaders(true).execute() mockServer.awaitRequest().also { @@ -103,7 +104,7 @@ class HeadersTest { .addHttpHeader("clientKey", "clientValue") .build() - mockServer.enqueue(operation, data) + mockServer.enqueueString(operation.composeJsonResponse(data)) apolloClient.query(GetRandomQuery()).ignoreApolloClientHttpHeaders(true).execute() mockServer.awaitRequest().also {