Skip to content

Commit 88b2e10

Browse files
committed
Support body for any http verb
1 parent a8c355e commit 88b2e10

6 files changed

Lines changed: 45 additions & 60 deletions

File tree

backend/mockingbird-api/src/main/scala/ru/tinkoff/tcb/mockingbird/api/AdminHttp.scala

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import sttp.tapir.ztapir.*
1111
import ru.tinkoff.tcb.mockingbird.api.admin.*
1212
import ru.tinkoff.tcb.mockingbird.build.BuildInfo
1313
import ru.tinkoff.tcb.mockingbird.config.ServerConfig
14-
import ru.tinkoff.tcb.mockingbird.model.AbsentRequestBody
1514
import ru.tinkoff.tcb.mockingbird.wldRuntime
1615

1716
final class AdminHttp(config: ServerConfig, handler: AdminApiHandler) {
@@ -85,13 +84,13 @@ final class AdminHttp(config: ServerConfig, handler: AdminApiHandler) {
8584
createDestinationConf.zServerLogic(handler.createDestinationConfiguration),
8685
getDestinationConfiguration.zServerLogic(handler.getDestinationConfiguration),
8786
updateDestinationConf.zServerLogic((handler.updateDestinationConfiguration _).tupled),
88-
tryGet.zServerLogic((handler.tryResolveStub(_, _, _, _, AbsentRequestBody)).tupled),
87+
tryGet.zServerLogic((handler.tryResolveStub _).tupled),
8988
tryPost.zServerLogic((handler.tryResolveStub _).tupled),
9089
tryPatch.zServerLogic((handler.tryResolveStub _).tupled),
9190
tryPut.zServerLogic((handler.tryResolveStub _).tupled),
9291
tryDelete.zServerLogic((handler.tryResolveStub _).tupled),
93-
tryHead.zServerLogic((handler.tryResolveStub(_, _, _, _, AbsentRequestBody)).tupled),
94-
tryOptions.zServerLogic((handler.tryResolveStub(_, _, _, _, AbsentRequestBody)).tupled),
92+
tryHead.zServerLogic((handler.tryResolveStub _).tupled),
93+
tryOptions.zServerLogic((handler.tryResolveStub _).tupled),
9594
tryScenario.zServerLogic(handler.tryResolveScenario)
9695
)
9796

backend/mockingbird-api/src/main/scala/ru/tinkoff/tcb/mockingbird/api/PublicHttp.scala

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import sttp.tapir.ztapir.*
1111

1212
import ru.tinkoff.tcb.mockingbird.api.exec.*
1313
import ru.tinkoff.tcb.mockingbird.build.BuildInfo
14-
import ru.tinkoff.tcb.mockingbird.model.AbsentRequestBody
1514
import ru.tinkoff.tcb.mockingbird.model.BinaryResponse
1615
import ru.tinkoff.tcb.mockingbird.model.HttpMethod
1716
import ru.tinkoff.tcb.mockingbird.model.HttpStubResponse
@@ -25,16 +24,11 @@ import ru.tinkoff.tcb.mockingbird.model.XmlResponse
2524
import ru.tinkoff.tcb.mockingbird.wldRuntime
2625

2726
final class PublicHttp(handler: PublicApiHandler) {
28-
private val endpointsWithoutBody = List(getEndpoint, headEndpoint, optionsEndpoint, deleteEndpoint)
29-
private val endpointsWithBody = List(postEndpoint, putEndpoint, patchEndpoint)
27+
private val endpointsWithString =
28+
List(getEndpoint, headEndpoint, optionsEndpoint, deleteEndpoint, postEndpoint, putEndpoint, patchEndpoint)
3029
private val endpointsWithMultipart = List(postMultipartEndpoint, putMultipartEndpoint, patchMultipartEndpoint)
3130

32-
private val withoutBody =
33-
endpointsWithoutBody
34-
.map(_.zServerLogic[WLD]((handle(_, _, _, _, AbsentRequestBody)).tupled))
35-
private val withBody =
36-
endpointsWithBody
37-
.map(_.zServerLogic[WLD]((handle _).tupled))
31+
private val withString = endpointsWithString.map(_.zServerLogic[WLD]((handle _).tupled))
3832
private val withMultipart =
3933
endpointsWithMultipart.map(_.zServerLogic[WLD]((handle _).tupled))
4034

@@ -47,7 +41,7 @@ final class PublicHttp(handler: PublicApiHandler) {
4741
useRelativePaths = false
4842
)
4943
).fromEndpoints[RIO[WLD, *]](
50-
endpointsWithoutBody ++ endpointsWithBody ++ endpointsWithMultipart,
44+
endpointsWithString ++ endpointsWithMultipart,
5145
"Mockingbird",
5246
BuildInfo.version
5347
)
@@ -56,7 +50,7 @@ final class PublicHttp(handler: PublicApiHandler) {
5650
VertxZioServerOptions.customiseInterceptors[WLD].notAcceptableInterceptor(None).options
5751

5852
val http: List[Router => Route] =
59-
(withoutBody ++ withBody ++ withMultipart ++ swaggerEndpoints)
53+
(withString ++ withMultipart ++ swaggerEndpoints)
6054
.map(VertxZioServerInterpreter(options).route(_)(wldRuntime))
6155

6256
private def handle(

backend/mockingbird-api/src/main/scala/ru/tinkoff/tcb/mockingbird/api/admin/package.scala

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import ru.tinkoff.tcb.mockingbird.api.response.DestinationDTO
2121
import ru.tinkoff.tcb.mockingbird.api.response.OperationResult
2222
import ru.tinkoff.tcb.mockingbird.api.response.SourceDTO
2323
import ru.tinkoff.tcb.mockingbird.codec.*
24+
import ru.tinkoff.tcb.mockingbird.model.AbsentRequestBody
2425
import ru.tinkoff.tcb.mockingbird.model.DestinationConfiguration
2526
import ru.tinkoff.tcb.mockingbird.model.GrpcStub
2627
import ru.tinkoff.tcb.mockingbird.model.HttpStub
@@ -54,38 +55,35 @@ package object admin {
5455
.out(stringBody)
5556
.summary("Тестирование работоспособности XPath-выражения")
5657

57-
private val tryStub = basicTest.in("tryStub").summary("Проверка резолвинга HTTP заглушки")
58-
59-
private val bodylessEndpoint: PublicEndpoint[ExecInput, Throwable, SID[HttpStub], Any] =
60-
tryStub
61-
.in(execInput)
62-
.out(jsonBody[SID[HttpStub]])
63-
64-
private val withBody: PublicEndpoint[ExecInputB, Throwable, SID[
58+
private val tryStub: PublicEndpoint[ExecInputB, Throwable, SID[
6559
HttpStub
6660
], Any] =
67-
tryStub
61+
basicTest
62+
.in("tryStub")
63+
.summary("Проверка резолвинга HTTP заглушки")
6864
.in(execInput)
6965
.in(
70-
binaryBody(RawBodyType.ByteArrayBody)[String]
71-
.map[RequestBody](SimpleRequestBody(_))(SimpleRequestBody.subset.getOption(_).get.value)
66+
binaryBody(RawBodyType.ByteArrayBody)[Option[String]]
67+
.map[RequestBody]((_: Option[String]).fold[RequestBody](AbsentRequestBody)(SimpleRequestBody(_)))(
68+
SimpleRequestBody.subset.getOption(_).map(_.value)
69+
)
7270
)
7371
.out(jsonBody[SID[HttpStub]])
7472

75-
val tryGet: PublicEndpoint[ExecInput, Throwable, SID[HttpStub], Any] =
76-
bodylessEndpoint.get
73+
val tryGet: PublicEndpoint[ExecInputB, Throwable, SID[HttpStub], Any] =
74+
tryStub.get
7775
val tryPost: PublicEndpoint[ExecInputB, Throwable, SID[HttpStub], Any] =
78-
withBody.post
76+
tryStub.post
7977
val tryPatch: PublicEndpoint[ExecInputB, Throwable, SID[HttpStub], Any] =
80-
withBody.patch
78+
tryStub.patch
8179
val tryPut: PublicEndpoint[ExecInputB, Throwable, SID[HttpStub], Any] =
82-
withBody.put
80+
tryStub.put
8381
val tryDelete: PublicEndpoint[ExecInputB, Throwable, SID[HttpStub], Any] =
84-
withBody.delete
85-
val tryHead: PublicEndpoint[ExecInput, Throwable, SID[HttpStub], Any] =
86-
bodylessEndpoint.head
87-
val tryOptions: PublicEndpoint[ExecInput, Throwable, SID[HttpStub], Any] =
88-
bodylessEndpoint.options
82+
tryStub.delete
83+
val tryHead: PublicEndpoint[ExecInputB, Throwable, SID[HttpStub], Any] =
84+
tryStub.head
85+
val tryOptions: PublicEndpoint[ExecInputB, Throwable, SID[HttpStub], Any] =
86+
tryStub.options
8987

9088
val tryScenario: PublicEndpoint[ScenarioResolveRequest, Throwable, SID[Scenario], Any] =
9189
basicTest.post

backend/mockingbird-api/src/main/scala/ru/tinkoff/tcb/mockingbird/api/exec/package.scala

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import sttp.tapir.*
77

88
import ru.tinkoff.tcb.mockingbird.api.input.*
99
import ru.tinkoff.tcb.mockingbird.codec.*
10-
import ru.tinkoff.tcb.mockingbird.model.HttpMethod
10+
import ru.tinkoff.tcb.mockingbird.model.AbsentRequestBody
1111
import ru.tinkoff.tcb.mockingbird.model.HttpStubResponse
1212
import ru.tinkoff.tcb.mockingbird.model.MultipartRequestBody
1313
import ru.tinkoff.tcb.mockingbird.model.RequestBody
@@ -28,22 +28,14 @@ package object exec {
2828
}
2929
}
3030

31-
private val bodylessEndpoint: PublicEndpoint[
32-
ExecInput,
33-
Throwable,
34-
(List[Header], HttpStubResponse),
35-
Any
36-
] = baseEndpoint
37-
.in(execInput)
38-
.out(headers)
39-
.out(oneOf(variants.head, variants.tail*))
40-
4131
private val withBody: PublicEndpoint[ExecInputB, Throwable, (List[Header], HttpStubResponse), Any] =
4232
baseEndpoint
4333
.in(execInput)
4434
.in(
45-
binaryBody(RawBodyType.ByteArrayBody)[String]
46-
.map[RequestBody](SimpleRequestBody(_))(SimpleRequestBody.subset.getOption(_).get.value)
35+
binaryBody(RawBodyType.ByteArrayBody)[Option[String]]
36+
.map[RequestBody]((_: Option[String]).fold[RequestBody](AbsentRequestBody)(SimpleRequestBody(_)))(
37+
SimpleRequestBody.subset.getOption(_).map(_.value)
38+
)
4739
)
4840
.out(headers)
4941
.out(oneOf(variants.head, variants.tail*))
@@ -62,11 +54,11 @@ package object exec {
6254
.out(oneOf(variants.head, variants.tail*))
6355

6456
val getEndpoint: PublicEndpoint[
65-
(HttpMethod, String, Map[String, String], Map[String, String]),
57+
ExecInputB,
6658
Throwable,
6759
(List[Header], HttpStubResponse),
6860
Any
69-
] = bodylessEndpoint.get
61+
] = withBody.get
7062

7163
val postEndpoint: PublicEndpoint[
7264
ExecInputB,
@@ -83,11 +75,11 @@ package object exec {
8375
] = withBody.put
8476

8577
val deleteEndpoint: PublicEndpoint[
86-
ExecInput,
78+
ExecInputB,
8779
Throwable,
8880
(List[Header], HttpStubResponse),
8981
Any
90-
] = bodylessEndpoint.delete
82+
] = withBody.delete
9183

9284
val patchEndpoint: PublicEndpoint[
9385
ExecInputB,
@@ -97,18 +89,18 @@ package object exec {
9789
] = withBody.patch
9890

9991
val headEndpoint: PublicEndpoint[
100-
ExecInput,
92+
ExecInputB,
10193
Throwable,
10294
(List[Header], HttpStubResponse),
10395
Any
104-
] = bodylessEndpoint.head
96+
] = withBody.head
10597

10698
val optionsEndpoint: PublicEndpoint[
107-
ExecInput,
99+
ExecInputB,
108100
Throwable,
109101
(List[Header], HttpStubResponse),
110102
Any
111-
] = bodylessEndpoint.options
103+
] = withBody.options
112104

113105
// Multipart endpoints
114106

backend/mockingbird-api/src/main/scala/ru/tinkoff/tcb/mockingbird/codec/package.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ package object codec {
4444
}
4545
}
4646

47-
implicit val binaryStringCodec: Codec[Array[Byte], String, CodecFormat.OctetStream] =
48-
Codec.byteArray.map(new String(_, StandardCharsets.UTF_8))(_.getBytes(StandardCharsets.UTF_8))
47+
implicit val binaryOptionalStringCodec: Codec[Array[Byte], Option[String], CodecFormat.OctetStream] =
48+
Codec.byteArray.map(arr => if (arr.nonEmpty) Some(new String(arr, StandardCharsets.UTF_8)) else None)(
49+
_.fold(Array.emptyByteArray)(_.getBytes(StandardCharsets.UTF_8))
50+
)
4951
}

backend/project/Settings.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ object Settings {
2626

2727
val common = Seq(
2828
organization := "ru.tinkoff",
29-
version := "3.7.1",
29+
version := "3.7.2",
3030
scalaVersion := "2.13.10",
3131
Compile / packageDoc / publishArtifact := false,
3232
Compile / packageSrc / publishArtifact := false,

0 commit comments

Comments
 (0)