graphql-engine/server/tests-py/queries/graphql_query/functions/track_customised_names.yaml
Gil Mizrahi 42cd2e69c0 Add support for customising function root field names
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/2468
Co-authored-by: Philip Lykke Carlsen <358550+plcplc@users.noreply.github.com>
GitOrigin-RevId: 5ff85bb02e4e651376a40914b7ae0aabc8524a05
2021-10-07 13:03:22 +00:00

350 lines
9.0 KiB
YAML

# # Overview
# In this file, we are testing that:
#
# * We can supply custom names to `pg_track_function` and have them applied in the schema
# * Name aliases are applied correctly for all the possible specified cases, see https://github.com/hasura/graphql-engine-mono/pull/2419
# * We can omit custom names from `pg_track_function`
# * We can set and unset custom names with `set_function_customization`
# * We test that we don't introduce name clashes
- description: Define the SQL function the tests will be using
url: /v2/query
status: 200
query:
type: run_sql
args:
sql: |
create function unaliased_function(t test)
returns setof post as $$
select *
from post
where
title ilike ('%' || t.name || '%')
$$ language sql stable;
# Test: We can supply (all) aliases via `pg_track_function`, and the names are applied.
- description: Test that we supply all custom names to `pg_track_function`.
url: /v1/metadata
status: 200
response:
message: success
query:
type: pg_track_function
args:
function: unaliased_function
configuration:
custom_root_fields:
function: nameBase
function_aggregate: nameAggregate
- description: Execute the function without the alias, which should fail
url: /v1/graphql
status: 200
query:
query: |
query {
unaliased_function (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
title
content
}
}
response:
"errors": [
{
"message": "field \"unaliased_function\" not found in type: 'query_root'",
"extensions": {
"code": "validation-failed",
"path": "$.selectionSet.unaliased_function"
}
}
]
- description: Execute the function by its alias, which should succeed
url: /v1/graphql
status: 200
query:
query: |
query {
nameBase (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
title
content
}
}
response:
data:
nameBase:
- title: post by hasura
content: content for post
- description: Execute the function with aggregation by its aggregation-alias, which should succeed
url: /v1/graphql
status: 200
query:
query: |
query {
nameAggregate (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
aggregate {
count
}
}
}
response:
data:
nameAggregate:
aggregate:
count: 1
- description: Teardown the test of fully given aliases
url: /v1/metadata
status: 200
response:
message: success
query:
type: pg_untrack_function
args:
name: unaliased_function
# Test: We can supply just the base alias via `pg_track_function`, and the names are applied.
- description: Test that we supply all custom names to `pg_track_function`.
url: /v1/metadata
status: 200
response:
message: success
query:
type: pg_track_function
args:
function: unaliased_function
configuration:
custom_name: aliased
- description: Execute the function without the alias, which should fail
url: /v1/graphql
status: 200
query:
query: |
query {
unaliased_function (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
title
content
}
}
response:
"errors": [
{
"message": "field \"unaliased_function\" not found in type: 'query_root'",
"extensions": {
"code": "validation-failed",
"path": "$.selectionSet.unaliased_function"
}
}
]
- description: Execute the function by its alias, which should succeed
url: /v1/graphql
status: 200
query:
query: |
query {
aliased (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
title
content
}
}
response:
data:
aliased:
- title: post by hasura
content: content for post
- description: Execute the function with aggregation by its aggregation-alias, which should succeed
url: /v1/graphql
status: 200
query:
query: |
query {
aliased_aggregate (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
aggregate {
count
}
}
}
response:
data:
aliased_aggregate:
aggregate:
count: 1
# Test: Using set_function_customization
- description: Test that we fail on non-existing functions
url: /v1/metadata
status: 400
response:
code: not-exists
error: 'function "non_existing_function" does not exist in source: default'
path: $.args
query:
type: pg_set_function_customization
args:
function: non_existing_function
configuration: { }
- description: Test that we fail on duplicate custom root fields
url: /v1/metadata
status: 400
response:
code: parse-failed
error: "Error when parsing command set_function_customization.\n\
See our documentation at https://hasura.io/docs/latest/graphql/core/api-reference/metadata-api/index.html#metadata-apis.\n\
Internal error message: the following custom root field names are duplicated: \"duplicate_name\" and \"duplicate_name\""
path: $.args.configuration.custom_root_fields
query:
type: pg_set_function_customization
args:
function: unaliased_function
configuration:
custom_root_fields:
function: duplicate_name
function_aggregate: duplicate_name
- description: Test that we can clear the customized names
url: /v1/metadata
status: 200
response:
message: success
query:
type: pg_set_function_customization
args:
function: unaliased_function
configuration: { }
- descripion: Execute the function without the alias, which should now work
url: /v1/graphql
status: 200
query:
query: |
query {
unaliased_function (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
title
content
}
}
response:
data:
unaliased_function:
- title: post by hasura
content: content for post
- description: Test that we can set customized names using `set_function_customization`
url: /v1/metadata
status: 200
response:
message: success
query:
type: pg_set_function_customization
args:
function: unaliased_function
configuration:
custom_root_fields:
function: nameBaseOther
- description: Execute the function by its alias
url: /v1/graphql
status: 200
query:
query: |
query {
nameBaseOther (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
title
content
}
}
response:
data:
nameBaseOther:
- title: post by hasura
content: content for post
- description: Execute the function with aggregation (unaliased), which should succeed.
url: /v1/graphql
status: 200
query:
query: |
query {
unaliased_function_aggregate (args: {t: "(1, hasura,311cf381-71e7-449b-bac5-86cd6deafd5b)"}) {
aggregate {
count
}
}
}
response:
data:
unaliased_function_aggregate:
aggregate:
count: 1
# Test: We reject name clashes: A function is aliased to an existing (unaliased) function.
# Note: We are not going to go to great lengths to ensure all the different
# conceivable ways collisions could be introduced are avoided, because there is
# a general mechanism in the code that builds the schema cache which ensures no
# collisions appear in the final, generated schema.
# (issue https://github.com/hasura/graphql-engine-mono/issues/1868 has a bit
# more info on this subject)
- description: "Setup: Define a separate function to cause clashes"
url: /v2/query
status: 200
query:
type: run_sql
args:
sql: |
create function unaliased_function2(t test)
returns setof post as $$
select *
from post
where
title ilike ('%' || t.name || '%')
$$ language sql stable;
- description: "Setup: Track the new function"
url: /v1/metadata
status: 200
response:
message: success
query:
type: pg_track_function
args:
function: unaliased_function2
- description: "Setup: clear up aliases of unaliased_function"
url: /v1/metadata
status: 200
response:
message: success
query:
type: pg_set_function_customization
args:
function: unaliased_function
configuration: {}
- description: Test that we cannot alias `unaliased_function2` to `unaliased_function`
url: /v1/metadata
status: 500
response:
code: unexpected
error: 'found duplicate fields in selection set: unaliased_function_aggregate, unaliased_function'
path: $.args
query:
type: pg_set_function_customization
args:
function: unaliased_function2
configuration:
custom_name: unaliased_function