@@ -165,7 +165,12 @@ func runQuery(q string) (string, error) {
165165}
166166
167167func runMutation (m string ) error {
168- _ , _ , err := mutationWithTs (m , true , false , 0 )
168+ _ , _ , err := mutationWithTs (m , false , true , false , 0 )
169+ return err
170+ }
171+
172+ func runJsonMutation (m string ) error {
173+ _ , _ , err := mutationWithTs (m , true , true , false , 0 )
169174 return err
170175}
171176
@@ -671,7 +676,145 @@ func TestSchemaMutationCountAdd(t *testing.T) {
671676 output , err := runQuery (q1 )
672677 require .NoError (t , err )
673678 require .JSONEq (t , `{"data": {"user":[{"name":"Alice"}]}}` , output )
679+ }
674680
681+ func TestJsonMutation (t * testing.T ) {
682+ var q1 = `
683+ {
684+ q(func: has(name)) {
685+ uid
686+ name
687+ }
688+ }
689+ `
690+ var q2 = `
691+ {
692+ q(func: has(name)) {
693+ name
694+ }
695+ }
696+ `
697+ var m1 = `
698+ {
699+ "set": [
700+ {
701+ "name": "Alice"
702+ },
703+ {
704+ "name": "Bob"
705+ }
706+ ]
707+ }
708+ `
709+ var m2 = `
710+ {
711+ "delete": [
712+ {
713+ "uid": "%s",
714+ "name": null
715+ }
716+ ]
717+ }
718+ `
719+ var s1 = `
720+ name: string @index(exact) .
721+ `
722+
723+ schema .ParseBytes ([]byte ("" ), 1 )
724+ err := alterSchemaWithRetry (s1 )
725+ require .NoError (t , err )
726+
727+ err = runJsonMutation (m1 )
728+ require .NoError (t , err )
729+
730+ output , err := runQuery (q1 )
731+ q1Result := map [string ]interface {}{}
732+ require .NoError (t , json .Unmarshal ([]byte (output ), & q1Result ))
733+ queryResults := q1Result ["data" ].(map [string ]interface {})["q" ].([]interface {})
734+ require .Equal (t , 2 , len (queryResults ))
735+
736+ var uid string
737+ count := 0
738+ for i := 0 ; i < 2 ; i ++ {
739+ name := queryResults [i ].(map [string ]interface {})["name" ].(string )
740+ if name == "Alice" {
741+ uid = queryResults [i ].(map [string ]interface {})["uid" ].(string )
742+ count ++
743+ } else {
744+ require .Equal (t , "Bob" , name )
745+ }
746+ }
747+ require .Equal (t , 1 , count )
748+
749+ err = runJsonMutation (fmt .Sprintf (m2 , uid ))
750+ require .NoError (t , err )
751+
752+ output , err = runQuery (q2 )
753+ require .NoError (t , err )
754+ require .JSONEq (t , `{"data": {"q":[{"name":"Bob"}]}}` , output )
755+ }
756+
757+ func TestJsonMutationNumberParsing (t * testing.T ) {
758+ var q1 = `
759+ {
760+ q(func: has(n1)) {
761+ n1
762+ n2
763+ }
764+ }
765+ `
766+ var m1 = `
767+ {
768+ "set": [
769+ {
770+ "n1": 9007199254740995,
771+ "n2": 9007199254740995.0
772+ }
773+ ]
774+ }
775+ `
776+
777+ schema .ParseBytes ([]byte ("" ), 1 )
778+ err := runJsonMutation (m1 )
779+ require .NoError (t , err )
780+
781+ output , err := runQuery (q1 )
782+ var q1Result struct {
783+ Data struct {
784+ Q []map [string ]interface {} `json:"q"`
785+ } `json:"data"`
786+ }
787+ buffer := bytes .NewBuffer ([]byte (output ))
788+ dec := json .NewDecoder (buffer )
789+ dec .UseNumber ()
790+ require .NoError (t , dec .Decode (& q1Result ))
791+ require .Equal (t , 1 , len (q1Result .Data .Q ))
792+
793+ n1 , ok := q1Result .Data .Q [0 ]["n1" ]
794+ require .True (t , ok )
795+ switch n1 .(type ) {
796+ case json.Number :
797+ n := n1 .(json.Number )
798+ require .True (t , strings .Index (n .String (), "." ) < 0 )
799+ i , err := n .Int64 ()
800+ require .NoError (t , err )
801+ require .Equal (t , int64 (9007199254740995 ), i )
802+ default :
803+ require .Fail (t , fmt .Sprintf ("expected n1 of type int64, got %v (type %T)" , n1 , n1 ))
804+ }
805+
806+ n2 , ok := q1Result .Data .Q [0 ]["n2" ]
807+ require .True (t , ok )
808+ switch n2 .(type ) {
809+ case json.Number :
810+ n := n2 .(json.Number )
811+ require .True (t , strings .Index (n .String (), "." ) >= 0 )
812+ f , err := n .Float64 ()
813+ require .NoError (t , err )
814+ require .Equal (t , 9007199254740995.0 , f )
815+ default :
816+ require .Fail (t , fmt .Sprintf ("expected n2 of type float64, got %v (type %T)" , n2 , n2 ))
817+ }
675818}
676819
677820func TestDeleteAll (t * testing.T ) {
0 commit comments