Skip to content

Commit

Permalink
fix(GraphQL): incorrect generatedSchema in updateGQLSchema (#6349)
Browse files Browse the repository at this point in the history
This PR fixes the behaviour where Dgraph schema was being given as generatedSchema field in updateGQLSchema request. Now, the newly generated complete GraphQL schema is given as generatedSchema.
  • Loading branch information
abhimanyusinghgaur committed Sep 1, 2020
1 parent 092a884 commit 0b8681c
Show file tree
Hide file tree
Showing 3 changed files with 275 additions and 5 deletions.
8 changes: 3 additions & 5 deletions graphql/admin/schema.go
Expand Up @@ -59,10 +59,8 @@ func resolveUpdateGQLSchema(ctx context.Context, m schema.Mutation) (*resolve.Re
if _, err = schema.FromString(schHandler.GQLSchema()); err != nil {
return resolve.EmptyResult(m, err), false
}
newGQLSchema := input.Set.Schema
newDgraphSchema := schHandler.DGSchema()

resp, err := edgraph.UpdateGQLSchema(ctx, newGQLSchema, newDgraphSchema)
resp, err := edgraph.UpdateGQLSchema(ctx, input.Set.Schema, schHandler.DGSchema())
if err != nil {
return resolve.EmptyResult(m, err), false
}
Expand All @@ -72,8 +70,8 @@ func resolveUpdateGQLSchema(ctx context.Context, m schema.Mutation) (*resolve.Re
m.Name(): map[string]interface{}{
"gqlSchema": map[string]interface{}{
"id": query.UidToHex(resp.Uid),
"schema": newGQLSchema,
"generatedSchema": newDgraphSchema,
"schema": input.Set.Schema,
"generatedSchema": schHandler.GQLSchema(),
}}},
Field: m,
Err: nil,
Expand Down
232 changes: 232 additions & 0 deletions graphql/e2e/schema/generatedSchema.graphql
@@ -0,0 +1,232 @@
#######################
# Input Schema
#######################

type Author {
id: ID!
name: String!
}

#######################
# Extended Definitions
#######################

"""
The Int64 scalar type represents a signed 64‐bit numeric non‐fractional value.
Int64 can currently represent values in range [-(2^53)+1, (2^53)-1] without any error.
Values out of this range but representable by a signed 64-bit integer, may get coercion error.
"""
scalar Int64

scalar DateTime

enum DgraphIndex {
int
int64
float
bool
hash
exact
term
fulltext
trigram
regexp
year
month
day
hour
}

input AuthRule {
and: [AuthRule]
or: [AuthRule]
not: AuthRule
rule: String
}

enum HTTPMethod {
GET
POST
PUT
PATCH
DELETE
}

enum Mode {
BATCH
SINGLE
}

input CustomHTTP {
url: String!
method: HTTPMethod!
body: String
graphql: String
mode: Mode
forwardHeaders: [String!]
secretHeaders: [String!]
introspectionHeaders: [String!]
skipIntrospection: Boolean
}

directive @hasInverse(field: String!) on FIELD_DEFINITION
directive @search(by: [DgraphIndex!]) on FIELD_DEFINITION
directive @dgraph(type: String, pred: String) on OBJECT | INTERFACE | FIELD_DEFINITION
directive @id on FIELD_DEFINITION
directive @withSubscription on OBJECT | INTERFACE
directive @secret(field: String!, pred: String) on OBJECT | INTERFACE
directive @auth(
query: AuthRule,
add: AuthRule,
update: AuthRule,
delete:AuthRule) on OBJECT
directive @custom(http: CustomHTTP, dql: String) on FIELD_DEFINITION
directive @remote on OBJECT | INTERFACE
directive @cascade(fields: [String]) on FIELD

input IntFilter {
eq: Int
le: Int
lt: Int
ge: Int
gt: Int
}

input Int64Filter {
eq: Int64
le: Int64
lt: Int64
ge: Int64
gt: Int64
}

input FloatFilter {
eq: Float
le: Float
lt: Float
ge: Float
gt: Float
}

input DateTimeFilter {
eq: DateTime
le: DateTime
lt: DateTime
ge: DateTime
gt: DateTime
}

input StringTermFilter {
allofterms: String
anyofterms: String
}

input StringRegExpFilter {
regexp: String
}

input StringFullTextFilter {
alloftext: String
anyoftext: String
}

input StringExactFilter {
eq: String
le: String
lt: String
ge: String
gt: String
}

input StringHashFilter {
eq: String
}

#######################
# Generated Types
#######################

type AddAuthorPayload {
author(filter: AuthorFilter, order: AuthorOrder, first: Int, offset: Int): [Author]
numUids: Int
}

type DeleteAuthorPayload {
author(filter: AuthorFilter, order: AuthorOrder, first: Int, offset: Int): [Author]
msg: String
numUids: Int
}

type UpdateAuthorPayload {
author(filter: AuthorFilter, order: AuthorOrder, first: Int, offset: Int): [Author]
numUids: Int
}

#######################
# Generated Enums
#######################

enum AuthorHasFilter {
name
}

enum AuthorOrderable {
name
}

#######################
# Generated Inputs
#######################

input AddAuthorInput {
name: String!
}

input AuthorFilter {
id: [ID!]
has: AuthorHasFilter
and: AuthorFilter
or: AuthorFilter
not: AuthorFilter
}

input AuthorOrder {
asc: AuthorOrderable
desc: AuthorOrderable
then: AuthorOrder
}

input AuthorPatch {
name: String
}

input AuthorRef {
id: ID
name: String
}

input UpdateAuthorInput {
filter: AuthorFilter!
set: AuthorPatch
remove: AuthorPatch
}

#######################
# Generated Query
#######################

type Query {
getAuthor(id: ID!): Author
queryAuthor(filter: AuthorFilter, order: AuthorOrder, first: Int, offset: Int): [Author]
}

#######################
# Generated Mutations
#######################

type Mutation {
addAuthor(input: [AddAuthorInput!]!): AddAuthorPayload
updateAuthor(input: UpdateAuthorInput!): UpdateAuthorPayload
deleteAuthor(filter: AuthorFilter!): DeleteAuthorPayload
}

40 changes: 40 additions & 0 deletions graphql/e2e/schema/schema_test.go
Expand Up @@ -21,6 +21,7 @@ import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"sync"
"testing"
Expand Down Expand Up @@ -446,6 +447,45 @@ func TestGQLSchemaValidate(t *testing.T) {
}
}

func TestUpdateGQLSchemaFields(t *testing.T) {
schema := `
type Author {
id: ID!
name: String!
}`

generatedSchema, err := ioutil.ReadFile("generatedSchema.graphql")
require.NoError(t, err)

req := &common.GraphQLParams{
Query: `mutation updateGQLSchema($sch: String!) {
updateGQLSchema(input: { set: { schema: $sch }}) {
gqlSchema {
schema
generatedSchema
}
}
}`,
Variables: map[string]interface{}{"sch": schema},
}
resp := req.ExecuteAsPost(t, groupOneAdminServer)
require.NotNil(t, resp)
require.Nilf(t, resp.Errors, "%s", resp.Errors)

var updateResp struct {
UpdateGQLSchema struct {
GQLSchema struct {
Schema string
GeneratedSchema string
}
}
}
require.NoError(t, json.Unmarshal(resp.Data, &updateResp))

require.Equal(t, schema, updateResp.UpdateGQLSchema.GQLSchema.Schema)
require.Equal(t, string(generatedSchema), updateResp.UpdateGQLSchema.GQLSchema.GeneratedSchema)
}

func updateGQLSchema(t *testing.T, schema, url string) *common.GraphQLResponse {
req := &common.GraphQLParams{
Query: `mutation updateGQLSchema($sch: String!) {
Expand Down

0 comments on commit 0b8681c

Please sign in to comment.