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'
     }