You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by ma...@apache.org on 2026/08/25 21:13:04 UTC
(grails-core) branch revert/16192-async-changes-test-cleanup created (now 318b1b6dc4)
This is an automated email from the ASF dual-hosted git repository.
matrei pushed a change to branch revert/16192-async-changes-test-cleanup
in repository https://gitbox.apache.org/repos/asf/grails-core.git
at 318b1b6dc4 test: some test cleanup for readability
This branch includes the following new commits:
new 318b1b6dc4 test: some test cleanup for readability
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(grails-core) 01/01: test: some test cleanup for readability
Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
matrei pushed a commit to branch revert/16192-async-changes-test-cleanup
in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 318b1b6dc429e47d262b0d1bae3877bfb8f99774
Author: Mattias Reichel <ma...@gmail.com>
AuthorDate: Tue Aug 25 23:12:27 2026 +0200
test: some test cleanup for readability
---
.../grails/async/services/WebPromisesSpec.groovy | 48 ++++++++++---------
...equestPromiseDecoratorLookupStrategySpec.groovy | 13 ++---
.../AsyncWebRequestPromiseDecoratorSpec.groovy | 56 +++++++++++++---------
3 files changed, 65 insertions(+), 52 deletions(-)
diff --git a/grails-async/plugin/src/test/groovy/grails/async/services/WebPromisesSpec.groovy b/grails-async/plugin/src/test/groovy/grails/async/services/WebPromisesSpec.groovy
index 4cdc5a9aa9..9fbe682e11 100644
--- a/grails-async/plugin/src/test/groovy/grails/async/services/WebPromisesSpec.groovy
+++ b/grails-async/plugin/src/test/groovy/grails/async/services/WebPromisesSpec.groovy
@@ -18,23 +18,23 @@
*/
package grails.async.services
+import jakarta.servlet.AsyncContext
import jakarta.servlet.AsyncEvent
-import grails.async.web.AsyncGrailsWebRequest
-import grails.async.Promises
-import grails.async.web.WebPromises
-import grails.util.GrailsWebMockUtil
-import org.grails.web.servlet.mvc.GrailsWebRequest
+import spock.lang.Specification
+
import org.springframework.mock.web.MockAsyncContext
import org.springframework.mock.web.MockHttpServletRequest
import org.springframework.mock.web.MockHttpServletResponse
import org.springframework.mock.web.MockServletContext
import org.springframework.web.context.request.RequestContextHolder
-import spock.lang.Specification
-/**
- * Created by graemerocher on 20/02/2017.
- */
+import grails.async.Promises
+import grails.async.web.AsyncGrailsWebRequest
+import grails.async.web.WebPromises
+import grails.util.GrailsWebMockUtil
+import org.grails.web.servlet.mvc.GrailsWebRequest
+
class WebPromisesSpec extends Specification {
void cleanup() {
@@ -66,24 +66,25 @@ class WebPromisesSpec extends Specification {
void 'a callback attached during async dispatch reuses the active request'() {
given:
- MockServletContext servletContext = new MockServletContext()
- MockHttpServletResponse response = new MockHttpServletResponse()
+ def servletContext = new MockServletContext()
+ def response = new MockHttpServletResponse()
int starts = 0
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext) {
+ def request = new MockHttpServletRequest(servletContext) {
@Override
boolean isAsyncStarted() {
false
}
@Override
- jakarta.servlet.AsyncContext startAsync() {
+ AsyncContext startAsync() {
starts++
throw new IllegalStateException('The request is already dispatching')
}
+ }.tap {
+ asyncSupported = true
}
- request.asyncSupported = true
- MockAsyncContext asyncContext = new MockAsyncContext(request, response)
- AsyncGrailsWebRequest asyncWebRequest = new AsyncGrailsWebRequest(request, response, servletContext)
+ def asyncContext = new MockAsyncContext(request, response)
+ def asyncWebRequest = new AsyncGrailsWebRequest(request, response, servletContext)
asyncWebRequest.asyncContext = asyncContext
RequestContextHolder.setRequestAttributes(new GrailsWebRequest(request, response, servletContext))
@@ -99,12 +100,13 @@ class WebPromisesSpec extends Specification {
void 'a callback attached after async completion still fails visibly'() {
given:
- MockServletContext servletContext = new MockServletContext()
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext)
- MockHttpServletResponse response = new MockHttpServletResponse()
- MockAsyncContext asyncContext = new MockAsyncContext(request, response)
- AsyncGrailsWebRequest asyncWebRequest = new AsyncGrailsWebRequest(request, response, servletContext)
- asyncWebRequest.asyncContext = asyncContext
+ def servletContext = new MockServletContext()
+ def request = new MockHttpServletRequest(servletContext)
+ def response = new MockHttpServletResponse()
+ def asyncContext = new MockAsyncContext(request, response)
+ def asyncWebRequest = new AsyncGrailsWebRequest(request, response, servletContext).tap {
+ it.asyncContext = asyncContext
+ }
asyncWebRequest.onComplete(new AsyncEvent(asyncContext))
RequestContextHolder.setRequestAttributes(new GrailsWebRequest(request, response, servletContext))
@@ -112,7 +114,7 @@ class WebPromisesSpec extends Specification {
WebPromises.task { 'too late' }
then:
- IllegalStateException exception = thrown()
+ def exception = thrown(IllegalStateException)
exception.message == 'Cannot start a task once asynchronous request processing has completed'
}
}
diff --git a/grails-async/plugin/src/test/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategySpec.groovy b/grails-async/plugin/src/test/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategySpec.groovy
index 1f734cb790..0aaea8fac2 100644
--- a/grails-async/plugin/src/test/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategySpec.groovy
+++ b/grails-async/plugin/src/test/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategySpec.groovy
@@ -53,14 +53,15 @@ class AsyncWebRequestPromiseDecoratorLookupStrategySpec extends Specification {
strategy.findDecorators()
then: 'the invalid lifecycle is reported instead of silently running undecorated'
- IllegalStateException exception = thrown()
+ def exception = thrown(IllegalStateException)
exception.message.contains('Async state [DISPATCHING]')
}
void 'a request that cannot process asynchronously at all still says so'() {
given: 'what a caller gets for asking of a request that will never do this'
- MockHttpServletRequest request = requestRefusingToStart()
- request.asyncSupported = false
+ def request = requestRefusingToStart().tap {
+ asyncSupported = false
+ }
bind(request)
when:
@@ -76,7 +77,7 @@ class AsyncWebRequestPromiseDecoratorLookupStrategySpec extends Specification {
}
private static MockHttpServletRequest requestRefusingToStart() {
- MockHttpServletRequest request = new MockHttpServletRequest() {
+ new MockHttpServletRequest() {
@Override
AsyncContext startAsync() {
@@ -88,9 +89,9 @@ class AsyncWebRequestPromiseDecoratorLookupStrategySpec extends Specification {
AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) {
startAsync()
}
+ }.tap {
+ asyncSupported = true
}
- request.asyncSupported = true
- request
}
private static void bind(HttpServletRequest request) {
diff --git a/grails-async/plugin/src/test/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorSpec.groovy b/grails-async/plugin/src/test/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorSpec.groovy
index 5715f84a9c..5f8f62ccc3 100644
--- a/grails-async/plugin/src/test/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorSpec.groovy
+++ b/grails-async/plugin/src/test/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorSpec.groovy
@@ -47,10 +47,12 @@ class AsyncWebRequestPromiseDecoratorSpec extends Specification {
void 'a task runs while the cycle its decorator started is running'() {
given:
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext)
- request.asyncSupported = true
- AsyncWebRequestPromiseDecorator decorator =
- new AsyncWebRequestPromiseDecorator(new GrailsWebRequest(request, response, servletContext))
+ def request = new MockHttpServletRequest(servletContext).tap {
+ asyncSupported = true
+ }
+ def decorator = new AsyncWebRequestPromiseDecorator(
+ new GrailsWebRequest(request, response, servletContext)
+ )
expect:
decorator.decorate { it -> 'ran' }.call('in') == 'ran'
@@ -58,28 +60,33 @@ class AsyncWebRequestPromiseDecoratorSpec extends Specification {
void 'a task refuses to run once the cycle its decorator started is no longer running'() {
given:
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext)
- request.asyncSupported = true
- AsyncWebRequestPromiseDecorator decorator =
- new AsyncWebRequestPromiseDecorator(new GrailsWebRequest(request, response, servletContext))
+ def request = new MockHttpServletRequest(servletContext).tap {
+ asyncSupported = true
+ }
+ def decorator = new AsyncWebRequestPromiseDecorator(
+ new GrailsWebRequest(request, response, servletContext)
+ )
when: 'the cycle is dispatched, so the request reports it as no longer started'
request.asyncStarted = false
decorator.decorate { it -> 'ran' }.call('in')
then: 'completion has not been observed yet, but a cycle this decorator started must still be running'
- IllegalStateException exception = thrown()
+ def exception = thrown(IllegalStateException)
exception.message == 'Asynchronous request already terminated. Likely timeout reached'
}
void 'a task joining a cycle in flight runs while the container delivers its result'() {
given: 'an asynchronous request whose cycle is dispatching: live, but no longer started'
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext)
- request.asyncSupported = true
- AsyncGrailsWebRequest asyncWebRequest = new AsyncGrailsWebRequest(request, response, servletContext)
- asyncWebRequest.asyncContext = new MockAsyncContext(request, response)
- AsyncWebRequestPromiseDecorator decorator =
- new AsyncWebRequestPromiseDecorator(new GrailsWebRequest(request, response, servletContext))
+ def request = new MockHttpServletRequest(servletContext).tap {
+ asyncStarted = true
+ }
+ def asyncWebRequest = new AsyncGrailsWebRequest(request, response, servletContext).tap {
+ asyncContext = new MockAsyncContext(request, response)
+ }
+ def decorator = new AsyncWebRequestPromiseDecorator(
+ new GrailsWebRequest(request, response, servletContext)
+ )
expect:
decorator.decorate { it -> 'ran' }.call('in') == 'ran'
@@ -87,20 +94,23 @@ class AsyncWebRequestPromiseDecoratorSpec extends Specification {
void 'a task joining a cycle refuses to run once that cycle completes'() {
given:
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext)
- request.asyncSupported = true
- AsyncGrailsWebRequest asyncWebRequest = new AsyncGrailsWebRequest(request, response, servletContext)
- MockAsyncContext asyncContext = new MockAsyncContext(request, response)
- asyncWebRequest.asyncContext = asyncContext
- AsyncWebRequestPromiseDecorator decorator =
- new AsyncWebRequestPromiseDecorator(new GrailsWebRequest(request, response, servletContext))
+ def request = new MockHttpServletRequest(servletContext).tap {
+ asyncSupported = true
+ }
+ def asyncContext = new MockAsyncContext(request, response)
+ def asyncWebRequest = new AsyncGrailsWebRequest(request, response, servletContext).tap {
+ it.asyncContext = asyncContext
+ }
+ def decorator = new AsyncWebRequestPromiseDecorator(
+ new GrailsWebRequest(request, response, servletContext)
+ )
when: 'the cycle completes after the task was attached but before it runs'
asyncWebRequest.onComplete(new AsyncEvent(asyncContext))
decorator.decorate { it -> 'ran' }.call('in')
then:
- IllegalStateException exception = thrown()
+ def exception = thrown(IllegalStateException)
exception.message == 'Asynchronous request already terminated. Likely timeout reached'
}