From d542685dc6fc0a15b287985bd75fdc97e66c6400 Mon Sep 17 00:00:00 2001 From: Christopher Davenport Date: Mon, 10 Jul 2023 09:49:32 -0700 Subject: [PATCH] Tests --- .../http4s/log4cats/ClientMiddleware.scala | 4 +- .../http4s/log4cats/MainSpec.scala | 69 +++++++++++++++---- 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/core/src/main/scala/io/chrisdavenport/http4s/log4cats/ClientMiddleware.scala b/core/src/main/scala/io/chrisdavenport/http4s/log4cats/ClientMiddleware.scala index ae76cf2..10439fa 100644 --- a/core/src/main/scala/io/chrisdavenport/http4s/log4cats/ClientMiddleware.scala +++ b/core/src/main/scala/io/chrisdavenport/http4s/log4cats/ClientMiddleware.scala @@ -329,7 +329,7 @@ object ClientMiddleware { } } - private def request[F[_]](request: Request[Pure], headers: Set[CIString], routeClassifier: Request[Pure] => Option[String], includeUrl: Request[Pure] => Boolean, additionalRequestContext: Request[Pure] => Map[String, String]): Map[String, String] = { + private def request[F[_]](request: Request[Pure], headers: Set[CIString], routeClassifier: Request[Pure] => Option[String], includeUrl: Request[Pure] => Boolean, additionalRequestContext: Request[Pure] => Map[String, String]): Map[String, String] = { val builder = MapBuilderImpl[String, String]() builder += HttpStructuredContext.Common.method(request.method) if (includeUrl(request)) { @@ -344,7 +344,7 @@ object ClientMiddleware { request.uri.scheme.foreach( s => builder += HttpStructuredContext.Common.scheme(s) ) - request.headers.get[`User-Agent`].foreach( ua => + request.headers.get[`User-Agent`].foreach( ua => builder += HttpStructuredContext.Common.userAgent(ua) ) diff --git a/core/src/test/scala/io/chrisdavenport/http4s/log4cats/MainSpec.scala b/core/src/test/scala/io/chrisdavenport/http4s/log4cats/MainSpec.scala index cc0496f..b3a51f8 100644 --- a/core/src/test/scala/io/chrisdavenport/http4s/log4cats/MainSpec.scala +++ b/core/src/test/scala/io/chrisdavenport/http4s/log4cats/MainSpec.scala @@ -11,10 +11,11 @@ import org.typelevel.log4cats.testing.StructuredTestingLogger.DEBUG import org.typelevel.log4cats.testing.StructuredTestingLogger.INFO import org.typelevel.log4cats.testing.StructuredTestingLogger.WARN import org.typelevel.log4cats.testing.StructuredTestingLogger.ERROR +import org.http4s.client.Client class MainSpec extends CatsEffectSuite { - test("Successfully Create a Context Log") { + test("Successfully Create a Server Context Log") { val logger = StructuredTestingLogger.impl[IO]() val server = HttpRoutes.of[IO]{ @@ -22,13 +23,16 @@ class MainSpec extends CatsEffectSuite { }.orNotFound val builder = ServerMiddleware.fromLogger(logger) + .withLogRequestBody(false) + .withLogResponseBody(false) + .withRemovedContextKeys(Set("http.duration_ms")) val finalApp = builder.httpApp(server) (finalApp.run(Request[IO](Method.GET)) *> logger.logged).map{ logged => assertEquals( - logged.map(removeDuration), + logged, Vector( INFO( "Http Server - GET", @@ -50,7 +54,7 @@ class MainSpec extends CatsEffectSuite { } } - test("Successfully Create a Context Log with Body") { + test("Successfully Create a Server Context Log with Body") { val logger = StructuredTestingLogger.impl[IO]() val server = HttpRoutes.of[IO]{ @@ -60,6 +64,7 @@ class MainSpec extends CatsEffectSuite { val builder = ServerMiddleware.fromLogger(logger) .withLogRequestBody(true) .withLogResponseBody(true) + .withRemovedContextKeys(Set("http.duration_ms")) val finalApp = builder.httpApp(server) val request = Request[IO](Method.GET).withEntity("Hello from Request!") @@ -67,7 +72,7 @@ class MainSpec extends CatsEffectSuite { (finalApp.run(request).flatMap(_.body.compile.drain) *> logger.logged).map{ logged => assertEquals( - logged.map(removeDuration), + logged, Vector( INFO( "Http Server - GET", @@ -104,6 +109,7 @@ class MainSpec extends CatsEffectSuite { val builder = ServerMiddleware.fromLogger(logger) .withLogRequestBody(true) .withLogResponseBody(true) + .withRemovedContextKeys(Set("http.duration_ms")) .withLogMessage{ case (req, Outcome.Succeeded(Some(resp)), _) => s"Req Body - ${req.body.through(fs2.text.utf8.decode).compile.string}\nResp Body - ${resp.body.through(fs2.text.utf8.decode).compile.string}" case (_, _, _) => "Whoops!" @@ -115,7 +121,7 @@ class MainSpec extends CatsEffectSuite { (finalApp.run(request).flatMap(_.body.compile.drain) *> logger.logged).map{ logged => assertEquals( - logged.map(removeDuration), + logged, Vector( INFO( "Req Body - Hello from Request!\nResp Body - Hello from Response!", @@ -142,13 +148,52 @@ class MainSpec extends CatsEffectSuite { } } - def removeDuration(lm: StructuredTestingLogger.LogMessage): StructuredTestingLogger.LogMessage = lm match { - case TRACE(message, throwOpt, ctx) => TRACE(message, throwOpt, ctx - "http.duration_ms") - case DEBUG(message, throwOpt, ctx) => DEBUG(message, throwOpt, ctx - "http.duration_ms") - case INFO(message, throwOpt, ctx) => INFO(message, throwOpt, ctx - "http.duration_ms") - case WARN(message, throwOpt, ctx) => WARN(message, throwOpt, ctx - "http.duration_ms") - case ERROR(message, throwOpt, ctx) => ERROR(message, throwOpt, ctx - "http.duration_ms") + test("Successfully Create a Client Context Log with Body") { + val logger = StructuredTestingLogger.impl[IO]() + + val server = HttpRoutes.of[IO]{ + case req => req.body.compile.drain >> Response[IO](Status.Ok).withEntity("Hello from Response!").pure[IO] + }.orNotFound + + val client = Client.fromHttpApp(server) + + val builder = ClientMiddleware.fromLogger(logger) + .withLogRequestBody(true) + .withLogResponseBody(true) + .withRemovedContextKeys(Set("http.duration_ms")) + + val finalApp = builder.client(client) + val request = Request[IO](Method.GET).withEntity("Hello from Request!") + + (finalApp.run(request).use(_.body.compile.drain) *> logger.logged).map{ + logged => + assertEquals( + logged, + Vector( + INFO( + "Http Server - GET", + None, + Map( + "http.response.header.content-length" -> "20", + "http.target" -> "/", + "exit.case" -> "succeeded", + "http.method" -> "GET", + "http.request_content_length" -> "19", + "http.status_code" -> "200", + "http.request.body" -> "Hello from Request!", + "http.response.body" -> "Hello from Response!", + "http.request.header.content-length" -> "19", + "http.request.header.content-type" -> "text/plain; charset=UTF-8", + "http.response.header.content-type" -> "text/plain; charset=UTF-8", + "http.response_content_length" -> "20", + "http.host" -> "localhost", + "http.flavor" -> "1.1", + "http.url" -> "/" + ) + ) + )) + } } - + }