forked from dgraph-io/dgraph
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server_test.go
121 lines (109 loc) · 4.1 KB
/
server_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
* Copyright 2017-2018 Dgraph Labs, Inc. and Contributors
*
* 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 edgraph
import (
"testing"
"github.com/dgraph-io/dgo/v2/protos/api"
"github.com/dgraph-io/dgraph/chunker"
"github.com/dgraph-io/dgraph/x"
"github.com/stretchr/testify/require"
)
func makeNquad(sub, pred string, val *api.Value) *api.NQuad {
return &api.NQuad{
Subject: sub,
Predicate: pred,
ObjectValue: val,
}
}
func makeNquadEdge(sub, pred, obj string) *api.NQuad {
return &api.NQuad{
Subject: sub,
Predicate: pred,
ObjectId: obj,
}
}
func TestParseNQuads(t *testing.T) {
nquads := `
_:a <predA> "A" .
_:b <predB> "B" .
# this line is a comment
_:a <join> _:b .
`
nqs, _, err := chunker.ParseRDFs([]byte(nquads))
require.NoError(t, err)
require.Equal(t, []*api.NQuad{
makeNquad("_:a", "predA", &api.Value{Val: &api.Value_DefaultVal{DefaultVal: "A"}}),
makeNquad("_:b", "predB", &api.Value{Val: &api.Value_DefaultVal{DefaultVal: "B"}}),
makeNquadEdge("_:a", "join", "_:b"),
}, nqs)
}
func TestValNquads(t *testing.T) {
nquads := `uid(m) <name> val(f) .`
_, _, err := chunker.ParseRDFs([]byte(nquads))
require.NoError(t, err)
}
func TestParseNQuadsWindowsNewline(t *testing.T) {
nquads := "_:a <predA> \"A\" .\r\n_:b <predB> \"B\" ."
nqs, _, err := chunker.ParseRDFs([]byte(nquads))
require.NoError(t, err)
require.Equal(t, []*api.NQuad{
makeNquad("_:a", "predA", &api.Value{Val: &api.Value_DefaultVal{DefaultVal: "A"}}),
makeNquad("_:b", "predB", &api.Value{Val: &api.Value_DefaultVal{DefaultVal: "B"}}),
}, nqs)
}
func TestParseNQuadsDelete(t *testing.T) {
nquads := `_:a * * .`
nqs, _, err := chunker.ParseRDFs([]byte(nquads))
require.NoError(t, err)
require.Equal(t, []*api.NQuad{
makeNquad("_:a", x.Star, &api.Value{Val: &api.Value_DefaultVal{DefaultVal: x.Star}}),
}, nqs)
}
func TestValidateKeys(t *testing.T) {
tests := []struct {
name string
nquad string
noError bool
}{
{name: "test 1", nquad: `_:alice <knows> "stuff" ( "key 1" = 12 ) .`, noError: false},
{name: "test 2", nquad: `_:alice <knows> "stuff" ( "key 1" = 12 ) .`, noError: false},
{name: "test 3", nquad: `_:alice <knows> "stuff" ( ~key1 = 12 ) .`, noError: false},
{name: "test 4", nquad: `_:alice <knows> "stuff" ( "~key1" = 12 ) .`, noError: false},
{name: "test 5", nquad: `_:alice <~knows> "stuff" ( "key 1" = 12 ) .`, noError: false},
{name: "test 6", nquad: `_:alice <~knows> "stuff" ( "key 1" = 12 ) .`, noError: false},
{name: "test 7", nquad: `_:alice <~knows> "stuff" ( key1 = 12 ) .`, noError: false},
{name: "test 8", nquad: `_:alice <~knows> "stuff" ( "key1" = 12 ) .`, noError: false},
{name: "test 9", nquad: `_:alice <~knows> "stuff" ( "key 1" = 12 ) .`, noError: false},
{name: "test 10", nquad: `_:alice <knows> "stuff" ( key1 = 12 , "key 2" = 13 ) .`, noError: false},
{name: "test 11", nquad: `_:alice <knows> "stuff" ( "key1" = 12, key2 = 13 , "key 3" = "a b" ) .`, noError: false},
{name: "test 12", nquad: `_:alice <knows~> "stuff" ( key1 = 12 ) .`, noError: false},
{name: "test 13", nquad: `_:alice <knows> "stuff" ( key1 = 12 ) .`, noError: true},
{name: "test 14", nquad: `_:alice <knows@some> "stuff" .`, noError: true},
{name: "test 15", nquad: `_:alice <knows@some@en> "stuff" .`, noError: false},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
nq, _, err := chunker.ParseRDFs([]byte(tc.nquad))
require.NoError(t, err)
err = validateKeys(nq[0])
if tc.noError {
require.NoError(t, err, "Unexpected error for: %+v", nq)
} else {
require.Error(t, err, "Expected an error: %+v", nq)
}
})
}
}