Skip to content

Commit 1943dd6

Browse files
committed
Fix OpenAPI schema test
1 parent 40b3032 commit 1943dd6

File tree

2 files changed

+92
-13
lines changed

2 files changed

+92
-13
lines changed

rest/.jvm/src/test/resources/StreamingRestTestApi.json

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,35 @@
2424
}
2525
}
2626
},
27+
"/customStreamTask": {
28+
"get": {
29+
"operationId": "customStreamTask",
30+
"parameters": [
31+
{
32+
"name": "size",
33+
"in": "query",
34+
"required": true,
35+
"explode": false,
36+
"schema": {
37+
"type": "integer",
38+
"format": "int32"
39+
}
40+
}
41+
],
42+
"responses": {
43+
"200": {
44+
"description": "Success",
45+
"content": {
46+
"application/json": {
47+
"schema": {
48+
"$ref": "#/components/schemas/DataStream"
49+
}
50+
}
51+
}
52+
}
53+
}
54+
}
55+
},
2756
"/delayedStream": {
2857
"get": {
2958
"operationId": "delayedStream",
@@ -67,6 +96,49 @@
6796
}
6897
}
6998
},
99+
"/delayedStreamTask": {
100+
"get": {
101+
"operationId": "delayedStreamTask",
102+
"parameters": [
103+
{
104+
"name": "size",
105+
"in": "query",
106+
"required": true,
107+
"explode": false,
108+
"schema": {
109+
"type": "integer",
110+
"format": "int32"
111+
}
112+
},
113+
{
114+
"name": "delayMillis",
115+
"in": "query",
116+
"required": true,
117+
"explode": false,
118+
"schema": {
119+
"type": "integer",
120+
"format": "int64"
121+
}
122+
}
123+
],
124+
"responses": {
125+
"200": {
126+
"description": "Success",
127+
"content": {
128+
"application/json": {
129+
"schema": {
130+
"type": "array",
131+
"items": {
132+
"type": "integer",
133+
"format": "int32"
134+
}
135+
}
136+
}
137+
}
138+
}
139+
}
140+
}
141+
},
70142
"/errorStream": {
71143
"post": {
72144
"operationId": "errorStream",
@@ -159,6 +231,13 @@
159231
],
160232
"components": {
161233
"schemas": {
234+
"DataStream": {
235+
"type": "array",
236+
"items": {
237+
"type": "integer",
238+
"format": "int32"
239+
}
240+
},
162241
"RestEntity": {
163242
"type": "object",
164243
"description": "REST entity",

rest/src/test/scala/io/udash/rest/StreamingRestTestApi.scala

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
11
package io.udash
22
package rest
33

4-
import com.avsystem.commons.rpc.AsRawReal
5-
import com.avsystem.commons.serialization.json.JsonStringOutput
4+
import com.avsystem.commons.rpc.{AsRaw, AsRawReal, AsReal}
65
import io.udash.rest.openapi.RestSchema
76
import io.udash.rest.raw.{HttpErrorException, JsonValue, StreamedBody}
87
import monix.eval.Task
98
import monix.reactive.Observable
109

1110
import scala.concurrent.duration.*
1211

13-
case class DataStream(source: Observable[Int], metadata: Map[String, String])
12+
final case class DataStream(source: Observable[Int], metadata: Map[String, String])
13+
14+
object DataStream extends GenCodecRestImplicits {
15+
implicit def schema: RestSchema[DataStream] =
16+
RestSchema.create(res => RestSchema.seqSchema[Seq, Int].createSchema(res), "DataStream")
1417

15-
object DataStream {
16-
implicit def schema: RestSchema[DataStream] = ???
1718
implicit def dataStreamAsRawReal: AsRawReal[StreamedBody, DataStream] =
1819
AsRawReal.create(
19-
stream => StreamedBody.JsonList(stream.source.map(i => JsonValue(JsonStringOutput.write(i)))),
20-
{
21-
case StreamedBody.JsonList(e, c) => DataStream(e.map(_.value.toInt), Map.empty)
22-
case _ => ???
23-
}
20+
stream => StreamedBody.JsonList(stream.source.map(AsRaw[JsonValue, Int].asRaw)),
21+
rawBody => {
22+
val list = StreamedBody.castOrFail[StreamedBody.JsonList](rawBody)
23+
DataStream(list.elements.map(AsReal[JsonValue, Int].asReal), Map.empty)
24+
},
2425
)
2526
}
2627

@@ -36,8 +37,8 @@ trait StreamingRestTestApi {
3637
@GET def delayedStream(@Query size: Int, @Query delayMillis: Long): Observable[Int]
3738

3839
@GET def delayedStreamTask(@Query size: Int, @Query delayMillis: Long): Task[Observable[Int]]
39-
@GET def customStreamTask(@Query size: Int): Task[DataStream]
4040

41+
@GET def customStreamTask(@Query size: Int): Task[DataStream]
4142
}
4243
object StreamingRestTestApi extends DefaultRestApiCompanion[StreamingRestTestApi] {
4344

@@ -64,11 +65,10 @@ object StreamingRestTestApi extends DefaultRestApiCompanion[StreamingRestTestApi
6465
else throw HttpErrorException.Streaming
6566
}
6667

67-
override def delayedStream(size: Int, delayMillis: Long): Observable[Int] = {
68+
override def delayedStream(size: Int, delayMillis: Long): Observable[Int] =
6869
Observable.fromIterable(Range(0, size))
6970
.zip(Observable.intervalAtFixedRate(delayMillis.millis, delayMillis.millis))
7071
.map(_._1)
71-
}
7272

7373
override def delayedStreamTask(size: Int, delayMillis: Long): Task[Observable[Int]] =
7474
Task.delay(delayedStream(size, delayMillis))

0 commit comments

Comments
 (0)