7 releases

0.3.2 Jan 19, 2023
0.3.1 Nov 29, 2022
0.2.0 Nov 8, 2022
0.1.5 Nov 4, 2022
0.1.0 Feb 18, 2022

#60 in Testing

Download history 314/week @ 2022-11-29 341/week @ 2022-12-06 436/week @ 2022-12-13 137/week @ 2022-12-20 39/week @ 2022-12-27 139/week @ 2023-01-03 211/week @ 2023-01-10 312/week @ 2023-01-17 190/week @ 2023-01-24 215/week @ 2023-01-31 227/week @ 2023-02-07 202/week @ 2023-02-14 488/week @ 2023-02-21 282/week @ 2023-02-28 180/week @ 2023-03-07 208/week @ 2023-03-14

1,204 downloads per month


15K SLoC


A test case generator for GraphQL language.

Crates.io Download docs.rs docs


The goal of apollo-smith is to generate valid GraphQL documents by sampling from all available possibilities of GraphQL grammar.

We've written apollo-smith to use in fuzzing, but you may wish to use it for anything that requires GraphQL document generation.

apollo-smith is inspired by bytecodealliance's wasm-smith crate, and the article written by Nick Fitzgerald on writing test case generators in Rust.

This is still a work in progress, for outstanding issues, checkout out the apollo-smith label in our issue tracker.

Rust versions

apollo-smith is tested on the latest stable version of Rust. Older version may or may not be compatible.

Using apollo-smith with cargo fuzz

Define a new target with cargo fuzz,

$ cargo fuzz add my_apollo_smith_fuzz_target

and add apollo-smith to your Cargo.toml:

## fuzz/Cargo.toml

apollo-smith = "0.3.2"

It can then be used in a fuzz_target along with the arbitrary crate,

// fuzz/fuzz_targets/my_apollo_smith_fuzz_target.rs


use libfuzzer_sys::fuzz_target;
use arbitrary::Unstructured;
use apollo_smith::DocumentBuilder;

fuzz_target!(|input: &[u8]| {
    let mut u = Unstructured::new(input);
    let gql_doc = DocumentBuilder::new(&mut u)?;
    let document = gql_doc.finish();
    let document_str = String::from(document);


and fuzzed with the following command:

$ cargo +nightly fuzz run my_apollo_smith_fuzz_target

Using apollo-smith with apollo-parser

You can use apollo-parser to generate valid operations in apollo-smith. This can be done with the parser-impl feature flag.

## Cargo.toml

apollo-smith = { version = "0.3.1", features = ["parser-impl"] }
use std::fs;

use apollo_parser::Parser;
use apollo_smith::{Document, DocumentBuilder};

use libfuzzer_sys::arbitrary::{Result, Unstructured};

/// This generate an arbitrary valid GraphQL operation
pub fn generate_valid_operation(input: &[u8]) {

    let parser = Parser::new(&fs::read_to_string("supergraph.graphql").expect("cannot read file"));

    let tree = parser.parse();
    if !tree.errors().is_empty() {
        panic!("cannot parse the graphql file");

    let mut u = Unstructured::new(input);

    // Convert `apollo_parser::Document` into `apollo_smith::Document`.
    let apollo_smith_doc = Document::from(tree.document());

    // Create a `DocumentBuilder` given an existing document to match a schema.
    let mut gql_doc = DocumentBuilder::with_document(&mut u, apollo_smith_doc)?;
    let operation_def = gql_doc.operation_definition()?.unwrap();


Feature flags

Enable parser-impl feature in apollo-smith is used to convert apollo-parser types to apollo-smith types. This is useful when you require the test-case generator to generate documents based on a given schema.

## Cargo.toml

apollo-smith = { version = "0.3.1", features = ["parser-impl"] }


  • Recursive object type not yet supported (example : myType { inner: myType })


Licensed under either of

at your option.


~39K SLoC