GraphQL schema mocking utilities with stateful stores and realistic test data generation
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Quick mock server creation utilities for testing and development. Provides a simple interface for executing GraphQL queries against mocked schemas without complex server setup.
Creates a mock GraphQL server that can execute queries against mocked schemas.
/**
* Create a mock GraphQL server for testing and development
* @param schema - GraphQL schema or type definitions
* @param mocks - Mock functions for types and fields
* @param preserveResolvers - Whether to preserve existing resolvers
* @returns Mock server instance with query method
*/
function mockServer<TResolvers>(
schema: TypeSource,
mocks: IMocks<TResolvers>,
preserveResolvers?: boolean
): IMockServer;Usage Examples:
import { mockServer } from "@graphql-tools/mock";
// Create mock server with type definitions
const server = mockServer(
`
type User {
id: ID!
name: String!
email: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
content: String!
author: User!
}
type Query {
user(id: ID!): User
users: [User!]!
post(id: ID!): Post
posts: [Post!]!
}
`,
{
User: () => ({
id: () => `user_${Math.random().toString(36).substr(2, 9)}`,
name: () => ['Alice', 'Bob', 'Charlie', 'Diana'][Math.floor(Math.random() * 4)],
email: (root) => `${root.name?.toLowerCase()}@example.com`,
posts: () => new MockList([1, 5])
}),
Post: () => ({
id: () => `post_${Math.random().toString(36).substr(2, 9)}`,
title: () => [
'Getting Started with GraphQL',
'Advanced Query Techniques',
'Schema Design Best Practices'
][Math.floor(Math.random() * 3)],
content: () => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit...'
})
}
);
// Execute queries against the mock server
async function runQueries() {
// Simple user query
const userResult = await server.query(`
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
posts {
id
title
}
}
}
`, { id: "1" });
console.log('User result:', userResult.data);
// List all users
const usersResult = await server.query(`
query GetAllUsers {
users {
id
name
email
}
}
`);
console.log('Users result:', usersResult.data);
}
runQueries();Interface defining the contract for mock server implementations.
/**
* Interface for mock server instances
*/
interface IMockServer {
/**
* Execute a GraphQL query against the mocked schema
* @param query - GraphQL query string
* @param vars - Optional variables for the query
* @returns Promise resolving to execution result
*/
query: (query: string, vars?: Record<string, any>) => Promise<ExecutionResult>;
}Type definition for schema input accepted by mockServer.
/**
* Input types accepted for schema definition
*/
type TypeSource = string | DocumentNode | GraphQLSchema;import { mockServer, MockList } from "@graphql-tools/mock";
describe('GraphQL API Tests', () => {
let server: IMockServer;
beforeAll(() => {
server = mockServer(
typeDefs,
{
User: () => ({
id: () => 'test-user-id',
name: () => 'Test User',
email: () => 'test@example.com'
}),
Post: () => ({
id: () => 'test-post-id',
title: () => 'Test Post'
})
}
);
});
test('should return user data', async () => {
const result = await server.query(`
query {
user(id: "1") {
id
name
email
}
}
`);
expect(result.data?.user).toMatchObject({
id: 'test-user-id',
name: 'Test User',
email: 'test@example.com'
});
});
});import { mockServer } from "@graphql-tools/mock";
import { createServer } from 'http';
import { execute, parse, validate } from 'graphql';
// Create mock server for development
const server = mockServer(schema, {
User: () => ({
name: () => 'Dev User',
email: () => 'dev@example.com'
})
});
// Simple HTTP server wrapper
const httpServer = createServer(async (req, res) => {
if (req.method === 'POST' && req.url === '/graphql') {
let body = '';
req.on('data', chunk => { body += chunk; });
req.on('end', async () => {
try {
const { query, variables } = JSON.parse(body);
const result = await server.query(query, variables);
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(result));
} catch (error) {
res.writeHead(400, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ errors: [{ message: error.message }] }));
}
});
} else {
res.writeHead(404);
res.end('Not Found');
}
});
httpServer.listen(4000, () => {
console.log('Mock GraphQL server running on http://localhost:4000/graphql');
});import { buildSchema } from "graphql";
import { mockServer } from "@graphql-tools/mock";
const schema = buildSchema(`
type User {
id: ID!
name: String!
email: String!
profile: UserProfile
}
type UserProfile {
bio: String
avatar: String
}
type Query {
currentUser: User
user(id: ID!): User
}
`);
// Mock server with preserved resolvers
const server = mockServer(
schema,
{
User: () => ({
name: () => 'Mock User',
email: () => 'mock@example.com'
}),
UserProfile: () => ({
bio: () => 'This is a mock bio',
avatar: () => 'https://example.com/avatar.jpg'
})
},
true // Preserve existing resolvers
);// Mock server with error scenarios
const server = mockServer(typeDefs, {
User: () => ({
name: () => {
// Simulate occasional errors
if (Math.random() < 0.1) {
throw new Error('Mock user service temporarily unavailable');
}
return 'Mock User';
}
})
});
// Handle errors in queries
const result = await server.query(`
query {
users {
id
name
}
}
`);
if (result.errors) {
console.error('Query errors:', result.errors);
} else {
console.log('Query data:', result.data);
}// Test parameterized queries
const result = await server.query(`
query GetUserPosts($userId: ID!, $limit: Int) {
user(id: $userId) {
id
name
posts(first: $limit) {
id
title
}
}
}
`, {
userId: "123",
limit: 5
});