4

I know my question title might not be the most informative, so please let me know if I can improve it somehow :).

I'm trying to figure out how to pass GraphQL variables in a PHP unit test without writing them inline in the query.

Here is a demo code. I cannot give the exact real source code as it belongs to a customer project. I hope that this simplified version will be able to show the problem.

class MyGraphQLTest extends Illuminate\Foundation\Testing\TestCase
{
    use Tests\CreatesApplication;
    use \Nuwave\Lighthouse\Testing\MakesGraphQLRequests;

    public function testSomething()
    {
        // Query an article with a specific id defined in this variable
        $this->graphQL(/** @lang GraphQL */ '
                {
                    article(id: $test_id) {
                        id,
                        name
                    }
                }',
            [
                'test_id' => 5, // Does not work, the variable is not passed for some strange reason.
            ]
        )->assertJson([
            'data' => [
                'article' => [ // We should receive an article with id 5 and title 'Test Article'
                    'id' => 5,
                    'name' => 'Test Article',
                ]
            ]
        ]);
    }
}

According to this Lighthouse: Testing with PHPUnit guide, variables should be able to be passed as an array as a second argument to the ->graphQL() method.

When I run the test with php vendor/bin/phpunit, I get the following error response:

[{
    "errors": [
        {
            "message": "Variable \"$test_id\" is not defined.",
            "extensions": {
                "category": "graphql"
            },
            "locations": *removed as not needed in this question*
        }
    ]
}].

Lighthouse is the newest version: 4.15.0

Thank you for your support! :)

1 Answers1

2

There is something you forgot in your GraphQL query. You must have an query wrapper that will receive parameters and then pass to your query with variables defined. Like this:

query Articles($test_id: Int! /* or ID! if you prefer */){
    {
        article(id: $test_id) {
            id,
            name
        }
    }
}

If you are using multiple parameters, consider creating an Input in your GraphQL Server and then in your query you can simply refer to your Input.

// Consider following Input in your server
input ArticleSearch {
    article_category: String!
    article_rate: Int!
}

// you can then
query Articles($input: ArticleSearch){
    {
        article(input: $input) {
            id,
            name
        }
    }
}

Kluivert
  • 91
  • 3
  • 1
    Thanks, I got it working! :) I can't really remember, but I think that I tried to use a query wrapper also before, but maybe I just missed something back then when trying it. But really good that it works now :). – Jarkko Linnanvirta Aug 16 '20 at 13:49