Skip to content

Commit 2dee843

Browse files
committed
Add test for ReadableStream interop
1 parent 07febcc commit 2dee843

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed

build.sbt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ def configureTest(project: Project): Project =
159159
libraryDependencies ++= Seq(
160160
"org.http4s" %%% "http4s-client-testkit" % http4sVersion,
161161
"org.scalameta" %%% "munit" % munitVersion % Test,
162-
"org.typelevel" %%% "munit-cats-effect" % munitCEVersion % Test
162+
"org.typelevel" %%% "munit-cats-effect" % munitCEVersion % Test,
163+
"org.typelevel" %%% "scalacheck-effect-munit" % "2.0.0-M2" % Test
163164
),
164165
Compile / unmanagedSourceDirectories +=
165166
(LocalRootProject / baseDirectory).value / "tests" / "src" / "main" / "scala",

dom/src/main/scala/org/http4s/dom/package.scala

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,12 @@ package object dom {
4848

4949
implicit def blobEncoder[F[_]](implicit F: Async[F]): EntityEncoder[F, Blob] =
5050
EntityEncoder.entityBodyEncoder.contramap { blob =>
51-
readReadableStream[F](F.delay(blob.stream()), cancelAfterUse = true)
51+
readReadableStream[F](F.delay(blob.stream()))
5252
}
5353

5454
implicit def readableStreamEncoder[F[_]: Async]
5555
: EntityEncoder[F, ReadableStream[Uint8Array]] =
56-
EntityEncoder.entityBodyEncoder.contramap { rs =>
57-
readReadableStream(rs.pure, cancelAfterUse = true)
58-
}
56+
EntityEncoder.entityBodyEncoder.contramap { rs => readReadableStream(rs.pure) }
5957

6058
private[dom] def fromDomResponse[F[_]](response: DomResponse)(
6159
implicit F: Async[F]): F[Response[F]] =
@@ -64,7 +62,7 @@ package object dom {
6462
status = status,
6563
headers = fromDomHeaders(response.headers),
6664
body = Stream.fromOption(Option(response.body)).flatMap { rs =>
67-
readReadableStream[F](rs.pure, cancelAfterUse = true)
65+
readReadableStream[F](rs.pure)
6866
}
6967
)
7068
}
@@ -84,9 +82,8 @@ package object dom {
8482
headers.map { header => header(0) -> header(1) }.toList
8583
)
8684

87-
private def readReadableStream[F[_]](
88-
readableStream: F[ReadableStream[Uint8Array]],
89-
cancelAfterUse: Boolean
85+
private[dom] def readReadableStream[F[_]](
86+
readableStream: F[ReadableStream[Uint8Array]]
9087
)(implicit F: Async[F]): Stream[F, Byte] = {
9188
def read(readableStream: ReadableStream[Uint8Array]) =
9289
Stream
@@ -102,10 +99,7 @@ package object dom {
10299
}
103100
}
104101

105-
if (cancelAfterUse)
106-
Stream.bracketCase(readableStream)(cancelReadableStream(_, _)).flatMap(read(_))
107-
else
108-
Stream.eval(readableStream).flatMap(read(_))
102+
Stream.bracketCase(readableStream)(cancelReadableStream(_, _)).flatMap(read(_))
109103
}
110104

111105
private[dom] def cancelReadableStream[F[_], A](
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright 2021 http4s.org
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+
17+
package org.http4s.dom
18+
19+
import cats.effect.IO
20+
import fs2.Chunk
21+
import fs2.Stream
22+
import munit.CatsEffectSuite
23+
import munit.ScalaCheckEffectSuite
24+
import org.scalacheck.effect.PropF.forAllF
25+
26+
class ReadableStreamSuite extends CatsEffectSuite with ScalaCheckEffectSuite {
27+
28+
test("to/read ReadableStream") {
29+
forAllF { (chunks: Vector[Vector[Byte]]) =>
30+
Stream
31+
.emits(chunks)
32+
.map(Chunk.seq(_))
33+
.unchunks
34+
.through(in => Stream.resource(toReadableStream[IO](in)))
35+
.flatMap(readable => readReadableStream(IO(readable)))
36+
.compile
37+
.toVector
38+
.assertEquals(chunks.flatten)
39+
}
40+
}
41+
42+
}

0 commit comments

Comments
 (0)