okhttp
98 строк · 3.3 Кб
1/*
2* Copyright (C) 2024 Square, Inc.
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16package okhttp3.containers
17
18import assertk.assertThat
19import assertk.assertions.contains
20import javax.net.ssl.TrustManagerFactory
21import javax.net.ssl.X509TrustManager
22import okhttp3.HttpUrl.Companion.toHttpUrl
23import okhttp3.OkHttpClient
24import okhttp3.Request
25import org.junit.jupiter.api.Test
26import org.mockserver.client.MockServerClient
27import org.mockserver.configuration.Configuration
28import org.mockserver.logging.MockServerLogger
29import org.mockserver.model.HttpRequest.request
30import org.mockserver.model.HttpResponse.response
31import org.mockserver.socket.tls.KeyStoreFactory
32import org.testcontainers.containers.MockServerContainer
33import org.testcontainers.junit.jupiter.Container
34import org.testcontainers.junit.jupiter.Testcontainers
35import org.testcontainers.utility.DockerImageName
36
37@Testcontainers
38class BasicMockServerTest {
39@Container
40val mockServer: MockServerContainer = MockServerContainer(MOCKSERVER_IMAGE)
41
42val client =
43OkHttpClient.Builder()
44.trustMockServer()
45.build()
46
47@Test
48fun testRequest() {
49MockServerClient(mockServer.host, mockServer.serverPort).use { mockServerClient ->
50mockServerClient
51.`when`(
52request().withPath("/person")
53.withQueryStringParameter("name", "peter"),
54)
55.respond(response().withBody("Peter the person!"))
56
57val response = client.newCall(Request((mockServer.endpoint + "/person?name=peter").toHttpUrl())).execute()
58
59assertThat(response.body.string()).contains("Peter the person")
60}
61}
62
63@Test
64fun testHttpsRequest() {
65MockServerClient(mockServer.host, mockServer.serverPort).use { mockServerClient ->
66mockServerClient
67.`when`(
68request().withPath("/person")
69.withQueryStringParameter("name", "peter"),
70)
71.respond(response().withBody("Peter the person!"))
72
73val response = client.newCall(Request((mockServer.secureEndpoint + "/person?name=peter").toHttpUrl())).execute()
74
75assertThat(response.body.string()).contains("Peter the person")
76}
77}
78
79companion object {
80val MOCKSERVER_IMAGE: DockerImageName =
81DockerImageName
82.parse("mockserver/mockserver")
83.withTag("mockserver-5.15.0")
84
85fun OkHttpClient.Builder.trustMockServer(): OkHttpClient.Builder =
86apply {
87val keyStoreFactory = KeyStoreFactory(Configuration.configuration(), MockServerLogger())
88
89val socketFactory = keyStoreFactory.sslContext().socketFactory
90
91val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
92trustManagerFactory.init(keyStoreFactory.loadOrCreateKeyStore())
93val trustManager = trustManagerFactory.trustManagers.first() as X509TrustManager
94
95sslSocketFactory(socketFactory, trustManager)
96}
97}
98}
99