144 lines
4.2 KiB
Go
144 lines
4.2 KiB
Go
|
package integration_tests
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"database/sql"
|
|||
|
"encoding/json"
|
|||
|
"testing"
|
|||
|
|
|||
|
"github.com/dosco/super-graph/core"
|
|||
|
"github.com/stretchr/testify/require"
|
|||
|
)
|
|||
|
|
|||
|
func SetupSchema(t *testing.T, db *sql.DB) {
|
|||
|
|
|||
|
_, err := db.Exec(`
|
|||
|
CREATE TABLE users (
|
|||
|
id integer PRIMARY KEY,
|
|||
|
full_name text
|
|||
|
)`)
|
|||
|
require.NoError(t, err)
|
|||
|
|
|||
|
_, err = db.Exec(`CREATE TABLE product (
|
|||
|
id integer PRIMARY KEY,
|
|||
|
name text,
|
|||
|
weight float
|
|||
|
)`)
|
|||
|
require.NoError(t, err)
|
|||
|
|
|||
|
_, err = db.Exec(`CREATE TABLE line_item (
|
|||
|
id integer PRIMARY KEY,
|
|||
|
product integer REFERENCES product(id),
|
|||
|
quantity integer,
|
|||
|
price float
|
|||
|
)`)
|
|||
|
require.NoError(t, err)
|
|||
|
}
|
|||
|
|
|||
|
func DropSchema(t *testing.T, db *sql.DB) {
|
|||
|
|
|||
|
_, err := db.Exec(`DROP TABLE IF EXISTS line_item`)
|
|||
|
require.NoError(t, err)
|
|||
|
|
|||
|
_, err = db.Exec(`DROP TABLE IF EXISTS product`)
|
|||
|
require.NoError(t, err)
|
|||
|
|
|||
|
_, err = db.Exec(`DROP TABLE IF EXISTS users`)
|
|||
|
require.NoError(t, err)
|
|||
|
}
|
|||
|
|
|||
|
func TestSuperGraph(t *testing.T, db *sql.DB, before func(t *testing.T)) {
|
|||
|
config := core.Config{}
|
|||
|
config.UseAllowList = false
|
|||
|
config.AllowListFile = "./allow.list"
|
|||
|
config.RolesQuery = `SELECT * FROM users WHERE id = $user_id`
|
|||
|
|
|||
|
config.Roles = []core.Role{
|
|||
|
core.Role{
|
|||
|
Name: "anon",
|
|||
|
Tables: []core.RoleTable{
|
|||
|
core.RoleTable{Name: "users", Query: core.Query{Limit: 100}},
|
|||
|
core.RoleTable{Name: "product", Query: core.Query{Limit: 100}},
|
|||
|
core.RoleTable{Name: "line_item", Query: core.Query{Limit: 100}},
|
|||
|
},
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
sg, err := core.NewSuperGraph(&config, db)
|
|||
|
require.NoError(t, err)
|
|||
|
ctx := context.Background()
|
|||
|
|
|||
|
t.Run("seed fixtures", func(t *testing.T) {
|
|||
|
before(t)
|
|||
|
res, err := sg.GraphQL(ctx,
|
|||
|
`mutation { products (insert: $products) { id } }`,
|
|||
|
json.RawMessage(`{"products":[
|
|||
|
{"id":1, "name":"Charmin Ultra Soft", "weight": 0.5},
|
|||
|
{"id":2, "name":"Hand Sanitizer", "weight": 0.2},
|
|||
|
{"id":3, "name":"Case of Corona", "weight": 1.2}
|
|||
|
]}`))
|
|||
|
require.NoError(t, err, res.SQL())
|
|||
|
require.Equal(t, `{"products": [{"id": 1}, {"id": 2}, {"id": 3}]}`, string(res.Data))
|
|||
|
|
|||
|
res, err = sg.GraphQL(ctx,
|
|||
|
`mutation { line_items (insert: $line_items) { id } }`,
|
|||
|
json.RawMessage(`{"line_items":[
|
|||
|
{"id":5001, "product":1, "price":6.95, "quantity":10},
|
|||
|
{"id":5002, "product":2, "price":10.99, "quantity":2}
|
|||
|
]}`))
|
|||
|
require.NoError(t, err, res.SQL())
|
|||
|
require.Equal(t, `{"line_items": [{"id": 5001}, {"id": 5002}]}`, string(res.Data))
|
|||
|
})
|
|||
|
|
|||
|
t.Run("get line items", func(t *testing.T) {
|
|||
|
before(t)
|
|||
|
res, err := sg.GraphQL(ctx,
|
|||
|
`query { line_items { id, price, quantity } }`,
|
|||
|
json.RawMessage(`{}`))
|
|||
|
require.NoError(t, err, res.SQL())
|
|||
|
require.Equal(t, `{"line_items": [{"id": 5001, "price": 6.95, "quantity": 10}, {"id": 5002, "price": 10.99, "quantity": 2}]}`, string(res.Data))
|
|||
|
})
|
|||
|
|
|||
|
t.Run("update line item", func(t *testing.T) {
|
|||
|
before(t)
|
|||
|
res, err := sg.GraphQL(ctx,
|
|||
|
`mutation { line_item(update:$update, id:$id) { id } }`,
|
|||
|
json.RawMessage(`{"id":5001, "update":{"quantity":20}}`))
|
|||
|
require.NoError(t, err, res.SQL())
|
|||
|
require.Equal(t, `{"line_item": {"id": 5001}}`, string(res.Data))
|
|||
|
|
|||
|
res, err = sg.GraphQL(ctx,
|
|||
|
`query { line_item(id:$id) { id, price, quantity } }`,
|
|||
|
json.RawMessage(`{"id":5001}`))
|
|||
|
require.NoError(t, err, res.SQL())
|
|||
|
require.Equal(t, `{"line_item": {"id": 5001, "price": 6.95, "quantity": 20}}`, string(res.Data))
|
|||
|
})
|
|||
|
|
|||
|
t.Run("delete line item", func(t *testing.T) {
|
|||
|
before(t)
|
|||
|
res, err := sg.GraphQL(ctx,
|
|||
|
`mutation { line_item(delete:true, id:$id) { id } }`,
|
|||
|
json.RawMessage(`{"id":5002}`))
|
|||
|
require.NoError(t, err, res.SQL())
|
|||
|
require.Equal(t, `{"line_item": {"id": 5002}}`, string(res.Data))
|
|||
|
|
|||
|
res, err = sg.GraphQL(ctx,
|
|||
|
`query { line_items { id, price, quantity } }`,
|
|||
|
json.RawMessage(`{}`))
|
|||
|
require.NoError(t, err, res.SQL())
|
|||
|
require.Equal(t, `{"line_items": [{"id": 5001, "price": 6.95, "quantity": 20}]}`, string(res.Data))
|
|||
|
})
|
|||
|
|
|||
|
t.Run("nested insert", func(t *testing.T) {
|
|||
|
before(t)
|
|||
|
res, err := sg.GraphQL(ctx,
|
|||
|
`mutation { line_items (insert: $line_item) { id, product { name } } }`,
|
|||
|
json.RawMessage(`{"line_item":
|
|||
|
{"id":5003, "product": { "connect": { "id": 1} }, "price":10.95, "quantity":15}
|
|||
|
}`))
|
|||
|
require.NoError(t, err, res.SQL())
|
|||
|
require.Equal(t, `{"line_items": [{"id": 5003, "product": {"name": "Charmin Ultra Soft"}}]}`, string(res.Data))
|
|||
|
})
|
|||
|
|
|||
|
}
|