2020-04-23 07:42:16 +02:00
package psql_test
2019-12-25 07:24:30 +01:00
import (
"encoding/json"
"testing"
)
func singleUpdate ( t * testing . T ) {
gql := ` mutation {
2020-02-19 05:52:44 +01:00
product ( id : $ id , update : $ update , where : { id : { eq : 1 } } ) {
2019-12-25 07:24:30 +01:00
id
name
}
} `
vars := map [ string ] json . RawMessage {
"update" : json . RawMessage ( ` { "name": "my_name", "description": "my_desc" } ` ) ,
}
2020-02-10 07:45:37 +01:00
compileGQLToPSQL ( t , gql , vars , "anon" )
2019-12-25 07:24:30 +01:00
}
func simpleUpdateWithPresets ( t * testing . T ) {
gql := ` mutation {
product ( update : $ data ) {
id
}
} `
vars := map [ string ] json . RawMessage {
"data" : json . RawMessage ( ` { "name": "Apple", "price": 1.25} ` ) ,
}
2020-02-10 07:45:37 +01:00
compileGQLToPSQL ( t , gql , vars , "user" )
2019-12-25 07:24:30 +01:00
}
func nestedUpdateManyToMany ( t * testing . T ) {
gql := ` mutation {
2020-02-19 05:52:44 +01:00
purchase ( update : $ data , id : $ id ) {
2019-12-25 07:24:30 +01:00
sale_type
quantity
due_date
customer {
id
full_name
email
}
product {
id
name
price
}
}
} `
vars := map [ string ] json . RawMessage {
"data" : json . RawMessage ( ` {
"sale_type" : "bought" ,
"quantity" : 5 ,
"due_date" : "now" ,
"customer" : {
"email" : "thedude@rug.com" ,
"full_name" : "The Dude"
} ,
"product" : {
"name" : "Apple" ,
"price" : 1.25
}
}
` ) ,
}
2020-02-10 07:45:37 +01:00
compileGQLToPSQL ( t , gql , vars , "admin" )
2019-12-25 07:24:30 +01:00
}
func nestedUpdateOneToMany ( t * testing . T ) {
gql := ` mutation {
user ( update : $ data , where : { id : { eq : 8 } } ) {
id
full_name
email
product {
id
name
price
}
}
} `
vars := map [ string ] json . RawMessage {
"data" : json . RawMessage ( ` {
"email" : "thedude@rug.com" ,
"full_name" : "The Dude" ,
"created_at" : "now" ,
"updated_at" : "now" ,
"product" : {
"where" : {
"id" : 2
} ,
"name" : "Apple" ,
"price" : 1.25 ,
"created_at" : "now" ,
"updated_at" : "now"
}
} ` ) ,
}
2020-02-10 07:45:37 +01:00
compileGQLToPSQL ( t , gql , vars , "admin" )
2019-12-25 07:24:30 +01:00
}
func nestedUpdateOneToOne ( t * testing . T ) {
gql := ` mutation {
2020-02-19 05:52:44 +01:00
product ( update : $ data , id : $ id ) {
2019-12-25 07:24:30 +01:00
id
name
user {
id
full_name
email
}
}
} `
vars := map [ string ] json . RawMessage {
"data" : json . RawMessage ( ` {
"name" : "Apple" ,
"price" : 1.25 ,
"created_at" : "now" ,
"updated_at" : "now" ,
"user" : {
"email" : "thedude@rug.com"
}
} ` ) ,
}
2020-02-10 07:45:37 +01:00
compileGQLToPSQL ( t , gql , vars , "admin" )
2019-12-25 07:24:30 +01:00
}
func nestedUpdateOneToManyWithConnect ( t * testing . T ) {
gql := ` mutation {
2020-02-19 05:52:44 +01:00
user ( update : $ data , id : $ id ) {
2019-12-25 07:24:30 +01:00
id
full_name
email
product {
id
name
price
}
}
} `
vars := map [ string ] json . RawMessage {
"data" : json . RawMessage ( ` {
"email" : "thedude@rug.com" ,
"full_name" : "The Dude" ,
"created_at" : "now" ,
"updated_at" : "now" ,
"product" : {
"connect" : { "id" : 7 } ,
"disconnect" : { "id" : 8 }
}
} ` ) ,
}
2020-02-10 07:45:37 +01:00
compileGQLToPSQL ( t , gql , vars , "admin" )
2019-12-25 07:24:30 +01:00
}
func nestedUpdateOneToOneWithConnect ( t * testing . T ) {
gql := ` mutation {
2020-02-19 05:52:44 +01:00
product ( update : $ data , id : $ product_id ) {
2019-12-25 07:24:30 +01:00
id
name
user {
id
full_name
email
}
}
} `
vars := map [ string ] json . RawMessage {
"data" : json . RawMessage ( ` {
"name" : "Apple" ,
"price" : 1.25 ,
"user" : {
"connect" : { "id" : 5 , "email" : "test@test.com" }
}
} ` ) ,
}
2020-02-10 07:45:37 +01:00
compileGQLToPSQL ( t , gql , vars , "admin" )
2019-12-29 07:53:54 +01:00
}
func nestedUpdateOneToOneWithDisconnect ( t * testing . T ) {
gql := ` mutation {
2020-02-19 05:52:44 +01:00
product ( update : $ data , id : $ id ) {
2019-12-29 07:53:54 +01:00
id
name
user_id
}
} `
vars := map [ string ] json . RawMessage {
"data" : json . RawMessage ( ` {
"name" : "Apple" ,
"price" : 1.25 ,
"user" : {
"disconnect" : { "id" : 5 }
}
} ` ) ,
}
2020-02-10 07:45:37 +01:00
compileGQLToPSQL ( t , gql , vars , "admin" )
2019-12-25 07:24:30 +01:00
}
2020-01-26 07:10:54 +01:00
// func nestedUpdateOneToOneWithDisconnectArray(t *testing.T) {
// gql := `mutation {
// product(update: $data, id: 2) {
// id
// name
// user_id
// }
// }`
2020-05-27 01:41:28 +02:00
// sql := `WITH "_sg_input" AS (SELECT $1 :: json AS j), "users" AS (SELECT * FROM (VALUES(NULL::bigint)) AS LOOKUP("id")), "products" AS (UPDATE "products" SET ("name", "price", "user_id") = (SELECT "t"."name", "t"."price", "users"."id" FROM "_sg_input" i, "users", json_populate_record(NULL::products, i.j) t) WHERE (("products"."id") = 2) RETURNING "products".*) SELECT json_object_agg('product', json_0) FROM (SELECT row_to_json((SELECT "json_row_0" FROM (SELECT "products_0"."id" AS "id", "products_0"."name" AS "name", "products_0"."user_id" AS "user_id") AS "json_row_0")) AS "json_0" FROM (SELECT "products"."id", "products"."name", "products"."user_id" FROM "products" LIMIT ('1') :: integer) AS "products_0" LIMIT ('1') :: integer) AS "sel_0"`
2020-01-26 07:10:54 +01:00
// vars := map[string]json.RawMessage{
// "data": json.RawMessage(`{
// "name": "Apple",
// "price": 1.25,
// "user": {
// "disconnect": { "id": 5 }
// }
// }`),
// }
// resSQL, err := compileGQLToPSQL(gql, vars, "admin")
// if err != nil {
// t.Fatal(err)
// }
// if string(resSQL) != sql {
// t.Fatal(errNotExpected)
// }
// }
2019-12-25 07:24:30 +01:00
func TestCompileUpdate ( t * testing . T ) {
t . Run ( "singleUpdate" , singleUpdate )
t . Run ( "simpleUpdateWithPresets" , simpleUpdateWithPresets )
t . Run ( "nestedUpdateManyToMany" , nestedUpdateManyToMany )
t . Run ( "nestedUpdateOneToMany" , nestedUpdateOneToMany )
t . Run ( "nestedUpdateOneToOne" , nestedUpdateOneToOne )
t . Run ( "nestedUpdateOneToManyWithConnect" , nestedUpdateOneToManyWithConnect )
t . Run ( "nestedUpdateOneToOneWithConnect" , nestedUpdateOneToOneWithConnect )
2019-12-29 07:53:54 +01:00
t . Run ( "nestedUpdateOneToOneWithDisconnect" , nestedUpdateOneToOneWithDisconnect )
2020-01-26 07:10:54 +01:00
//t.Run("nestedUpdateOneToOneWithDisconnectArray", nestedUpdateOneToOneWithDisconnectArray)
2019-12-25 07:24:30 +01:00
}