forked from arrow-kt/arrow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ArrowResponseEAdapterTest.kt
104 lines (77 loc) · 2.96 KB
/
ArrowResponseEAdapterTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package arrow.retrofit.adapter.either
import arrow.core.left
import arrow.core.right
import arrow.core.test.UnitSpec
import arrow.retrofit.adapter.mock.ErrorMock
import arrow.retrofit.adapter.mock.ResponseMock
import arrow.retrofit.adapter.retrofit.SuspendApiTestClient
import io.kotest.matchers.shouldBe
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.SocketPolicy
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class ArrowResponseEAdapterTest : UnitSpec() {
private lateinit var server: MockWebServer
private lateinit var service: SuspendApiTestClient
init {
beforeAny {
server = MockWebServer()
server.start()
service = Retrofit.Builder()
.baseUrl(server.url("/"))
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(EitherCallAdapterFactory.create())
.build()
.create(SuspendApiTestClient::class.java)
}
afterAny { server.shutdown() }
"should return ResponseMock for 200 with valid JSON" {
server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}"""))
val responseE = service.getResponseE()
with(responseE) {
code shouldBe 200
body shouldBe ResponseMock("Arrow rocks").right()
}
}
"should return Unit when service method returns Unit and null body received" {
server.enqueue(MockResponse().setResponseCode(204))
val responseE = service.postSomethingResponseE("Sample string")
with(responseE) {
code shouldBe 204
body shouldBe Unit.right()
}
}
"should return Unit when service method returns Unit and JSON body received" {
server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}"""))
val responseE = service.postSomethingResponseE("Sample string")
with(responseE) {
code shouldBe 200
body shouldBe Unit.right()
}
}
"should return ErrorMock for 400 with valid JSON" {
server.enqueue(MockResponse().setBody("""{"errorCode":42}""").setResponseCode(400))
val responseE = service.getResponseE()
with(responseE) {
code shouldBe 400
body shouldBe ErrorMock(42).left()
}
}
"should throw for 200 with invalid JSON" {
server.enqueue(MockResponse().setBody("""not a valid JSON"""))
val responseE = runCatching { service.getResponseE() }
responseE.isFailure shouldBe true
}
"should throw for 400 and invalid JSON" {
server.enqueue(MockResponse().setBody("""not a valid JSON""").setResponseCode(400))
val responseE = runCatching { service.getResponseE() }
responseE.isFailure shouldBe true
}
"should throw when server disconnects" {
server.enqueue(MockResponse().apply { socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST })
val responseE = runCatching { service.getResponseE() }
responseE.isFailure shouldBe true
}
}
}