GraphQL API Testing
SHAFT Engine provides first-class GraphQL support through SHAFT.API.sendGraphQlRequest(). It returns the normal request builder, so queries, mutations, variables, fragments, authentication headers, status checks, and response assertions all use the same fluent API as REST requests.
Simple Query
Send a basic GraphQL query and validate the response:
import com.shaft.driver.SHAFT;
SHAFT.API api = new SHAFT.API("https://api.example.com");
api.sendGraphQlRequest(
"/graphql",
"{ users { id name email } }"
).perform();
// Assert response content
api.assertThatResponse().extractedJsonValue("data.users").isNotNull();
Query with Variables
Pass a variables JSON string alongside the query:
// GraphQL query with variables
String query = "query GetUser($id: ID!) { user(id: $id) { name email } }";
String variables = "{\"id\": \"123\"}";
SHAFT.API api = new SHAFT.API("https://api.example.com");
api.sendGraphQlRequest(
"/graphql",
query,
variables
).perform();
Query with Fragment
Use GraphQL fragments for reusable field selections:
String fragment = "fragment UserFields on User { id name email role }";
SHAFT.API api = new SHAFT.API("https://api.example.com");
api.sendGraphQlRequest(
"/graphql",
"{ users { ...UserFields } }",
null,
fragment
).perform();
Query with Authentication Header
Add a custom header (e.g., Bearer token) alongside the query:
// GraphQL with fragment and auth header
String fragment = "fragment UserFields on User { id name email role }";
SHAFT.API api = new SHAFT.API("https://api.example.com");
api.sendGraphQlRequest(
"/graphql",
"{ users { ...UserFields } }",
null,
fragment
).addHeader("Authorization", "Bearer mytoken123").perform();
Complete Test Example
import com.shaft.driver.SHAFT;
import org.testng.annotations.Test;
public class GraphQLTest {
@Test
public void queryAllUsers() {
SHAFT.API api = new SHAFT.API("https://api.example.com");
api.sendGraphQlRequest("/graphql", "{ users { id name email } }").perform();
api.assertThatResponse().extractedJsonValue("data.users").isNotNull();
}
@Test
public void queryUserById() {
SHAFT.API api = new SHAFT.API("https://api.example.com");
String query = "query GetUser($id: ID!) { user(id: $id) { name email } }";
String variables = "{\"id\": \"1\"}";
api.sendGraphQlRequest("/graphql", query, variables).perform();
api.assertThatResponse().extractedJsonValue("data.user.email").isNotNull();
}
@Test
public void createUserMutation() {
SHAFT.API api = new SHAFT.API("https://api.example.com");
String mutation = "mutation CreateUser($input: CreateUserInput!) { "
+ "createUser(input: $input) { id name email } }";
String variables = "{\"input\": {\"name\": \"Jane\", \"email\": \"jane@example.com\"}}";
api.sendGraphQlRequest("/graphql", mutation, variables).perform();
api.assertThatResponse().extractedJsonValue("data.createUser.id").isNotNull();
}
}
Asserting with SHAFT Validations
You can also use SHAFT's built-in response validation for GraphQL responses:
import com.shaft.driver.SHAFT;
SHAFT.API api = new SHAFT.API("https://api.example.com");
api.post("/graphql")
.setRequestBody("{\"query\": \"{ users { id name } }\"}")
.addHeader("Content-Type", "application/json")
.setTargetStatusCode(200)
.perform();
api.assertThatResponse()
.extractedJsonValue("data.users[0].name")
.isEqualTo("John Doe");
Use the variables parameter instead of string interpolation in GraphQL queries to avoid injection issues and improve readability.
GraphQL APIs typically return HTTP 200 even when errors occur — always validate the errors field in the response body alongside the status code.