tests/testthat/test-zz-star_wars.R

# load_all(); testthat::test_file(file.path("tests", "testthat", "test-zz-star_wars.R")); # nolint



expect_sw_err <- function(...) {
  expect_err(..., schema = star_wars_schema) # nolint
}
expect_sw_r6 <- function(...) {
  expect_r6(..., schema = star_wars_schema) # nolint
}
expect_sw_request <- function(...) {
  expect_request(..., schema = star_wars_schema) # nolint
}
expect_sw_request_err <- function(...) {
  expect_request_err(..., schema = star_wars_schema) # nolint
}





test_that("star wars test suite", {

  "
  query HeroNameQuery {
    hero {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "hero": {
          "name": "R2-D2"
        }
      }}'
    )


  "
  {
    hero {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "hero": {
          "name": "R2-D2"
        }
      }}'
    )


  "
  query HeroNameAndFriendsQuery {
    hero {
      id
      name
      friends {
        id
        name
      }
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "hero": {
          "id": "2001",
          "name": "R2-D2",
          "friends": [
            {
              "id": "1000",
              "name": "Luke Skywalker"
            },
            {
              "id": "1002",
              "name": "Han Solo"
            },
            {
              "id": "1003",
              "name": "Leia Organa"
            }
          ]
        }
      }}'
    )


  "
  query NestedQuery {
    hero {
      name
      friends {
        name
        appearsIn
        friends {
          name
        }
      }
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "hero": {
          "name": "R2-D2",
          "friends": [
            {
              "name": "Luke Skywalker",
              "appearsIn": [ "NEWHOPE", "EMPIRE", "JEDI" ],
              "friends": [
                { "name": "Han Solo" },
                { "name": "Leia Organa" },
                { "name": "C-3PO" },
                { "name": "R2-D2" }
              ]
            },
            {
              "name": "Han Solo",
              "appearsIn": [ "NEWHOPE", "EMPIRE", "JEDI" ],
              "friends": [
                { "name": "Luke Skywalker" },
                { "name": "Leia Organa" },
                { "name": "R2-D2" }
              ]
            },
            {
              "name": "Leia Organa",
              "appearsIn": [ "NEWHOPE", "EMPIRE", "JEDI" ],
              "friends": [
                { "name": "Luke Skywalker" },
                { "name": "Han Solo" },
                { "name": "C-3PO" },
                { "name": "R2-D2" }
              ]
            }
          ]
        }
      }}'
    )


  "
  query FetchLukeQuery {
    human(id: \"1000\") {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "human": {
          "name": "Luke Skywalker"
        }
      }}'
    )

  "
  query FetchSomeIDQuery($someId: String!) {
    human(id: $someId) {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "human": {
          "name": "Luke Skywalker"
        }
      }}',
      variables = list(
        someId = "1000"
      )
    )


  "
  query FetchLukeAliased {
    luke: human(id: \"1000\") {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "luke": {
          "name": "Luke Skywalker"
        }
      }}'
    )


  "
  query FetchLukeAndLeiaAliased {
    luke: human(id: \"1000\") {
      name
    }
    leia: human(id: \"1003\") {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "luke": {
          "name": "Luke Skywalker"
        },
        "leia": {
          "name": "Leia Organa"
        }
      }}'
    )


  "
  query UseFragment {
    luke: human(id: \"1000\") {
      ...HumanFragment
    }
    leia: human(id: \"1003\") {
      ...HumanFragment
    }
    humanoid(id: \"1000\") {
      ...HumanAndDroid
    }
  }
  fragment HumanAndDroid on HumanOrDroid {
    __typename
    ...HumanFragment
    ...DroidFragment
  }
  fragment HumanFragment on Human {
    name
    homePlanet
  }
  fragment DroidFragment on Droid {
    name
    primaryFunction
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "luke": {
          "name": "Luke Skywalker",
          "homePlanet": "Tatooine"
        },
        "leia": {
          "name": "Leia Organa",
          "homePlanet": "Alderaan"
        },
        "humanoid": {
          "__typename": "Human",
          "name": "Luke Skywalker",
          "homePlanet": "Tatooine"
        }
      }}'
    )


  "
  query CheckTypeOfR2 {
    hero {
      __typename
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "hero": {
          "__typename": "Droid",
          "name": "R2-D2"
        }
      }}'
    )


  "
  query CheckTypeOfLuke {
    hero(episode: EMPIRE) {
      __typename
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "hero": {
          "__typename": "Human",
          "name": "Luke Skywalker"
        }
      }}'
    )


  "
  query NestedQueryWithFragment {
    hero {
      ...NameAndAppearances
      friends {
        ...NameAndAppearances
        friends {
          ...NameAndAppearances
        }
      }
    }
  }
  fragment NameAndAppearances on Character {
    name
    appearsIn
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "hero":
          {"name": "R2-D2","appearsIn": ["NEWHOPE","EMPIRE","JEDI"],"friends":[
            {"name":"Luke Skywalker","appearsIn":["NEWHOPE","EMPIRE","JEDI"],"friends":[
              {"name":"Han Solo","appearsIn":["NEWHOPE","EMPIRE","JEDI"]},
              {"name":"Leia Organa","appearsIn":["NEWHOPE","EMPIRE","JEDI"]},
              {"name":"C-3PO","appearsIn":["NEWHOPE","EMPIRE","JEDI"]},
              {"name":"R2-D2","appearsIn":["NEWHOPE","EMPIRE","JEDI"]}
            ]},
            {"name":"Han Solo","appearsIn":["NEWHOPE","EMPIRE","JEDI"],"friends":[
              {"name":"Luke Skywalker","appearsIn":["NEWHOPE","EMPIRE","JEDI"]},
              {"name":"Leia Organa","appearsIn":["NEWHOPE","EMPIRE","JEDI"]},
              {"name":"R2-D2","appearsIn":["NEWHOPE","EMPIRE","JEDI"]}
            ]},
            {"name":"Leia Organa","appearsIn":["NEWHOPE","EMPIRE","JEDI"],"friends":[
              {"name":"Luke Skywalker","appearsIn":["NEWHOPE","EMPIRE","JEDI"]},
              {"name":"Han Solo","appearsIn":["NEWHOPE","EMPIRE","JEDI"]},
              {"name":"C-3PO","appearsIn":["NEWHOPE","EMPIRE","JEDI"]},
              {"name":"R2-D2","appearsIn":["NEWHOPE","EMPIRE","JEDI"]}
            ]}
          ]}
        }
      }'
    )

  "
  query humanQuery($id: String!) {
    human(id: $id) {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "human": null
      }}',
      variables = list(id = "not valid id")
    )

  "
  query UseFragment {
    luke: human(id: \"1000\") {
      ...HumanFragment
    }
    leia: human(id: \"1003\") {
      ...HumanFragment
    }
  }
  fragment HumanFragment on Human {
    name
    homePlanet
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "luke": {
          "name": "Luke Skywalker",
          "homePlanet": "Tatooine"
        },
        "leia": {
          "name": "Leia Organa",
          "homePlanet": "Alderaan"
        }
      }}'
    )

})


test_that("validation", {


  "
  # INVALID: favoriteSpaceship does not exist on Character
  query HeroSpaceshipQuery {
    hero {
      favoriteSpaceship
    }
  }
  " %>%
    expect_sw_err("missing field: 'favoriteSpaceship' for object: 'Character'")

  "
  # INVALID: hero is not a scalar, so fields are needed
  query HeroNoFieldsQuery {
    hero
  }
  " %>%
    expect_sw_err("Missing children fields for field: 'hero'")

  "
  # INVALID: name is a scalar, so fields are not permitted
  query HeroFieldsOnScalarQuery {
    hero {
      name {
        firstCharacterOfName
      }
    }
  }
  " %>%
    expect_sw_err("Not allowed to query deeper into leaf field selections")

  "
  # INVALID: primaryFunction does not exist on Character
  query DroidFieldOnCharacter {
    hero {
      name
      primaryFunction
    }
  }
  " %>%
    expect_sw_err("missing field: 'primaryFunction' for object: 'Character'")

  "
  query DroidFieldInFragment {
    hero {
      name
      ...DroidFields
    }
  }
  fragment DroidFields on Droid {
    primaryFunction
  }
  " %>%
    expect_sw_r6()

  "
  query DroidFieldInInlineFragment {
    hero {
      name
      ... on Droid {
        primaryFunction
      }
    }
  }
  " %>%
    expect_sw_r6()
})




test_that("introspection", {

  "
  query IntrospectionTypeQuery {
    __schema {
      types {
        name
      }
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "__schema": {
          "types": [
            {"name": "Int"},
            {"name": "Float"},
            {"name": "String"},
            {"name": "Boolean"},
            {"name": "__Schema"},
            {"name": "__Type"},
            {"name": "__Field"},
            {"name": "__InputValue"},
            {"name": "__EnumValue"},
            {"name": "__Directive"},
            {"name": "Droid"},
            {"name": "Human"},
            {"name": "Query"},
            {"name": "Character"},
            {"name": "HumanOrDroid"},
            {"name": "__TypeKind"},
            {"name": "__DirectiveLocation"},
            {"name": "Episode"}
          ]
        }
      }}'
    )

  "
  query IntrospectionQueryTypeQuery {
    __schema {
      queryType {
        name
      }
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "__schema": {
          "queryType": {"name": "Query"}
        }
      }}'
    )

  "
  query IntrospectionDroidTypeQuery {
    __type(name: \"Droid\") {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "__type": {
          "name": "Droid"
        }
      }}'
    )

  "
  query IntrospectionDroidKindQuery {
    __type(name: \"Droid\") {
      name
      kind
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "__type": {
          "name": "Droid",
          "kind": "OBJECT"
        }
      }}'
    )

  "
  query IntrospectionCharacterKindQuery {
    __type(name: \"Character\") {
      name
      kind
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "__type": {
          "name": "Character",
          "kind": "INTERFACE"
        }
      }}'
    )

  "
  query IntrospectionDroidFieldsQuery {
    __type(name: \"Droid\") {
      name
      fields {
        name
        type {
          name
          kind
        }
      }
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "__type": {
          "name": "Droid",
          "fields": [
            {"name": "id","type": {"name": null,"kind": "NON_NULL"}},
            {"name": "name","type": {"name": "String","kind": "SCALAR"}},
            {"name": "friends","type": {"name": null,"kind": "LIST"}},
            {"name": "appearsIn","type": {"name": null,"kind": "LIST"}},
            {"name": "primaryFunction","type": {"name": "String","kind": "SCALAR"}}
          ]
        }
      }}'
    )

  "
  query IntrospectionDroidWrappedFieldsQuery {
    __type(name: \"Droid\") {
      name
      fields {
        name
        type {
          name
          kind
          ofType {
            name
            kind
          }
        }
      }
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "__type": {
          "name": "Droid",
          "fields": [
      {
        "name": "id",
        "type": {"name": null,"kind": "NON_NULL","ofType": {"name": "String","kind": "SCALAR"}}
      },
      {
        "name": "name",
        "type": {"name": "String","kind": "SCALAR","ofType": null}
      },
      {
        "name": "friends",
        "type": {"name": null,"kind": "LIST","ofType": {"name": "Character","kind": "INTERFACE"}}
      },
      {
        "name": "appearsIn",
        "type": {"name": null,"kind": "LIST","ofType": {"name": "Episode","kind": "ENUM"}}
      },
      {
        "name": "primaryFunction",
        "type": {"name": "String","kind": "SCALAR","ofType": null}
      }
          ]
        }
      }}'
    )

  "
  query IntrospectionDroidDescriptionQuery {
    __type(name: \"Droid\") {
      name
      description
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "__type": {
          "name": "Droid",
          "description": "A mechanical creature in the Star Wars universe."
        }
      }}'
    )


})



test_that("operations", {

  "
  query IntrospectionDroidDescriptionQuery {
    __type(name: \"Droid\") {
      name
      description
    }
  }
  " %>%
    expect_sw_request_err(
      operation_name = "Barret",
      '{
        "data": null,
        "errors": [
          {
    "message": "6.1: Executing Requests\\nOperation: Barret can\'t be found in the document object"
          }
        ]
      }'
    )

  "
  query Name1 {
    __type(name: \"Droid\") {
      name
    }
  }
  query Name2 {
    __type(name: \"Droid\") {
      name
    }
  }
  " %>%
    expect_sw_request_err(
      operation_name = NULL,
      # nolint start
      '{
        "data": null,
        "errors": [
          {
            "message": "6.1: Executing Requests\\nIf operation name is null, the document may only contain one operation"
          }
        ]
      }'
      # nolint end
    )

})


test_that("directives", {

  "
  query FetchLukeAndLeiaAliased {
    luke: human(id: \"1000\") @skip(if: false)  {
      name
    }
    leia: human(id: \"1003\") @skip(if: true) {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "luke": {
          "name": "Luke Skywalker"
        }
      }}'
    )

  "
  {
    luke: human(id: \"1000\") @include(if: true) {
      name
    }
    leia: human(id: \"1003\") @include(if: false) {
      name
    }
  }
  " %>%
    expect_sw_request(
      '{ "data": {
        "luke": {
          "name": "Luke Skywalker"
        }
      }}'
    )

  "
  {
    artoo: hero @notskip {
      name
    }
  }
  " %>%
    expect_sw_request_err(
      # nolint start
      '{
        "data": {
          "artoo": {
            "name": "R2-D2"
          }
        },
        "errors": [
          {
            "message": "6.3.2: Field Collection\\nNon skip or include directive found. Extra directives are not allowed.\\nLocation: 3:17 to 3:25\\nError String: \'@notskip\'"
          }
        ]
      }'
      # nolint end
    )

})



test_that("variables", {

  "
  query Variable($someId: String!) {
    __type(name: $someId) {
      name
    }
  }
  " %>%
    expect_sw_request_err(
      variables = list(someId = NULL),
      # nolint start
      '{
        "data": null,
        "errors": [
          {
            "message": "6.1.2: Coercing Variable Values\\nNon nullible type variable did not have value or default value\\nLocation: 2:18 to 2:34\\nError String: \'$someId: String!\'"
          }
        ]
      }'
      # nolint end
    )

  "
  query Variable($someInt: Int!) {
    by_id(id: $someInt) {
      name
    }
  }
  " %>%
    expect_sw_request_err(
      variables = list(someInt = "Barret"),
      # nolint start
      '{
        "data": null,
        "errors": [
          {
            "message": "6.1.2: Coercing Variable Values\\nValue cannot be coerced according to the input coercion rules\\nLocation: 2:18 to 2:32\\nError String: \'$someInt: Int!\'"
          }
        ]
      }'
      # nolint end
    )

  "
  query Name1 {
    __type(name: \"Droid\") {
      name
    }
  }
  query Name2 {
    __type(name: \"Droid\") {
      name
    }
  }
  " %>%
    expect_sw_request_err(
      operation_name = NULL,
      # nolint start
      '{
        "data": null,
        "errors": [
          {
            "message": "6.1: Executing Requests\\nIf operation name is null, the document may only contain one operation"
          }
        ]
      }'
      # nolint end
    )

  "
  {
    hero {
      __typename
    }
  }
  " %>%
    expect_sw_request(
      operation_name = NULL,
      # nolint start
      '{
        "data": {
          "hero": {
            "__typename": "Droid"
          }
        }
      }'
      # nolint end
    )

})
schloerke/gqlr documentation built on Dec. 7, 2022, 10:54 a.m.