Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,27 @@ These can be set on the command line like so:
* `skipMongodbTests` - does not run mongo related tests
* `skipTests` - no tests will run

## Test slicing

Test classes tagged with `@spock.lang.Tag('some-tag')` can be run separately.\
Tags are inherited from superclasses, so a test class is also included if any of its ancestors is tagged.

Example:

```bash
./gradlew iT -PincludeTestTags=geb
```

Available project properties:

* `includeTestTags` - comma-separated list of test tags to include
* `excludeTestTags` - comma-separated list of test tags to exclude

Example with multiple tags:

```bash
./gradlew iT -PincludeTestTags=geb,api
```

## Start a mongo docker container (containers will start by default)
`docker run -d --name mongo-on-docker -p 27017:27017 mongo`
15 changes: 14 additions & 1 deletion gradle/functional-test-config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,20 @@ tasks.withType(Test).configureEach { Test task ->
task.outputs.dir rootProject.layout.buildDirectory.dir('mongo-test-serialize')
}

task.useJUnitPlatform()
task.useJUnitPlatform {
if (project.hasProperty('includeTestTags')) {
// Will only run tests that are tagged with specific tags
// e.g. @spock.lang.Tag('geb')
// Run with: ./gradlew iT -PincludeTags=geb (comma-separated list)
includeTags((project.property('includeTestTags') as String).split(',')*.trim() as String[])
}
if (project.hasProperty('excludeTestTags')) {
// Will not run tests that are tagged with specific tags
// e.g. @spock.lang.Tag('geb')
// Run with: ./gradlew iT -PincludeTags=geb
excludeTags((project.property('excludeTestTags') as String).split(',')*.trim() as String[])
}
}
task.testLogging {
events('passed', 'skipped', 'failed', 'standardOut', 'standardError')
showExceptions = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import geb.Page
import geb.test.GebTestManager
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Tag

import grails.plugin.geb.support.ContainerSupport
import grails.plugin.geb.support.ReportingSupport
Expand Down Expand Up @@ -55,6 +56,8 @@ import grails.plugin.geb.support.delegate.PageDelegate
* @author James Daugherty
* @since 4.1
*/
@Tag('geb')
@Tag('container-geb')
@CompileStatic
abstract class ContainerGebSpec extends Specification implements ContainerSupport, ReportingSupport, BrowserDelegate, PageDelegate, DriverDelegate, DownloadSupportDelegate {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
package functionaltests

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport

@Integration
@Tag('http-client')
class AtResourceSpec extends Specification implements HttpClientSupport {

def "A domain class annotated with @Resources exposes an endpoint"() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
package functionaltests

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport

@Integration
@Tag('http-client')
class BookRestfulControllerSpec extends Specification implements HttpClientSupport {

def "A RestfulController exposes an index endpoint for a domain class"() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
package functionaltests

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport

@Integration
@Tag('http-client')
class GspInWebappDirSpec extends Specification implements HttpClientSupport {

def 'GSP in src/main/webapp renders'() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit

import functionaltests.services.AsyncProcessingService
import spock.lang.Specification
import spock.lang.Tag
import spock.lang.Unroll

import org.springframework.beans.factory.annotation.Autowired
Expand All @@ -34,6 +35,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* Tests various async patterns including tasks, promises, chaining, and error handling.
*/
@Integration
@Tag('http-client')
class AsyncPromiseSpec extends Specification implements HttpClientSupport {

@Autowired AsyncProcessingService asyncProcessingService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.binding

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -42,6 +43,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* - String trimming
*/
@Integration
@Tag('http-client')
class AdvancedDataBindingSpec extends Specification implements HttpClientSupport {

// ========== Map-Based Binding Tests ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package functionaltests.caching

import spock.lang.Narrative
import spock.lang.Specification
import spock.lang.Tag

import org.springframework.beans.factory.annotation.Autowired

Expand All @@ -42,6 +43,7 @@ Grails caching provides method-level caching via annotations @Cacheable,
@CacheEvict, and @CachePut. This allows expensive operations to be cached
and only recomputed when necessary.
''')
@Tag('http-client')
class CachingSpec extends Specification implements HttpClientSupport {

@Autowired CacheTestService cacheTestService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.codecs

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -38,6 +39,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* - Hash consistency verification
*/
@Integration
@Tag('http-client')
class SecurityCodecsSpec extends Specification implements HttpClientSupport {

// ========== HTML Encoding Tests (XSS Prevention) ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.commanddi

import spock.lang.Specification
import spock.lang.Tag
import spock.lang.Unroll

import grails.testing.mixin.integration.Integration
Expand All @@ -29,6 +30,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* Tests the ability to inject Spring services into Grails command objects.
*/
@Integration
@Tag('http-client')
class CommandObjectDISpec extends Specification implements HttpClientSupport {

// ========== Basic Service Injection Tests ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package functionaltests.contentneg

import spock.lang.Narrative
import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -37,6 +38,7 @@ Grails provides content negotiation that allows the same controller action
to return different response formats (JSON, XML, HTML) based on the client's
Accept header or URL extension.
''')
@Tag('http-client')
class ContentNegotiationSpec extends Specification implements HttpClientSupport {

// ========== Accept Header-Based Negotiation ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.cors

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -30,6 +31,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* Note: CORS is enabled for /api/** in application.yml
*/
@Integration
@Tag('http-client')
class CorsAdvancedSpec extends Specification implements HttpClientSupport {

// ========== Basic CORS Header Tests ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.errorhandling

import spock.lang.Specification
import spock.lang.Tag
import spock.lang.Unroll

import grails.testing.mixin.integration.Integration
Expand All @@ -30,6 +31,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* and error response headers.
*/
@Integration
@Tag('http-client')
class ErrorHandlingSpec extends Specification implements HttpClientSupport {

// ========== HTTP Status Code Tests ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.fileupload

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -31,6 +32,7 @@ import org.apache.grails.testing.http.client.MultipartBody
* file validation, and metadata extraction.
*/
@Integration
@Tag('http-client')
class FileUploadSpec extends Specification implements HttpClientSupport {

// ========== Single File Upload Tests ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import java.net.http.HttpClient

import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -38,6 +39,7 @@ import org.apache.grails.testing.http.client.TestHttpResponse
* flash scope and chain model which rely on HTTP session state.
*/
@Integration
@Tag('http-client')
class FlashChainForwardSpec extends Specification implements HttpClientSupport {

@Shared
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.i18n

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -37,6 +38,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* - Accept-Language header handling
*/
@Integration
@Tag('http-client')
class InternationalizationSpec extends Specification implements HttpClientSupport {

// ========== Basic Message Resolution Tests ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.interceptors

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -34,6 +35,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* - Combined matching criteria
*/
@Integration
@Tag('http-client')
class InterceptorAdvancedMatchingSpec extends Specification implements HttpClientSupport {

def setup() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.interceptors

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -36,6 +37,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* - Timing/performance tracking
*/
@Integration
@Tag('http-client')
class InterceptorOrderingSpec extends Specification implements HttpClientSupport {

def setup() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.requestresponse

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -28,6 +29,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* headers, cookies, session management, and request attributes.
*/
@Integration
@Tag('http-client')
class RequestResponseSpec extends Specification implements HttpClientSupport {

// ========== Request Header Tests ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package functionaltests.springevents

import spock.lang.Narrative
import spock.lang.Specification
import spock.lang.Tag

import org.springframework.beans.factory.annotation.Autowired

Expand All @@ -38,6 +39,7 @@ Spring's ApplicationEvent mechanism allows decoupled communication between
components. Grails integrates with Spring events via @EventListener annotations
and ApplicationEventPublisher.
''')
@Tag('http-client')
class SpringEventsSpec extends Specification implements HttpClientSupport {

@Autowired EventListenerService eventListenerService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package functionaltests.taglib

import spock.lang.Specification
import spock.lang.Tag
import spock.lang.Unroll

import grails.testing.mixin.integration.Integration
Expand All @@ -29,6 +30,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
* Tests both custom tag libraries and built-in Grails tags.
*/
@Integration
@Tag('http-client')
class TagLibSpec extends Specification implements HttpClientSupport {

// ========== Custom Tag: hello ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package functionaltests.urlmappings

import spock.lang.Narrative
import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport
Expand All @@ -35,6 +36,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
Grails URL mappings provide flexible routing of HTTP requests to controller actions.
This includes path variables, constraints, HTTP method-based routing, and redirects.
''')
@Tag('http-client')
class UrlMappingsSpec extends Specification implements HttpClientSupport {

// ========== Static Path Mappings ==========
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
package pubsub.demo

import spock.lang.Specification
import spock.lang.Tag

import grails.testing.mixin.integration.Integration
import org.apache.grails.testing.http.client.HttpClientSupport

@Integration
@Tag('http-client')
class TaskControllerSpec extends Specification implements HttpClientSupport {

void 'test async error handling'() {
Expand Down
Loading
Loading