@@ -20,6 +20,7 @@ import cats.effect._
20
20
import cats .implicits ._
21
21
import fs2 .Stream
22
22
import munit .CatsEffectSuite
23
+ import munit .catseffect .IOFixture
23
24
import org .http4s ._
24
25
import org .http4s .blaze .server .BlazeServerBuilder
25
26
import org .http4s .client .websocket ._
@@ -38,104 +39,102 @@ import scala.concurrent.duration._
38
39
39
40
class JdkWSClientSpec extends CatsEffectSuite {
40
41
41
- val webSocket : Resource [IO , WSClient [IO ]] = JdkWSClient .simple[IO ]
42
- val echoServer : Resource [IO , Uri ] =
43
- BlazeServerBuilder [IO ]
44
- .bindAny()
45
- .withHttpWebSocketApp(wsb =>
46
- HttpRoutes
47
- .of[IO ] { case GET -> Root => wsb.build(identity) }
48
- .orNotFound
49
- )
50
- .resource
51
- .map(s => httpToWsUri(s.baseUri))
42
+ val webSocket : IOFixture [WSClient [IO ]] =
43
+ ResourceSuiteLocalFixture (" webSocket" , JdkWSClient .simple[IO ])
44
+ val echoServerUri : IOFixture [Uri ] =
45
+ ResourceSuiteLocalFixture (
46
+ " echoServerUri" ,
47
+ BlazeServerBuilder [IO ]
48
+ .bindAny()
49
+ .withHttpWebSocketApp { wsb =>
50
+ HttpRoutes
51
+ .of[IO ] { case GET -> Root => wsb.build(identity) }
52
+ .orNotFound
53
+ }
54
+ .resource
55
+ .map(s => httpToWsUri(s.baseUri))
56
+ )
52
57
53
- val webSocketFixture : SyncIO [FunFixture [WSClient [IO ]]] =
54
- ResourceFixture (webSocket)
55
- val webSocketEchoFixture : SyncIO [FunFixture [(WSClient [IO ], Uri )]] =
56
- ResourceFixture ((webSocket, echoServer).tupled)
58
+ override def munitFixtures : Seq [IOFixture [_]] = List (webSocket, echoServerUri)
57
59
58
- webSocketEchoFixture.test(" send and receive frames in low-level mode" ) {
59
- case (webSocket, echoUri) =>
60
- webSocket
61
- .connect(WSRequest (echoUri))
62
- .use { conn =>
63
- for {
64
- _ <- conn.send(WSFrame .Text (" bar" ))
65
- _ <- conn.sendMany(List (WSFrame .Binary (ByteVector (3 , 99 , 12 )), WSFrame .Text (" foo" )))
66
- _ <- conn.send(WSFrame .Close (1000 , " goodbye" ))
67
- recv <- conn.receiveStream.compile.toList
68
- } yield recv
69
- }
70
- .assertEquals(
71
- List (
72
- WSFrame .Text (" bar" ),
73
- WSFrame .Binary (ByteVector (3 , 99 , 12 )),
74
- WSFrame .Text (" foo" ),
75
- WSFrame .Close (1000 , " goodbye" )
76
- )
60
+ test(" send and receive frames in low-level mode" ) {
61
+ webSocket()
62
+ .connect(WSRequest (echoServerUri()))
63
+ .use { conn =>
64
+ for {
65
+ _ <- conn.send(WSFrame .Text (" bar" ))
66
+ _ <- conn.sendMany(List (WSFrame .Binary (ByteVector (3 , 99 , 12 )), WSFrame .Text (" foo" )))
67
+ _ <- conn.send(WSFrame .Close (1000 , " goodbye" ))
68
+ recv <- conn.receiveStream.compile.toList
69
+ } yield recv
70
+ }
71
+ .assertEquals(
72
+ List (
73
+ WSFrame .Text (" bar" ),
74
+ WSFrame .Binary (ByteVector (3 , 99 , 12 )),
75
+ WSFrame .Text (" foo" ),
76
+ WSFrame .Close (1000 , " goodbye" )
77
77
)
78
+ )
78
79
}
79
80
80
- webSocketEchoFixture.test(" send and receive frames in high-level mode" ) {
81
- case (webSocket, echoUri) =>
82
- webSocket
83
- .connectHighLevel(WSRequest (echoUri))
84
- .use { conn =>
85
- for {
86
- _ <- conn.send(WSFrame .Binary (ByteVector (15 , 2 , 3 )))
87
- _ <- conn.sendMany(List (WSFrame .Text (" foo" ), WSFrame .Text (" bar" )))
88
- recv <- conn.receiveStream.take(3 ).compile.toList
89
- } yield recv
90
- }
91
- .assertEquals(
92
- List (
93
- WSFrame .Binary (ByteVector (15 , 2 , 3 )),
94
- WSFrame .Text (" foo" ),
95
- WSFrame .Text (" bar" )
96
- )
81
+ test(" send and receive frames in high-level mode" ) {
82
+ webSocket()
83
+ .connectHighLevel(WSRequest (echoServerUri()))
84
+ .use { conn =>
85
+ for {
86
+ _ <- conn.send(WSFrame .Binary (ByteVector (15 , 2 , 3 )))
87
+ _ <- conn.sendMany(List (WSFrame .Text (" foo" ), WSFrame .Text (" bar" )))
88
+ recv <- conn.receiveStream.take(3 ).compile.toList
89
+ } yield recv
90
+ }
91
+ .assertEquals(
92
+ List (
93
+ WSFrame .Binary (ByteVector (15 , 2 , 3 )),
94
+ WSFrame .Text (" foo" ),
95
+ WSFrame .Text (" bar" )
97
96
)
97
+ )
98
98
}
99
99
100
- webSocketEchoFixture.test(" group frames by their `last` attribute in high-level mode" ) {
101
- case (webSocket, echoUri) =>
102
- webSocket
103
- .connectHighLevel(WSRequest (echoUri))
104
- .use { conn =>
105
- for {
106
- _ <- conn.sendMany(
107
- List (
108
- WSFrame .Text (" 1" , last = false ),
109
- WSFrame .Text (" 2" , last = false ),
110
- WSFrame .Text (" 3" ),
111
- WSFrame .Binary (ByteVector (1 )),
112
- WSFrame .Binary (ByteVector (2 ), last = false ),
113
- WSFrame .Binary (ByteVector (3 ), last = false ),
114
- WSFrame .Binary (ByteVector (4 )),
115
- WSFrame .Text (" 4" , last = false ),
116
- WSFrame .Text (" 5" ),
117
- WSFrame .Binary (ByteVector (5 ), last = false ),
118
- WSFrame .Binary (ByteVector (6 )),
119
- WSFrame .Text (" 6" ),
120
- WSFrame .Binary (ByteVector (7 ), last = false )
121
- )
100
+ test(" group frames by their `last` attribute in high-level mode" ) {
101
+ webSocket()
102
+ .connectHighLevel(WSRequest (echoServerUri()))
103
+ .use { conn =>
104
+ for {
105
+ _ <- conn.sendMany(
106
+ List (
107
+ WSFrame .Text (" 1" , last = false ),
108
+ WSFrame .Text (" 2" , last = false ),
109
+ WSFrame .Text (" 3" ),
110
+ WSFrame .Binary (ByteVector (1 )),
111
+ WSFrame .Binary (ByteVector (2 ), last = false ),
112
+ WSFrame .Binary (ByteVector (3 ), last = false ),
113
+ WSFrame .Binary (ByteVector (4 )),
114
+ WSFrame .Text (" 4" , last = false ),
115
+ WSFrame .Text (" 5" ),
116
+ WSFrame .Binary (ByteVector (5 ), last = false ),
117
+ WSFrame .Binary (ByteVector (6 )),
118
+ WSFrame .Text (" 6" ),
119
+ WSFrame .Binary (ByteVector (7 ), last = false )
122
120
)
123
- recv <- conn.receiveStream.take(6 ).compile.toList
124
- } yield recv
125
- }
126
- .assertEquals(
127
- List (
128
- WSFrame .Text (" 123" ),
129
- WSFrame .Binary (ByteVector (1 )),
130
- WSFrame .Binary (ByteVector (2 , 3 , 4 )),
131
- WSFrame .Text (" 45" ),
132
- WSFrame .Binary (ByteVector (5 , 6 )),
133
- WSFrame .Text (" 6" )
134
121
)
122
+ recv <- conn.receiveStream.take(6 ).compile.toList
123
+ } yield recv
124
+ }
125
+ .assertEquals(
126
+ List (
127
+ WSFrame .Text (" 123" ),
128
+ WSFrame .Binary (ByteVector (1 )),
129
+ WSFrame .Binary (ByteVector (2 , 3 , 4 )),
130
+ WSFrame .Text (" 45" ),
131
+ WSFrame .Binary (ByteVector (5 , 6 )),
132
+ WSFrame .Text (" 6" )
135
133
)
134
+ )
136
135
}
137
136
138
- webSocketFixture. test(" automatically close the connection" ) { webSocket =>
137
+ test(" automatically close the connection" ) {
139
138
val frames = for {
140
139
ref <- Ref [IO ].of(List .empty[WebSocketFrame ])
141
140
finished <- Deferred [IO , Unit ]
@@ -154,9 +153,9 @@ class JdkWSClientSpec extends CatsEffectSuite {
154
153
override def onStart () = {
155
154
val req = WSRequest (uri " ws://localhost:8080 " )
156
155
val p = for {
157
- _ <- webSocket.connect(req).use(conn => conn.send(WSFrame .Text (" hi blaze" )))
156
+ _ <- webSocket() .connect(req).use(conn => conn.send(WSFrame .Text (" hi blaze" )))
158
157
_ <- IO .sleep(1 .seconds)
159
- _ <- webSocket.connectHighLevel(req).use { conn =>
158
+ _ <- webSocket() .connectHighLevel(req).use { conn =>
160
159
conn.send(WSFrame .Text (" hey blaze" ))
161
160
}
162
161
_ <- IO .sleep(1 .seconds)
@@ -178,7 +177,7 @@ class JdkWSClientSpec extends CatsEffectSuite {
178
177
)
179
178
}
180
179
181
- webSocketFixture. test(" send headers" ) { webSocket =>
180
+ test(" send headers" ) {
182
181
val sentHeaders = Headers (
183
182
Header .Raw (ci " foo " , " bar" ),
184
183
Header .Raw (ci " Sec-Websocket-Protocol " , " proto" ),
@@ -198,7 +197,7 @@ class JdkWSClientSpec extends CatsEffectSuite {
198
197
}
199
198
.resource
200
199
.use { server =>
201
- webSocket
200
+ webSocket()
202
201
.connect(WSRequest (httpToWsUri(server.baseUri)).withHeaders(sentHeaders))
203
202
.use(_ => IO .unit)
204
203
} *> ref.get
0 commit comments