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:05 UTC
(grails-core) 01/01: test: some test cleanup for readability
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'
}