Integration tests with test server in GraphQL - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When running integration tests with a test server, we want to know how the time to complete tests changes as we add more test cases or data.
We ask: How does the test execution time grow when the test inputs get bigger?
Analyze the time complexity of the following GraphQL integration test snippet.
query GetUsers {
users {
id
name
posts {
id
title
}
}
}
This query fetches all users and their posts from the test server during integration testing.
Look for repeated actions in the query execution.
- Primary operation: Fetching each user and then fetching each post for that user.
- How many times: For each user (n users), the server fetches their posts (m posts per user).
As the number of users and posts grows, the total work grows too.
| Input Size (users n, posts m) | Approx. Operations |
|---|---|
| 10 users, 5 posts each | 10 + (10 * 5) = 60 |
| 100 users, 5 posts each | 100 + (100 * 5) = 600 |
| 1000 users, 5 posts each | 1000 + (1000 * 5) = 6000 |
Pattern observation: The operations grow roughly in proportion to the number of users times their posts.
Time Complexity: O(n * m)
This means the time grows with the number of users multiplied by the number of posts per user.
[X] Wrong: "The query time grows only with the number of users, not posts."
[OK] Correct: Each user's posts are also fetched, so posts add extra work that grows with their count.
Understanding how test queries scale helps you write efficient tests and spot slow points in real systems.
What if the query only fetched users without their posts? How would the time complexity change?
Practice
Solution
Step 1: Understand the role of a test server
A test server is a safe environment that mimics the real server but does not affect actual data.Step 2: Identify the purpose in integration tests
Integration tests use the test server to check if queries and mutations work together correctly without risk.Final Answer:
To run queries and mutations safely without affecting real data -> Option BQuick Check:
Test server = safe testing environment [OK]
- Thinking test server speeds up production
- Confusing test server with permanent database replacement
- Assuming test server auto-generates data
Solution
Step 1: Recall Apollo Server setup
Apollo Server requires creating an instance with typeDefs and resolvers, then calling start() before listen().Step 2: Identify correct method to start server
The correct method to start the server is await server.start(); before running listen().Final Answer:
const server = new ApolloServer({ typeDefs, resolvers }); await server.start(); -> Option DQuick Check:
Use server.start() before listen() [OK]
- Calling listen() without starting server
- Using incorrect constructor syntax
- Assuming server.run() or startServer() exist
const result = await server.executeOperation({ query: `query { user(id: 1) { name } }` }); console.log(result.data.user.name);What will be printed if the user with id 1 has the name "Alice"?Solution
Step 1: Understand executeOperation result
executeOperation returns an object with data containing the query result if successful.Step 2: Check the query and expected data
The query requests user with id 1 and its name. If user exists with name "Alice", result.data.user.name will be "Alice".Final Answer:
"Alice" -> Option CQuick Check:
Query result matches user name "Alice" [OK]
- Expecting undefined if user exists
- Confusing null with undefined
- Assuming error thrown instead of null result
const result = await server.executeOperation({ query: `mutation { addUser(name: "Bob") { id } }` });What is the most likely cause?Solution
Step 1: Check mutation usage in test
executeOperation supports mutations, so that is not the issue.Step 2: Verify mutation name and schema
If mutation name addUser is not defined in the schema, the server throws an error.Final Answer:
The mutation name is incorrect or not defined in schema -> Option AQuick Check:
Mutation must exist in schema to run [OK]
- Thinking executeOperation can't run mutations
- Forgetting to await executeOperation
- Confusing query and mutation types
Solution
Step 1: Understand integration test flow
Integration tests verify that mutations affect data and queries reflect those changes.Step 2: Correct test sequence
First run mutation to add user, then query to fetch user, then compare results to confirm correctness.Final Answer:
Run mutation with executeOperation, then run query with executeOperation, check query result matches mutation data -> Option AQuick Check:
Mutation then query to verify changes [OK]
- Running query before mutation
- Running mutation and query in parallel without order
- Skipping query test after mutation
