An extension for GraphQL testing with Wiremock
GraphqlBodyMatcher is an extension for WireMock that allows for semantical verification of GraphQL requests.
GraphqlBodyMatcherはWireMockの拡張で、GraphQLのリクエストが意味的に一致しているかを検証します。
- In addition to handling whitespaces, the extension sorts and normalizes queries. The GraphQL parsing is handled by
graphql-java
. - Beyond just queries, it also compares variables. For the comparison of JSON variables,
org.json.JSONObject.similar
is employed. It's important to note that the order of arrays must match.
For a comprehensive understanding of our matching logic and details on our match strategy, please refer to our MatchStrategy documentation.
- この拡張機能は、空白の取り扱いに加えて、クエリをソートし正規化します。GraphQLのパースには
graphql-java
を使用しています。 - クエリだけでなく、変数も比較されます。変数のJSONの比較には
org.json.JSONObject.similar
を使用しますが、配列の順番も一致している必要があります。
詳しいマッチングロジックなど関しては、MatchStrategyのドキュメントを参照してください。
repositories {
mavenCentral()
}
dependencies {
testImplementation 'io.github.nilwurtz:wiremock-graphql-extension:0.7.0'
}
<dependency>
<groupId>io.github.nilwurtz</groupId>
<artifactId>wiremock-graphql-extension</artifactId>
<version>0.7.0</version>
<scope>test</scope>
</dependency>
Here are some code examples to get started:
import io.github.nilwurtz.GraphqlBodyMatcher
WireMock.stubFor(
WireMock.post(WireMock.urlEqualTo("/graphql"))
.andMatching(GraphqlBodyMatcher.withRequestJson("""{"query": "{ hero { name }}"}"""))
.willReturn(WireMock.ok())
)
The GraphQL query is expected inside the "query"
key and variables within the "variables"
key.
val expectedQuery = """
query HeroInfo($id: Int) {
hero(id: $id) {
name
}
}
""".trimIndent()
val expectedVariables = """
{
"id": 1
}
""".trimIndent()
val expectedJson = """
{
"query": "$expectedQuery",
"variables": $expectedVariables
}
""".trimIndent()
WireMock.stubFor(
WireMock.post(WireMock.urlEqualTo("/graphql"))
.andMatching(GraphqlBodyMatcher.withRequestJson(expectedJson))
.willReturn(WireMock.ok())
)
The withRequestQueryAndVariables
method has been deprecated from version 0.6.0 onwards. Please use withRequestJson
instead.
If you are using Wiremock on a remote server such as Docker, please see the configurations below:
Please download wiremock-graphql-extension-x.y.z-jar-with-dependencies.jar
from the Release section.
docker run -it --rm \
-p 8080:8080 \
--name wiremock \
-v /path/to/wiremock-graphql-extension-0.7.0-jar-with-dependencies.jar:/var/wiremock/extensions/wiremock-graphql-extension-0.7.0-jar-with-dependencies.jar \
wiremock/wiremock \
--extensions io.github.nilwurtz.GraphqlBodyMatcher
FROM wiremock/wiremock:latest
COPY ./wiremock-graphql-extension-0.7.0-jar-with-dependencies.jar /var/wiremock/extensions/wiremock-graphql-extension-0.7.0-jar-with-dependencies.jar
CMD ["--extensions", "io.github.nilwurtz.GraphqlBodyMatcher"]
NOTE: When using a Remote Wiremock Server, you're requested to manage everything within a single JSON format.
import com.github.tomakehurst.wiremock.client.WireMock
import com.github.tomakehurst.wiremock.client.WireMock.*
import io.github.nilwurtz.GraphqlBodyMatcher
fun registerGraphQLWiremock(json: String) {
WireMock(8080).register(
post(urlPathEqualTo(endPoint))
.andMatching(GraphqlBodyMatcher.extensionName, GraphqlBodyMatcher.withRequest(json))
.willReturn(
aResponse()
.withStatus(200)
)
)
}
This project currently focuses on supporting the fundamental parts of Queries. Some advanced features, such as mutations or aliases, are not yet fully supported. However, I aim to expand this scope over time.
This project is licensed under the terms of the MIT License.
Contributions are welcome! Feel free to open an issue or submit a pull request if you have any improvements or suggestions.