okhttp

Форк
0
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
 */
16
package okhttp3.containers
17

18
import assertk.assertThat
19
import assertk.assertions.contains
20
import javax.net.ssl.TrustManagerFactory
21
import javax.net.ssl.X509TrustManager
22
import okhttp3.HttpUrl.Companion.toHttpUrl
23
import okhttp3.OkHttpClient
24
import okhttp3.Request
25
import org.junit.jupiter.api.Test
26
import org.mockserver.client.MockServerClient
27
import org.mockserver.configuration.Configuration
28
import org.mockserver.logging.MockServerLogger
29
import org.mockserver.model.HttpRequest.request
30
import org.mockserver.model.HttpResponse.response
31
import org.mockserver.socket.tls.KeyStoreFactory
32
import org.testcontainers.containers.MockServerContainer
33
import org.testcontainers.junit.jupiter.Container
34
import org.testcontainers.junit.jupiter.Testcontainers
35
import org.testcontainers.utility.DockerImageName
36

37
@Testcontainers
38
class BasicMockServerTest {
39
  @Container
40
  val mockServer: MockServerContainer = MockServerContainer(MOCKSERVER_IMAGE)
41

42
  val client =
43
    OkHttpClient.Builder()
44
      .trustMockServer()
45
      .build()
46

47
  @Test
48
  fun testRequest() {
49
    MockServerClient(mockServer.host, mockServer.serverPort).use { mockServerClient ->
50
      mockServerClient
51
        .`when`(
52
          request().withPath("/person")
53
            .withQueryStringParameter("name", "peter"),
54
        )
55
        .respond(response().withBody("Peter the person!"))
56

57
      val response = client.newCall(Request((mockServer.endpoint + "/person?name=peter").toHttpUrl())).execute()
58

59
      assertThat(response.body.string()).contains("Peter the person")
60
    }
61
  }
62

63
  @Test
64
  fun testHttpsRequest() {
65
    MockServerClient(mockServer.host, mockServer.serverPort).use { mockServerClient ->
66
      mockServerClient
67
        .`when`(
68
          request().withPath("/person")
69
            .withQueryStringParameter("name", "peter"),
70
        )
71
        .respond(response().withBody("Peter the person!"))
72

73
      val response = client.newCall(Request((mockServer.secureEndpoint + "/person?name=peter").toHttpUrl())).execute()
74

75
      assertThat(response.body.string()).contains("Peter the person")
76
    }
77
  }
78

79
  companion object {
80
    val MOCKSERVER_IMAGE: DockerImageName =
81
      DockerImageName
82
        .parse("mockserver/mockserver")
83
        .withTag("mockserver-5.15.0")
84

85
    fun OkHttpClient.Builder.trustMockServer(): OkHttpClient.Builder =
86
      apply {
87
        val keyStoreFactory = KeyStoreFactory(Configuration.configuration(), MockServerLogger())
88

89
        val socketFactory = keyStoreFactory.sslContext().socketFactory
90

91
        val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
92
        trustManagerFactory.init(keyStoreFactory.loadOrCreateKeyStore())
93
        val trustManager = trustManagerFactory.trustManagers.first() as X509TrustManager
94

95
        sslSocketFactory(socketFactory, trustManager)
96
      }
97
  }
98
}
99

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.