Skip to content
Snippets Groups Projects
parser_test.go 6.57 KiB
Newer Older
 * Copyright 2015 DGraph Labs, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package gql

import (
	"fmt"
	"strings"
func checkAttr(g *GraphQuery, attr string) error {
	if g.Attr != attr {
		return fmt.Errorf("Expected: %v. Got: %v", attr, g.Attr)
	}
	return nil
}

func TestParse(t *testing.T) {
	query := `
	query {
	gq, _, err := Parse(query)
	if len(gq.Children) != 4 {
		t.Errorf("Expected 4 children. Got: %v", len(gq.Children))
	if err := checkAttr(gq.Children[0], "friends"); err != nil {
	if err := checkAttr(gq.Children[1], "gender"); err != nil {
	if err := checkAttr(gq.Children[2], "age"); err != nil {
	if err := checkAttr(gq.Children[3], "hometown"); err != nil {
	if len(child.Children) != 1 {
		t.Errorf("Expected 1 child of friends. Got: %v", len(child.Children))
	}
	if err := checkAttr(child.Children[0], "name"); err != nil {
		t.Error(err)
	}
}

	// TODO: Why does the query not have _xid_ attribute?
	query := `
	query {
		user(_uid_: 0x11) {
			type.object.name
		}
	}`
	gq, _, err := Parse(query)
	if len(gq.Children) != 1 {
		t.Errorf("Expected 1 children. Got: %v", len(gq.Children))
	if err := checkAttr(gq.Children[0], "type.object.name"); err != nil {
func TestParseFirst(t *testing.T) {
	query := `
	query {
		user(_xid_: m.abcd) {
			type.object.name
			friends (first: 10) {
			}
		}
	}`
	gq, _, err := Parse(query)
	if err != nil {
		t.Error(err)
		return
	}
	if gq == nil {
		t.Error("subgraph is nil")
		return
	}
	if len(gq.Children) != 2 {
		t.Errorf("Expected 2 children. Got: %v", len(gq.Children))
	}
	if err := checkAttr(gq.Children[0], "type.object.name"); err != nil {
		t.Error(err)
	}
	if gq.Children[0].First != 0 {
		t.Errorf("Expected count 0. Got: %v", gq.Children[0].First)
	}
	if err := checkAttr(gq.Children[1], "friends"); err != nil {
		t.Error(err)
	}
	if gq.Children[1].First != 10 {
		t.Errorf("Expected count 10. Got: %v", gq.Children[1].First)
	}
}

func TestParseFirst_error(t *testing.T) {
	query := `
	query {
		user(_xid_: m.abcd) {
			type.object.name
			friends (first: ) {
			}
		}
	}`
	var err error
	_, _, err = Parse(query)
	t.Log(err)
	if err == nil {
		t.Error("Expected error")
	}
func TestParse_error2(t *testing.T) {
	query := `
		query {
			me {
				name
			}
		}
	`
	var err error
	_, _, err = Parse(query)
	t.Log(err)
	if err == nil {
		t.Error("Expected error")
	}
}

func TestParse_pass1(t *testing.T) {
	query := `
		{
	gq, _, err := Parse(query)
	if len(gq.Children) != 2 {
		t.Errorf("Expected 2. Got: %v", len(gq.Children))
	if err := checkAttr(gq.Children[0], "name"); err != nil {
	if err := checkAttr(gq.Children[1], "friends"); err != nil {
		t.Errorf("Expected 0. Got: %v", len(gq.Children))

func TestParse_block(t *testing.T) {
	query := `
		{
			root(_uid_: 0x0a) {
				type.object.name.es-419
			}
		}
	`
	gq, _, err := Parse(query)
	if len(gq.Children) != 1 {
		t.Errorf("Expected 1. Got: %v", len(gq.Children))
	if err := checkAttr(gq.Children[0], "type.object.name.es-419"); err != nil {

func TestParseMutation(t *testing.T) {
	query := `
		mutation {
			set {
				<name> <is> <something> .
				<hometown> <is> <san francisco> .
			}
			delete {
				<name> <is> <something-else> .
			}
		}
	`
	_, mu, err := Parse(query)
	if err != nil {
		t.Error(err)
		return
	}
	if strings.Index(mu.Set, "<name> <is> <something> .") == -1 {
		t.Error("Unable to find mutation content.")
	}
	if strings.Index(mu.Set, "<hometown> <is> <san francisco> .") == -1 {
		t.Error("Unable to find mutation content.")
	}
	if strings.Index(mu.Del, "<name> <is> <something-else> .") == -1 {
		t.Error("Unable to find mutation content.")
	}
}

func TestParseMutation_error(t *testing.T) {
	query := `
		mutation {
			set {
				<name> <is> <something> .
				<hometown> <is> <san francisco> .
			}
			delete {
				<name> <is> <something-else> .
		}
	`
	_, _, err := Parse(query)
	if err == nil {
		t.Error(err)
		return
	}
	t.Log(err)
}

func TestParseMutation_error2(t *testing.T) {
	query := `
		mutation {
			set {
				<name> <is> <something> .
				<hometown> <is> <san francisco> .
			}
			delete {
				<name> <is> <something-else> .
			}
		}
		mutation {
			set {
				another one?
			}
		}

	`
	_, _, err := Parse(query)
	if err == nil {
		t.Error(err)
		return
	}
	t.Log(err)
}

func TestParseMutationAndQuery(t *testing.T) {
	query := `
		mutation {
			set {
				<name> <is> <something> .
				<hometown> <is> <san francisco> .
			}
			delete {
				<name> <is> <something-else> .
			}
		}
		query {
			me(_xid_: tomhanks) {
				name
				hometown
			}
		}
	`
	gq, mu, err := Parse(query)
	if err != nil {
		t.Error(err)
		return
	}

	if mu == nil {
		t.Error("mutation is nil")
		return
	}
	if strings.Index(mu.Set, "<name> <is> <something> .") == -1 {
		t.Error("Unable to find mutation content.")
	}
	if strings.Index(mu.Set, "<hometown> <is> <san francisco> .") == -1 {
		t.Error("Unable to find mutation content.")
	}
	if strings.Index(mu.Del, "<name> <is> <something-else> .") == -1 {
		t.Error("Unable to find mutation content.")
	}

	if gq == nil {
		t.Error("subgraph is nil")
		return
	}
	if gq.XID != "tomhanks" {
		t.Errorf("Expected: tomhanks. Got: %v", gq.XID)
		return
	}
	if len(gq.Children) != 2 {
		t.Errorf("Expected 2 children. Got: %v", len(gq.Children))
		return
	}
	if err := checkAttr(gq.Children[0], "name"); err != nil {
		t.Error(err)
	}
	if err := checkAttr(gq.Children[1], "hometown"); err != nil {
		t.Error(err)
	}
}