github.com/unigraph-dev/dgraph@v1.1.1-0.20200923154953-8b52b426f765/edgraph/server_test.go (about) 1 /* 2 * Copyright 2017-2018 Dgraph Labs, Inc. and Contributors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package edgraph 18 19 import ( 20 "testing" 21 22 "github.com/dgraph-io/dgo/protos/api" 23 "github.com/dgraph-io/dgraph/chunker" 24 "github.com/dgraph-io/dgraph/x" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func makeNquad(sub, pred string, val *api.Value) *api.NQuad { 29 return &api.NQuad{ 30 Subject: sub, 31 Predicate: pred, 32 ObjectValue: val, 33 } 34 } 35 36 func makeNquadEdge(sub, pred, obj string) *api.NQuad { 37 return &api.NQuad{ 38 Subject: sub, 39 Predicate: pred, 40 ObjectId: obj, 41 } 42 } 43 44 func TestParseNQuads(t *testing.T) { 45 nquads := ` 46 _:a <predA> "A" . 47 _:b <predB> "B" . 48 # this line is a comment 49 _:a <join> _:b . 50 ` 51 nqs, err := chunker.ParseRDFs([]byte(nquads)) 52 require.NoError(t, err) 53 require.Equal(t, []*api.NQuad{ 54 makeNquad("_:a", "predA", &api.Value{Val: &api.Value_DefaultVal{DefaultVal: "A"}}), 55 makeNquad("_:b", "predB", &api.Value{Val: &api.Value_DefaultVal{DefaultVal: "B"}}), 56 makeNquadEdge("_:a", "join", "_:b"), 57 }, nqs) 58 } 59 60 func TestParseNQuadsWindowsNewline(t *testing.T) { 61 nquads := "_:a <predA> \"A\" .\r\n_:b <predB> \"B\" ." 62 nqs, err := chunker.ParseRDFs([]byte(nquads)) 63 require.NoError(t, err) 64 require.Equal(t, []*api.NQuad{ 65 makeNquad("_:a", "predA", &api.Value{Val: &api.Value_DefaultVal{DefaultVal: "A"}}), 66 makeNquad("_:b", "predB", &api.Value{Val: &api.Value_DefaultVal{DefaultVal: "B"}}), 67 }, nqs) 68 } 69 70 func TestParseNQuadsDelete(t *testing.T) { 71 nquads := `_:a * * .` 72 nqs, err := chunker.ParseRDFs([]byte(nquads)) 73 require.NoError(t, err) 74 require.Equal(t, []*api.NQuad{ 75 makeNquad("_:a", x.Star, &api.Value{Val: &api.Value_DefaultVal{DefaultVal: x.Star}}), 76 }, nqs) 77 } 78 79 func TestValidateKeys(t *testing.T) { 80 tests := []struct { 81 name string 82 nquad string 83 noError bool 84 }{ 85 {name: "test 1", nquad: `_:alice <knows> "stuff" ( "key 1" = 12 ) .`, noError: false}, 86 {name: "test 2", nquad: `_:alice <knows> "stuff" ( "key 1" = 12 ) .`, noError: false}, 87 {name: "test 3", nquad: `_:alice <knows> "stuff" ( ~key1 = 12 ) .`, noError: false}, 88 {name: "test 4", nquad: `_:alice <knows> "stuff" ( "~key1" = 12 ) .`, noError: false}, 89 {name: "test 5", nquad: `_:alice <~knows> "stuff" ( "key 1" = 12 ) .`, noError: false}, 90 {name: "test 6", nquad: `_:alice <~knows> "stuff" ( "key 1" = 12 ) .`, noError: false}, 91 {name: "test 7", nquad: `_:alice <~knows> "stuff" ( key1 = 12 ) .`, noError: false}, 92 {name: "test 8", nquad: `_:alice <~knows> "stuff" ( "key1" = 12 ) .`, noError: false}, 93 {name: "test 9", nquad: `_:alice <~knows> "stuff" ( "key 1" = 12 ) .`, noError: false}, 94 {name: "test 10", nquad: `_:alice <knows> "stuff" ( key1 = 12 , "key 2" = 13 ) .`, noError: false}, 95 {name: "test 11", nquad: `_:alice <knows> "stuff" ( "key1" = 12, key2 = 13 , "key 3" = "a b" ) .`, noError: false}, 96 {name: "test 12", nquad: `_:alice <knows~> "stuff" ( key1 = 12 ) .`, noError: false}, 97 {name: "test 13", nquad: `_:alice <knows> "stuff" ( key1 = 12 ) .`, noError: true}, 98 {name: "test 14", nquad: `_:alice <knows@some> "stuff" .`, noError: true}, 99 {name: "test 15", nquad: `_:alice <knows@some@en> "stuff" .`, noError: false}, 100 } 101 102 for _, tc := range tests { 103 t.Run(tc.name, func(t *testing.T) { 104 nq, err := chunker.ParseRDFs([]byte(tc.nquad)) 105 require.NoError(t, err) 106 107 err = validateKeys(nq[0]) 108 if tc.noError { 109 require.NoError(t, err, "Unexpected error for: %+v", nq) 110 } else { 111 require.Error(t, err, "Expected an error: %+v", nq) 112 } 113 }) 114 } 115 }