Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cherry-pick v20.07: fix(GraphQL): incorrect generatedSchema in updateGQLSchema (#6349) #6354

Merged
merged 2 commits into from
Sep 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions graphql/admin/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,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 @@ -70,8 +68,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
209 changes: 209 additions & 0 deletions graphql/e2e/schema/generatedSchema.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
#######################
# Input Schema
#######################

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

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

scalar DateTime

enum DgraphIndex {
int
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) on FIELD_DEFINITION
directive @remote on OBJECT | INTERFACE
directive @cascade on FIELD

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

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 AuthorOrderable {
name
}

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

input AddAuthorInput {
name: String!
}

input AuthorFilter {
id: [ID!]
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
}

46 changes: 42 additions & 4 deletions graphql/e2e/schema/schema_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,16 @@ import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"sync"
"testing"
"time"

"github.com/dgraph-io/dgo/v200/protos/api"

"github.com/dgraph-io/dgraph/worker"

"github.com/dgraph-io/dgo/v200"
"github.com/dgraph-io/dgo/v200/protos/api"
"github.com/dgraph-io/dgraph/graphql/e2e/common"
"github.com/dgraph-io/dgraph/testutil"
"github.com/dgraph-io/dgraph/worker"
"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -328,6 +327,45 @@ func TestGQLSchemaAfterDropData(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