Модульное тестирование конечных точек веб-сокета маршрутизатора http4s - PullRequest
4 голосов
/ 18 марта 2020

Идея состоит в том, чтобы иметь возможность модульного тестирования конечных точек веб-сокета в службе маршрутизатора. Любой другой тип конечной точки довольно просто протестировать с помощью Request, но я не могу найти способ легко протестировать ответы веб-сокетов, поскольку попадание на конечную точку с Request даст вам ошибку 501, так как вы не у меня нет соответствующего сокета для рукопожатия.

Это маршрутизатор, который я использую

def router(averages: IO[SomeAverages]): HttpRoutes[F] =
    HttpRoutes.of[F] {
        case GET -> Root =>
            val toClient: Stream[F, WebSocketFrame] = {
                Stream
                  .awakeEvery[F](5.seconds)
                  .map(_ => {
                      val avg = averages.unsafeRunSync
                      WebSocketFrame.Text(avg.toString)
                  })
            }
            val fromClient: Pipe[F, WebSocketFrame, Unit] = _.evalMap {
                case WebSocketFrame.Text(t, _) => F.delay(println(t))
                case f => F.delay(println(s"Unknown type: $f"))
            }
            WebSocketBuilder[F].build(toClient, fromClient)
    }

Идея состоит в том, чтобы получить что-то похожее на приведенный ниже код для работы с веб-сокетами

val server = Server.initServer[IO]
val router = server.router
val request = Request[IO](Method.GET, uri"/")

val io = router.orNotFound.run(request)

val response = io.unsafeRunSync

// response.status should be 200
// will return 501 if a websocket endpoint

Я пробовал варианты этого типа, такие как добавление заголовков, таких как

val request = Request[IO](
    Method.GET,
    uri"/",
    Headers(Header("Connection", "Upgrade"), Header("Upgrade", "websocket")
)

Хотя любой Request вернет 501.

Я не уверен, где go отсюда, так что если у кого-нибудь есть какие-либо предложения, я буду рад выслушать. Я думаю, что это как-то связано с созданием клиента websocket, но я не знаю, как это сделать в http4s.

...