mirror of
https://github.com/open-policy-agent/opa.git
synced 2026-08-28 11:15:32 -06:00
63e1877c48
This commit adds a config for yamllint, mass-reformats all of the existing Yaml testcases to pass linting, and adds a Yaml linting job to the pull-request Github Actions workflow. A few careful exceptions and ignores were added to the linter's config to allow keeping our existing Yaml files with minimal reformatting. Signed-off-by: Philip Conrad <philipaconrad@gmail.com>
180 lines
5.3 KiB
YAML
180 lines
5.3 KiB
YAML
---
|
|
# This suite of tests is adapted from the underlying GraphQL parser library's
|
|
# own test suite, as it provides a fairly comprehensive set of good/degenerate
|
|
# test cases, which we want to make sure to react correctly to.
|
|
# See: https://github.com/vektah/gqlparser/blob/master/validator/validator_test.yml
|
|
cases:
|
|
- data:
|
|
modules:
|
|
- |
|
|
package test
|
|
schema := `
|
|
extend type User {
|
|
id: ID!
|
|
}
|
|
extend type Product {
|
|
upc: String!
|
|
}
|
|
union _Entity = Product | User
|
|
extend type Query {
|
|
entity: _Entity
|
|
}
|
|
`
|
|
query := `
|
|
{
|
|
entity {
|
|
... on User {
|
|
id
|
|
}
|
|
}
|
|
}
|
|
`
|
|
q_ast := {"Operations": [{"Name": "", "Operation": "query", "SelectionSet": [{"Alias": "entity", "Name": "entity", "SelectionSet": [{"SelectionSet": [{"Alias": "id", "Name": "id"}], "TypeCondition": "User"}]}]}]}
|
|
p {
|
|
[q_ast, _] = graphql.parse(query, schema)
|
|
}
|
|
note: graphql_parse/success extending non-existent types
|
|
query: data.test.p = x
|
|
want_result:
|
|
- x: true
|
|
- data:
|
|
modules:
|
|
- |
|
|
package test
|
|
schema := `
|
|
extend type Query {
|
|
myAction(myEnum: Locale!): SomeResult!
|
|
}
|
|
type SomeResult {
|
|
id: String
|
|
}
|
|
enum Locale {
|
|
EN
|
|
LT
|
|
DE
|
|
}
|
|
`
|
|
query := `
|
|
query SomeOperation {
|
|
# Note: Not providing mandatory parameter: (myEnum: Locale!)
|
|
myAction {
|
|
id
|
|
}
|
|
}
|
|
`
|
|
p {
|
|
graphql.parse(query, schema)
|
|
}
|
|
note: graphql_parse/failure validation rules are independent case 1
|
|
query: data.test.p = x
|
|
want_error: 'graphql.parse: Field "myAction" argument "myEnum" of type "Locale!" is required, but it was not provided in GraphQL query string at location 4:5'
|
|
want_error_code: eval_builtin_error
|
|
strict_error: true
|
|
- data:
|
|
modules:
|
|
- |
|
|
package test
|
|
schema := `
|
|
extend type Query {
|
|
myAction(myEnum: Locale!): SomeResult!
|
|
}
|
|
type SomeResult {
|
|
id: String
|
|
}
|
|
enum Locale {
|
|
EN
|
|
LT
|
|
DE
|
|
}
|
|
`
|
|
query := `
|
|
# Note: there is default enum value in variables
|
|
query SomeOperation ($locale: Locale! = DE) {
|
|
myAction(myEnum: $locale) {
|
|
id
|
|
}
|
|
}
|
|
`
|
|
q_ast := {"Operations": [{"Name": "SomeOperation", "Operation": "query", "SelectionSet": [{"Alias": "myAction", "Arguments": [{"Name": "myEnum", "Value": {"Kind": 0, "Raw": "locale"}}], "Name": "myAction", "SelectionSet": [{"Alias": "id", "Name": "id"}]}], "VariableDefinitions": [{"DefaultValue": {"Kind": 7, "Raw": "DE"}, "Type": {"NamedType": "Locale", "NonNull": true}, "Used": false, "Variable": "locale"}]}]}
|
|
p {
|
|
[q_ast, _] = graphql.parse(query, schema)
|
|
}
|
|
note: graphql_parse/success validation rules are independent case 2
|
|
query: data.test.p = x
|
|
want_result:
|
|
- x: true
|
|
- data:
|
|
modules:
|
|
- |
|
|
package test
|
|
schema := `
|
|
type DeprecatedType {
|
|
deprecatedField: String @deprecated
|
|
newField(deprecatedArg: Int): Boolean
|
|
}
|
|
enum DeprecatedEnum {
|
|
ALPHA @deprecated
|
|
}
|
|
`
|
|
query := ``
|
|
p {
|
|
[{}, _] = graphql.parse(query, schema)
|
|
}
|
|
note: graphql_parse/success deprecating types
|
|
query: data.test.p = x
|
|
want_result:
|
|
- x: true
|
|
- data:
|
|
modules:
|
|
- |
|
|
package test
|
|
schema := `
|
|
type Query {
|
|
bar: String!
|
|
}
|
|
`
|
|
query := `
|
|
query Foo($flag: Boolean!) {
|
|
...Bar
|
|
}
|
|
fragment Bar on Query {
|
|
bar @include(if: $flag)
|
|
}
|
|
`
|
|
q_ast := {"Fragments": [{"Name": "Bar", "SelectionSet": [{"Alias": "bar", "Directives": [{"Arguments": [{"Name": "if", "Value": {"Kind": 0, "Raw": "flag"}}], "Location": "", "Name": "include"}], "Name": "bar"}], "TypeCondition": "Query"}], "Operations": [{"Name": "Foo", "Operation": "query", "SelectionSet": [{"Name": "Bar"}], "VariableDefinitions": [{"Type": {"NamedType": "Boolean", "NonNull": true}, "Used": false, "Variable": "flag"}]}]}
|
|
p {
|
|
[q_ast, _] = graphql.parse(query, schema)
|
|
}
|
|
note: graphql_parse/success no unused variables
|
|
query: data.test.p = x
|
|
want_result:
|
|
- x: true
|
|
- data:
|
|
modules:
|
|
- |
|
|
package test
|
|
schema_ast := graphql.parse_schema(`
|
|
type Employee {
|
|
id: String!
|
|
salary: Int!
|
|
}
|
|
|
|
schema {
|
|
query: Query
|
|
}
|
|
|
|
type Query {
|
|
employeeByID(id: String): Employee
|
|
}
|
|
`)
|
|
query_ast := graphql.parse_query(`
|
|
query { employeeByID(id: "alice") { salary }}
|
|
`)
|
|
p {
|
|
[query_ast, schema_ast] = graphql.parse(query_ast, schema_ast)
|
|
}
|
|
note: graphql_parse/success - AST objects - Employee example
|
|
query: data.test.p = x
|
|
want_result:
|
|
- x: true
|