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  }