259 lines
5.2 KiB
Go
259 lines
5.2 KiB
Go
package psql
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func singleUpdate(t *testing.T) {
|
|
gql := `mutation {
|
|
product(id: $id, update: $update, where: { id: { eq: 1 } }) {
|
|
id
|
|
name
|
|
}
|
|
}`
|
|
|
|
vars := map[string]json.RawMessage{
|
|
"update": json.RawMessage(` { "name": "my_name", "description": "my_desc" }`),
|
|
}
|
|
|
|
compileGQLToPSQL(t, gql, vars, "anon")
|
|
}
|
|
|
|
func simpleUpdateWithPresets(t *testing.T) {
|
|
gql := `mutation {
|
|
product(update: $data) {
|
|
id
|
|
}
|
|
}`
|
|
|
|
vars := map[string]json.RawMessage{
|
|
"data": json.RawMessage(`{"name": "Apple", "price": 1.25}`),
|
|
}
|
|
|
|
compileGQLToPSQL(t, gql, vars, "user")
|
|
}
|
|
|
|
func nestedUpdateManyToMany(t *testing.T) {
|
|
gql := `mutation {
|
|
purchase(update: $data, id: $id) {
|
|
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
|
|
}
|
|
}
|
|
`),
|
|
}
|
|
|
|
compileGQLToPSQL(t, gql, vars, "admin")
|
|
}
|
|
|
|
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"
|
|
}
|
|
}`),
|
|
}
|
|
|
|
compileGQLToPSQL(t, gql, vars, "admin")
|
|
}
|
|
|
|
func nestedUpdateOneToOne(t *testing.T) {
|
|
gql := `mutation {
|
|
product(update: $data, id: $id) {
|
|
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"
|
|
}
|
|
}`),
|
|
}
|
|
|
|
compileGQLToPSQL(t, gql, vars, "admin")
|
|
|
|
}
|
|
|
|
func nestedUpdateOneToManyWithConnect(t *testing.T) {
|
|
gql := `mutation {
|
|
user(update: $data, id: $id) {
|
|
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 }
|
|
}
|
|
}`),
|
|
}
|
|
|
|
compileGQLToPSQL(t, gql, vars, "admin")
|
|
}
|
|
|
|
func nestedUpdateOneToOneWithConnect(t *testing.T) {
|
|
gql := `mutation {
|
|
product(update: $data, id: $product_id) {
|
|
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" }
|
|
}
|
|
}`),
|
|
}
|
|
|
|
compileGQLToPSQL(t, gql, vars, "admin")
|
|
}
|
|
|
|
func nestedUpdateOneToOneWithDisconnect(t *testing.T) {
|
|
gql := `mutation {
|
|
product(update: $data, id: $id) {
|
|
id
|
|
name
|
|
user_id
|
|
}
|
|
}`
|
|
vars := map[string]json.RawMessage{
|
|
"data": json.RawMessage(`{
|
|
"name": "Apple",
|
|
"price": 1.25,
|
|
"user": {
|
|
"disconnect": { "id": 5 }
|
|
}
|
|
}`),
|
|
}
|
|
|
|
compileGQLToPSQL(t, gql, vars, "admin")
|
|
}
|
|
|
|
// func nestedUpdateOneToOneWithDisconnectArray(t *testing.T) {
|
|
// gql := `mutation {
|
|
// product(update: $data, id: 2) {
|
|
// id
|
|
// name
|
|
// user_id
|
|
// }
|
|
// }`
|
|
|
|
// sql := `WITH "_sg_input" AS (SELECT '{{data}}' :: 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"`
|
|
|
|
// 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)
|
|
// }
|
|
// }
|
|
|
|
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)
|
|
t.Run("nestedUpdateOneToOneWithDisconnect", nestedUpdateOneToOneWithDisconnect)
|
|
//t.Run("nestedUpdateOneToOneWithDisconnectArray", nestedUpdateOneToOneWithDisconnectArray)
|
|
}
|