From a1a2e647e4aabc3a482dc2b9f2570c2710652db4 Mon Sep 17 00:00:00 2001 From: cosmin-marginean Date: Thu, 2 May 2024 08:38:30 +0100 Subject: [PATCH] Cleanup filters design --- examples/gradle.properties | 4 +- .../invirt/examples/hotwire/Application.kt | 10 +- .../invirt/examples/hotwire/user-forms.kt | 2 +- gradle.properties | 2 +- .../kotlin/invirt/http4k/current-request.kt | 16 +++ .../{CatchAllFilter.kt => CatchAll.kt} | 2 +- ...acheErrorsFilter.kt => DontCacheErrors.kt} | 2 +- .../{ErrorPagesFilter.kt => ErrorPages.kt} | 2 +- ...ttpAccessLogFilter.kt => HttpAccessLog.kt} | 2 +- ...tusOverrideFilter.kt => StatusOverride.kt} | 2 +- .../http4k/views/InvirtPebbleTemplates.kt | 2 +- .../invirt/pebble/InvirtPebbleExtension.kt | 3 - .../kotlin/invirt/pebble/RequestContext.kt | 106 ------------------ .../kotlin/invirt/pebble/functions/uri.kt | 1 - .../kotlin/invirt/pebble/functions/utils.kt | 2 +- .../http4k/filters/CatchAllFilterTest.kt | 2 +- .../filters/DontCacheErrorsFilterTest.kt | 6 +- .../http4k/filters/ErrorPagesFilterTest.kt | 6 +- .../http4k/filters/HttpAccessLogFilterTest.kt | 8 +- .../filters/StatusOverrideFilterTest.kt | 2 +- .../http4k/views/InvirtPebbleTemplatesTest.kt | 4 +- .../kotlin/invirt/pebble/PebbleFilterTest.kt | 6 +- .../invirt/pebble/PebbleFunctionsTest.kt | 7 +- .../kotlin/invirt/pebble/ValidationTest.kt | 7 +- 24 files changed, 57 insertions(+), 149 deletions(-) create mode 100644 invirt-http4k/src/main/kotlin/invirt/http4k/current-request.kt rename invirt-http4k/src/main/kotlin/invirt/http4k/filters/{CatchAllFilter.kt => CatchAll.kt} (97%) rename invirt-http4k/src/main/kotlin/invirt/http4k/filters/{DontCacheErrorsFilter.kt => DontCacheErrors.kt} (95%) rename invirt-http4k/src/main/kotlin/invirt/http4k/filters/{ErrorPagesFilter.kt => ErrorPages.kt} (96%) rename invirt-http4k/src/main/kotlin/invirt/http4k/filters/{HttpAccessLogFilter.kt => HttpAccessLog.kt} (97%) rename invirt-http4k/src/main/kotlin/invirt/http4k/filters/{StatusOverrideFilter.kt => StatusOverride.kt} (95%) delete mode 100644 invirt-http4k/src/main/kotlin/invirt/pebble/RequestContext.kt diff --git a/examples/gradle.properties b/examples/gradle.properties index 557f7bf..e1d923c 100644 --- a/examples/gradle.properties +++ b/examples/gradle.properties @@ -1,2 +1,2 @@ -invirtVersion = 0.8.24 -http4kVersion = 5.16.2.0 +invirtVersion = 0.8.26 +http4kVersion = 5.17.0.0 diff --git a/examples/hotwire/src/main/kotlin/invirt/examples/hotwire/Application.kt b/examples/hotwire/src/main/kotlin/invirt/examples/hotwire/Application.kt index 50724d0..b362ce0 100644 --- a/examples/hotwire/src/main/kotlin/invirt/examples/hotwire/Application.kt +++ b/examples/hotwire/src/main/kotlin/invirt/examples/hotwire/Application.kt @@ -1,10 +1,8 @@ package invirt.examples.hotwire import invirt.http4k.* -import invirt.http4k.filters.CatchAllFilter -import invirt.http4k.views.errorResponse -import invirt.http4k.views.withView -import invirt.pebble.invirtPebbleFilter +import invirt.http4k.filters.CatchAll +import invirt.http4k.views.* import io.github.oshai.kotlinlogging.KotlinLogging import org.http4k.cloudnative.env.Environment import org.http4k.cloudnative.env.EnvironmentKey @@ -29,8 +27,8 @@ class Application { val userService = UserService() val appHandler = AppRequestContexts() - .then(CatchAllFilter()) - .then(invirtPebbleFilter) + .then(CatchAll()) + .then(StoreRequestOnThread()) .then( routes( "/" GET { diff --git a/examples/hotwire/src/main/kotlin/invirt/examples/hotwire/user-forms.kt b/examples/hotwire/src/main/kotlin/invirt/examples/hotwire/user-forms.kt index 5fbad6e..8649d3b 100644 --- a/examples/hotwire/src/main/kotlin/invirt/examples/hotwire/user-forms.kt +++ b/examples/hotwire/src/main/kotlin/invirt/examples/hotwire/user-forms.kt @@ -1,6 +1,6 @@ package invirt.examples.hotwire -import invirt.http4k.ViewResponse +import invirt.http4k.views.ViewResponse import io.validk.ValidObject import io.validk.Validation import io.validk.email diff --git a/gradle.properties b/gradle.properties index 0b76c40..8733a24 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -invirtVersion = 0.8.24 +invirtVersion = 0.8.26 kotlinVersion = 1.9.23 http4kVersion = 5.17.0.0 mockkVersion = 1.13.9 diff --git a/invirt-http4k/src/main/kotlin/invirt/http4k/current-request.kt b/invirt-http4k/src/main/kotlin/invirt/http4k/current-request.kt new file mode 100644 index 0000000..b99789a --- /dev/null +++ b/invirt-http4k/src/main/kotlin/invirt/http4k/current-request.kt @@ -0,0 +1,16 @@ +package invirt.http4k + +import org.http4k.core.Filter +import org.http4k.core.Request + +internal val requestThreadLocal = ThreadLocal() +val currentHttp4kRequest: Request? get() = requestThreadLocal.get() + +/** + * Stores the current http4k request on a thread local. The request can then be accessed with [currentHttp4kRequest] + */ +object StoreRequestOnThread { + operator fun invoke(): Filter { + return requestScopeValue(requestThreadLocal) { it } + } +} diff --git a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/CatchAllFilter.kt b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/CatchAll.kt similarity index 97% rename from invirt-http4k/src/main/kotlin/invirt/http4k/filters/CatchAllFilter.kt rename to invirt-http4k/src/main/kotlin/invirt/http4k/filters/CatchAll.kt index da7c291..6a20e5a 100644 --- a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/CatchAllFilter.kt +++ b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/CatchAll.kt @@ -8,7 +8,7 @@ import kotlin.reflect.KClass private val log = KotlinLogging.logger {} -object CatchAllFilter { +object CatchAll { operator fun invoke(vararg exceptionStatusMappings: Pair, Status>): Filter { return invoke(exceptionStatusMappings.toMap()) diff --git a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/DontCacheErrorsFilter.kt b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/DontCacheErrors.kt similarity index 95% rename from invirt-http4k/src/main/kotlin/invirt/http4k/filters/DontCacheErrorsFilter.kt rename to invirt-http4k/src/main/kotlin/invirt/http4k/filters/DontCacheErrors.kt index 6b24bf2..2b96a1c 100644 --- a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/DontCacheErrorsFilter.kt +++ b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/DontCacheErrors.kt @@ -7,7 +7,7 @@ import org.http4k.core.noCache /** * Disable caching for certain error statuses */ -object DontCacheErrorsFilter { +object DontCacheErrors { operator fun invoke(vararg errorStatuses: Status = arrayOf(Status.NOT_FOUND)): Filter { return invoke(errorStatuses.toSet()) diff --git a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/ErrorPagesFilter.kt b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/ErrorPages.kt similarity index 96% rename from invirt-http4k/src/main/kotlin/invirt/http4k/filters/ErrorPagesFilter.kt rename to invirt-http4k/src/main/kotlin/invirt/http4k/filters/ErrorPages.kt index a840552..8ea01b1 100644 --- a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/ErrorPagesFilter.kt +++ b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/ErrorPages.kt @@ -7,7 +7,7 @@ import org.http4k.core.Status /** * Renders a view based on a status code */ -object ErrorPagesFilter { +object ErrorPages { operator fun invoke(vararg statusViewMappings: Pair): Filter { return invoke(statusViewMappings.toMap()) diff --git a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/HttpAccessLogFilter.kt b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/HttpAccessLog.kt similarity index 97% rename from invirt-http4k/src/main/kotlin/invirt/http4k/filters/HttpAccessLogFilter.kt rename to invirt-http4k/src/main/kotlin/invirt/http4k/filters/HttpAccessLog.kt index 52ac00f..221ad57 100644 --- a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/HttpAccessLogFilter.kt +++ b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/HttpAccessLog.kt @@ -5,7 +5,7 @@ import org.http4k.core.Filter import org.http4k.core.HttpTransaction import org.http4k.filter.ResponseFilters -object HttpAccessLogFilter { +object HttpAccessLog { internal val log = KotlinLogging.logger {} diff --git a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/StatusOverrideFilter.kt b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/StatusOverride.kt similarity index 95% rename from invirt-http4k/src/main/kotlin/invirt/http4k/filters/StatusOverrideFilter.kt rename to invirt-http4k/src/main/kotlin/invirt/http4k/filters/StatusOverride.kt index 63eb12f..79c1abb 100644 --- a/invirt-http4k/src/main/kotlin/invirt/http4k/filters/StatusOverrideFilter.kt +++ b/invirt-http4k/src/main/kotlin/invirt/http4k/filters/StatusOverride.kt @@ -6,7 +6,7 @@ import org.http4k.core.Status private val log = KotlinLogging.logger {} -object StatusOverrideFilter { +object StatusOverride { operator fun invoke(vararg overrides: Pair): Filter { return invoke(overrides.toMap()) diff --git a/invirt-http4k/src/main/kotlin/invirt/http4k/views/InvirtPebbleTemplates.kt b/invirt-http4k/src/main/kotlin/invirt/http4k/views/InvirtPebbleTemplates.kt index ae7f9cc..1699f67 100644 --- a/invirt-http4k/src/main/kotlin/invirt/http4k/views/InvirtPebbleTemplates.kt +++ b/invirt-http4k/src/main/kotlin/invirt/http4k/views/InvirtPebbleTemplates.kt @@ -1,6 +1,6 @@ package invirt.http4k.views -import invirt.pebble.currentHttp4kRequest +import invirt.http4k.currentHttp4kRequest import io.github.oshai.kotlinlogging.KotlinLogging import io.pebbletemplates.pebble.PebbleEngine import io.pebbletemplates.pebble.error.LoaderException diff --git a/invirt-http4k/src/main/kotlin/invirt/pebble/InvirtPebbleExtension.kt b/invirt-http4k/src/main/kotlin/invirt/pebble/InvirtPebbleExtension.kt index c590607..41fa8be 100644 --- a/invirt-http4k/src/main/kotlin/invirt/pebble/InvirtPebbleExtension.kt +++ b/invirt-http4k/src/main/kotlin/invirt/pebble/InvirtPebbleExtension.kt @@ -1,6 +1,5 @@ package invirt.pebble -import invirt.http4k.requestScopeValue import invirt.pebble.filters.DateWithDaySuffixFilter import invirt.pebble.functions.* import invirt.utils.uuid7 @@ -9,8 +8,6 @@ import io.pebbletemplates.pebble.extension.Filter import io.pebbletemplates.pebble.extension.Function import java.time.LocalDate -val invirtPebbleFilter: org.http4k.core.Filter = requestScopeValue(requestThreadLocal) { it } - class InvirtPebbleExtension : AbstractExtension() { override fun getFunctions(): Map { diff --git a/invirt-http4k/src/main/kotlin/invirt/pebble/RequestContext.kt b/invirt-http4k/src/main/kotlin/invirt/pebble/RequestContext.kt deleted file mode 100644 index cf70efd..0000000 --- a/invirt-http4k/src/main/kotlin/invirt/pebble/RequestContext.kt +++ /dev/null @@ -1,106 +0,0 @@ -package invirt.pebble - -import org.http4k.core.Request - -internal val requestThreadLocal = ThreadLocal() -val currentHttp4kRequest: Request? get() = requestThreadLocal.get() - -// object RequestContext { -// val requestThreadLocal = ThreadLocal() -// val request: Request? get() = requestThreadLocal.get() -// -// fun with(request: Request, block: () -> R): R { -// return requestThreadLocal.withValue(request, block) -// } -// -// fun replaceParam(param: String, newValue: Any): String { -// return replaceParams(mapOf(param to newValue)) -// } -// -// fun removeParams(params: Collection): String { -// return replaceParams(params.associateWith { "" }) -// } -// -// fun removeParam(param: String): String { -// return removeParams(listOf(param)) -// } -// -// fun replaceParams(newParams: Map): String { -// val queries = request!!.uri.queries() -// val newQueries: List> = -// if (queries.isNotEmpty()) { -// // Slightly overcomplicated, in order to maintain param order -// val replacedParams = mutableSetOf() -// queries.map { -// val param = it.first -// if (newParams.containsKey(param)) { -// replacedParams.add(param) -// param to newParams[param] -// } else { -// it -// } -// }.plus(newParams.filter { it.key !in replacedParams }.toList()) -// } else { -// newParams.toList() -// } -// val requestParams = -// newQueries -// .map { it.first to it.second.toString() } -// .filter { it.second.isNotBlank() } -// return if (requestParams.isEmpty()) { -// request!!.uri.path -// } else { -// request!!.uri.path + "?" + requestParams.toUrlFormEncoded() -// } -// } -// -// fun addParamValue(param: String, newValue: Any, separator: String): String { -// val existingParam = request!!.query(param) -// return if (existingParam.isNullOrBlank()) { -// replaceParam(param, newValue) -// } else { -// val newParamValue = -// existingParam.split(",") -// .toSet() -// .plus(newValue.toString()) -// .joinToString(separator) -// replaceParam(param, newParamValue) -// } -// } -// -// fun removeParamValue( -// param: String, -// newValue: Any, -// separator: String, -// ): String { -// val existingParam = request!!.query(param) -// if (existingParam.isNullOrBlank()) { -// return request!!.uri.toString() -// } else { -// val newParamValue = -// existingParam -// .split(separator) -// .minus(newValue.toString()) -// .joinToString(separator) -// return replaceParam(param, newParamValue) -// } -// } -// -// fun replacePage(page: Page): String { -// return replaceParams( -// mapOf( -// "from" to page.from, -// "size" to page.size, -// ), -// ) -// } -// -// fun revertSort(): String { -// val sort = request!!.sort() -// return if (sort == null) { -// request!!.uri.toString() -// } else { -// replaceParam("sort", sort.revert().toString()) -// } -// } -// } diff --git a/invirt-http4k/src/main/kotlin/invirt/pebble/functions/uri.kt b/invirt-http4k/src/main/kotlin/invirt/pebble/functions/uri.kt index bad1ab5..87c1839 100644 --- a/invirt-http4k/src/main/kotlin/invirt/pebble/functions/uri.kt +++ b/invirt-http4k/src/main/kotlin/invirt/pebble/functions/uri.kt @@ -2,7 +2,6 @@ package invirt.pebble.functions import invirt.data.Page import invirt.http4k.* -import invirt.pebble.currentHttp4kRequest val replaceQueryFunction = pebbleFunction("replaceQuery", "name", "value") { currentHttp4kRequest!!.uri.replaceQuery(args["name"] as String to args["value"]!!) diff --git a/invirt-http4k/src/main/kotlin/invirt/pebble/functions/utils.kt b/invirt-http4k/src/main/kotlin/invirt/pebble/functions/utils.kt index f7c2f6f..cee6f6b 100644 --- a/invirt-http4k/src/main/kotlin/invirt/pebble/functions/utils.kt +++ b/invirt-http4k/src/main/kotlin/invirt/pebble/functions/utils.kt @@ -1,7 +1,7 @@ package invirt.pebble.functions +import invirt.http4k.currentHttp4kRequest import invirt.http4k.views.validationErrorContextKey -import invirt.pebble.currentHttp4kRequest import invirt.utils.minorUnitToString import java.util.* diff --git a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/CatchAllFilterTest.kt b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/CatchAllFilterTest.kt index 5b786d3..8dc7c58 100644 --- a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/CatchAllFilterTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/CatchAllFilterTest.kt @@ -12,7 +12,7 @@ import org.http4k.routing.routes class CatchAllFilterTest : StringSpec({ "exception to status" { - val handler = CatchAllFilter( + val handler = CatchAll( mapOf( IllegalArgumentException::class to Status.BAD_REQUEST, ClassCastException::class to Status.NOT_FOUND diff --git a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/DontCacheErrorsFilterTest.kt b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/DontCacheErrorsFilterTest.kt index f1726e2..e843a64 100644 --- a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/DontCacheErrorsFilterTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/DontCacheErrorsFilterTest.kt @@ -11,7 +11,7 @@ import org.http4k.routing.routes class DontCacheErrorsFilterTest : StringSpec({ "errors don't allow cache" { - val handler = DontCacheErrorsFilter() + val handler = DontCacheErrors() .then(cacheOneYear()) .then(routes("/test" GET { Response(Status.NOT_FOUND) })) @@ -21,7 +21,7 @@ class DontCacheErrorsFilterTest : StringSpec({ } "non-errors allow cache" { - val handler = DontCacheErrorsFilter() + val handler = DontCacheErrors() .then(cacheOneYear()) .then(routes("/test" GET { Response(Status.OK) })) @@ -31,7 +31,7 @@ class DontCacheErrorsFilterTest : StringSpec({ } "custom statuses" { - val handler = DontCacheErrorsFilter(Status.INTERNAL_SERVER_ERROR) + val handler = DontCacheErrors(Status.INTERNAL_SERVER_ERROR) .then(cacheOneYear()) .then(routes("/test" GET { Response(Status.INTERNAL_SERVER_ERROR) })) diff --git a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/ErrorPagesFilterTest.kt b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/ErrorPagesFilterTest.kt index 49e71f5..a88c015 100644 --- a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/ErrorPagesFilterTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/ErrorPagesFilterTest.kt @@ -13,7 +13,7 @@ class ErrorPagesFilterTest : StringSpec({ beforeAny { setDefaultViewLens(Views.Classpath("webapp/views")) } "404 page" { - val httpHandler = ErrorPagesFilter(Status.NOT_FOUND to "error/404") + val httpHandler = ErrorPages(Status.NOT_FOUND to "error/404") .then( routes( "/test" GET { Response(Status.NOT_FOUND) } @@ -24,8 +24,8 @@ class ErrorPagesFilterTest : StringSpec({ } "forbidden mapped to not found and custom error page" { - val httpHandler = ErrorPagesFilter(mapOf(Status.NOT_FOUND to "error/404")) - .then(StatusOverrideFilter(Status.FORBIDDEN to Status.NOT_FOUND)) + val httpHandler = ErrorPages(mapOf(Status.NOT_FOUND to "error/404")) + .then(StatusOverride(Status.FORBIDDEN to Status.NOT_FOUND)) .then( routes( "/test" GET { Response(Status.FORBIDDEN) } diff --git a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/HttpAccessLogFilterTest.kt b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/HttpAccessLogFilterTest.kt index f0e0779..afd13c8 100644 --- a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/HttpAccessLogFilterTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/HttpAccessLogFilterTest.kt @@ -17,7 +17,7 @@ class HttpAccessLogFilterTest : StringSpec() { init { "defaults - errors only" { - val filter = HttpAccessLogFilter() + val filter = HttpAccessLog() testLogFilter(filter, Status.OK, false) testLogFilter(filter, Status.SEE_OTHER, false) testLogFilter(filter, Status.BAD_REQUEST, true) @@ -28,7 +28,7 @@ class HttpAccessLogFilterTest : StringSpec() { } "all statuses" { - val filter = HttpAccessLogFilter(false) + val filter = HttpAccessLog(false) testLogFilter(filter, Status.OK, true) testLogFilter(filter, Status.SEE_OTHER, true) testLogFilter(filter, Status.BAD_REQUEST, true) @@ -40,10 +40,10 @@ class HttpAccessLogFilterTest : StringSpec() { } private fun testLogFilter(filter: Filter, status: Status, expectCalled: Boolean) { - mockkObject(HttpAccessLogFilter) { + mockkObject(HttpAccessLog) { val log = mockk() every { log.atInfo(any<(KLoggingEventBuilder) -> Unit>()) } returns Unit - every { HttpAccessLogFilter.log } returns log + every { HttpAccessLog.log } returns log val httpHandler = filter.then( routes( diff --git a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/StatusOverrideFilterTest.kt b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/StatusOverrideFilterTest.kt index 1eaab5d..a96cbe8 100644 --- a/invirt-http4k/src/test/kotlin/invirt/http4k/filters/StatusOverrideFilterTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/http4k/filters/StatusOverrideFilterTest.kt @@ -11,7 +11,7 @@ import org.http4k.kotest.shouldHaveStatus class StatusOverrideFilterTest : StringSpec({ "forbidden as not found" { - val httpHandler = StatusOverrideFilter(Status.FORBIDDEN to Status.NOT_FOUND) + val httpHandler = StatusOverride(Status.FORBIDDEN to Status.NOT_FOUND) .then( org.http4k.routing.routes( "/test" GET { org.http4k.core.Response(Status.FORBIDDEN) } diff --git a/invirt-http4k/src/test/kotlin/invirt/http4k/views/InvirtPebbleTemplatesTest.kt b/invirt-http4k/src/test/kotlin/invirt/http4k/views/InvirtPebbleTemplatesTest.kt index cf2bc88..63cbc63 100644 --- a/invirt-http4k/src/test/kotlin/invirt/http4k/views/InvirtPebbleTemplatesTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/http4k/views/InvirtPebbleTemplatesTest.kt @@ -1,7 +1,7 @@ package invirt.http4k.views import invirt.http4k.GET -import invirt.pebble.invirtPebbleFilter +import invirt.http4k.StoreRequestOnThread import io.kotest.core.spec.style.StringSpec import org.http4k.core.Method import org.http4k.core.Request @@ -16,7 +16,7 @@ class InvirtPebbleTemplatesTest : StringSpec({ beforeAny { setDefaultViewLens(Views.Classpath("webapp/views")) } "request object in pebble templates" { - val handler = invirtPebbleFilter.then( + val handler = StoreRequestOnThread().then( routes( "/test" GET { renderTemplate("invirt-pebble-filter-request-object") } ) diff --git a/invirt-http4k/src/test/kotlin/invirt/pebble/PebbleFilterTest.kt b/invirt-http4k/src/test/kotlin/invirt/pebble/PebbleFilterTest.kt index b28fe8b..52d79ea 100644 --- a/invirt-http4k/src/test/kotlin/invirt/pebble/PebbleFilterTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/pebble/PebbleFilterTest.kt @@ -1,6 +1,8 @@ package invirt.pebble import invirt.http4k.GET +import invirt.http4k.StoreRequestOnThread +import invirt.http4k.currentHttp4kRequest import io.kotest.assertions.throwables.shouldThrowWithMessage import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe @@ -12,7 +14,7 @@ class PebbleFilterTest : StringSpec({ "request thread local" { lateinit var requestFromHandler: Request - val handler = invirtPebbleFilter.then( + val handler = StoreRequestOnThread().then( routes( "/test" GET { request -> requestFromHandler = currentHttp4kRequest!! @@ -27,7 +29,7 @@ class PebbleFilterTest : StringSpec({ } "request thread local cleared after request even when error occurs" { - val handler = invirtPebbleFilter + val handler = StoreRequestOnThread() .then(routes("/{value}" GET { throw IllegalStateException("Cannot proceed") })) shouldThrowWithMessage("Cannot proceed") { handler(Request(Method.GET, "/test")) diff --git a/invirt-http4k/src/test/kotlin/invirt/pebble/PebbleFunctionsTest.kt b/invirt-http4k/src/test/kotlin/invirt/pebble/PebbleFunctionsTest.kt index 38b0b74..eb194b8 100644 --- a/invirt-http4k/src/test/kotlin/invirt/pebble/PebbleFunctionsTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/pebble/PebbleFunctionsTest.kt @@ -1,6 +1,7 @@ package invirt.pebble import invirt.data.Page +import invirt.http4k.StoreRequestOnThread import invirt.http4k.views.Views import invirt.http4k.views.ok import invirt.http4k.views.renderTemplate @@ -114,7 +115,7 @@ class PebbleFunctionsTest : StringSpec() { } "uuid" { - val httpHandler = invirtPebbleFilter.then(routes("/test" bind Method.GET to { renderTemplate("function-uuid") })) + val httpHandler = StoreRequestOnThread().then(routes("/test" bind Method.GET to { renderTemplate("function-uuid") })) val response1 = httpHandler(Request(Method.GET, "/test")) val response2 = httpHandler(Request(Method.GET, "/test")) @@ -131,13 +132,13 @@ class PebbleFunctionsTest : StringSpec() { } private fun testFunction(function: String, request: String, expectedBody: String) { - val httpHandler = invirtPebbleFilter.then(routes("/test" bind Method.GET to { renderTemplate("function-${function}") })) + val httpHandler = StoreRequestOnThread().then(routes("/test" bind Method.GET to { renderTemplate("function-${function}") })) val response = httpHandler(Request(Method.GET, request)) response.bodyString().trim() shouldBe expectedBody } private fun testFunctionModel(function: String, request: String = "/test", model: Any, expectedBody: String) { - val httpHandler = invirtPebbleFilter.then( + val httpHandler = StoreRequestOnThread().then( routes( "/test" bind Method.GET to { if (model is ViewModel) { diff --git a/invirt-http4k/src/test/kotlin/invirt/pebble/ValidationTest.kt b/invirt-http4k/src/test/kotlin/invirt/pebble/ValidationTest.kt index f7ec696..df52571 100644 --- a/invirt-http4k/src/test/kotlin/invirt/pebble/ValidationTest.kt +++ b/invirt-http4k/src/test/kotlin/invirt/pebble/ValidationTest.kt @@ -1,6 +1,7 @@ package invirt.pebble import invirt.http4k.AppRequestContexts +import invirt.http4k.StoreRequestOnThread import invirt.http4k.views.ViewResponse import invirt.http4k.views.Views import invirt.http4k.views.errorResponse @@ -28,7 +29,7 @@ class ValidationTest : StringSpec() { ValidationError("email", "Not a valid email"), ValidationError("details.age", "Age must be 18 or over") ) - val httpHandler = AppRequestContexts().then(invirtPebbleFilter) + val httpHandler = AppRequestContexts().then(StoreRequestOnThread()) .then(routes("/test" bind Method.GET to { Form().errorResponse(errors) })) val response = httpHandler(Request(Method.GET, "/test")) response.bodyString().trimIndent() shouldBe """ @@ -42,7 +43,7 @@ class ValidationTest : StringSpec() { class Form : ViewResponse("validation/has-errors") fun testErrors(errors: ValidationErrors, expect: Boolean) { - val httpHandler = AppRequestContexts().then(invirtPebbleFilter) + val httpHandler = AppRequestContexts().then(StoreRequestOnThread()) .then(routes("/test" bind Method.GET to { Form().errorResponse(errors) })) val response = httpHandler(Request(Method.GET, "/test")) response.bodyString().trim() shouldBe expect.toString() @@ -56,7 +57,7 @@ class ValidationTest : StringSpec() { class Form : ViewResponse("validation/errors-function-in-macro.peb") fun testErrors(errors: ValidationErrors, expect: String) { - val httpHandler = AppRequestContexts().then(invirtPebbleFilter) + val httpHandler = AppRequestContexts().then(StoreRequestOnThread()) .then(routes("/test" bind Method.GET to { Form().errorResponse(errors) })) val response = httpHandler(Request(Method.GET, "/test")) response.bodyString().trim() shouldBe expect