graphql-engine/server/tests-hspec/BasicFieldsSpec.hs
Chris Done 15071a3bc9 Add SQL Server & Citus to hspec test suite harness and a BasicFields test for each
Relates to https://github.com/hasura/graphql-engine/issues/7755

This includes:

1. SQL Server
2. Citus

And removes the persistent-based testing in favor of duplicating the schema setup, data insertion and teardown.

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/3030
Co-authored-by: Abby Sassel <3883855+sassela@users.noreply.github.com>
GitOrigin-RevId: ab03e68436d2ae07a9ddeb5a499ff41e48d0e2d6
2021-12-30 11:01:43 +00:00

397 lines
7.0 KiB
Haskell

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
-- | Test querying an entity for a couple fields.
module BasicFieldsSpec (spec) where
import Harness.Citus as Citus
import Harness.Constants
import Harness.Feature qualified as Feature
import Harness.Graphql
import Harness.GraphqlEngine qualified as GraphqlEngine
import Harness.Mysql as Mysql
import Harness.Postgres as Postgres
import Harness.Sql
import Harness.Sqlserver as Sqlserver
import Harness.State (State)
import Harness.Yaml
import Test.Hspec
import Prelude
--------------------------------------------------------------------------------
-- Preamble
spec :: SpecWith State
spec =
Feature.feature
Feature.Feature
{ Feature.backends =
[ Feature.Backend
{ name = "MySQL",
setup = mysqlSetup,
teardown = mysqlTeardown
},
Feature.Backend
{ name = "PostgreSQL",
setup = postgresSetup,
teardown = postgresTeardown
},
Feature.Backend
{ name = "Citus",
setup = citusSetup,
teardown = citusTeardown
},
Feature.Backend
{ name = "SQLServer",
setup = sqlserverSetup,
teardown = sqlserverTeardown
}
],
Feature.tests = tests
}
--------------------------------------------------------------------------------
-- MySQL backend
mysqlSetup :: State -> IO ()
mysqlSetup state = do
-- Clear and reconfigure the metadata
GraphqlEngine.post_
state
"/v1/metadata"
[yaml|
type: replace_metadata
args:
version: 3
sources:
- name: mysql
kind: mysql
tables: []
configuration:
database: *mysqlDatabase
user: *mysqlUser
password: *mysqlPassword
host: *mysqlHost
port: *mysqlPort
pool_settings: {}
|]
-- Setup tables
Mysql.run_
[sql|
CREATE TABLE hasura.author
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(45) UNIQUE KEY
);
|]
Mysql.run_
[sql|
INSERT INTO hasura.author
(name)
VALUES
( 'Author 1'),
( 'Author 2');
|]
-- Track the tables
GraphqlEngine.post_
state
"/v1/metadata"
[yaml|
type: mysql_track_table
args:
source: mysql
table:
schema: hasura
name: author
|]
mysqlTeardown :: State -> IO ()
mysqlTeardown _ = do
Mysql.run_
[sql|
DROP TABLE hasura.author;
|]
--------------------------------------------------------------------------------
-- PostgreSQL backend
postgresSetup :: State -> IO ()
postgresSetup state = do
-- Clear and reconfigure the metadata
GraphqlEngine.post_
state
"/v1/metadata"
[yaml|
type: replace_metadata
args:
version: 3
sources:
- name: postgres
kind: postgres
tables: []
configuration:
connection_info:
database_url: *postgresqlConnectionString
pool_settings: {}
|]
-- Setup tables
Postgres.run_
[sql|
CREATE TABLE hasura.author
(
id SERIAL PRIMARY KEY,
name VARCHAR(45) UNIQUE
);
|]
Postgres.run_
[sql|
INSERT INTO hasura.author
(name)
VALUES
( 'Author 1'),
( 'Author 2');
|]
-- Track the tables
GraphqlEngine.post_
state
"/v1/metadata"
[yaml|
type: postgres_track_table
args:
source: postgres
table:
schema: hasura
name: author
|]
postgresTeardown :: State -> IO ()
postgresTeardown _ = do
Postgres.run_
[sql|
DROP TABLE hasura.author;
|]
--------------------------------------------------------------------------------
-- Citus backend
citusSetup :: State -> IO ()
citusSetup state = do
-- Clear and reconfigure the metadata
GraphqlEngine.post_
state
"/v1/metadata"
[yaml|
type: replace_metadata
args:
version: 3
sources:
- name: citus
kind: citus
tables: []
configuration:
connection_info:
database_url: *citusConnectionString
pool_settings: {}
|]
-- Setup tables
Citus.run_
[sql|
CREATE TABLE hasura.author
(
id SERIAL PRIMARY KEY,
name VARCHAR(45) UNIQUE
);
|]
Citus.run_
[sql|
INSERT INTO hasura.author
(name)
VALUES
( 'Author 1'),
( 'Author 2');
|]
-- Track the tables
GraphqlEngine.post_
state
"/v1/metadata"
[yaml|
type: citus_track_table
args:
source: citus
table:
schema: hasura
name: author
|]
citusTeardown :: State -> IO ()
citusTeardown _ = do
Citus.run_
[sql|
DROP TABLE IF EXISTS hasura.author;
|]
--------------------------------------------------------------------------------
-- SQL Server backend
sqlserverSetup :: State -> IO ()
sqlserverSetup state = do
-- Clear and reconfigure the metadata
GraphqlEngine.post_
state
"/v1/metadata"
[yaml|
type: replace_metadata
args:
version: 3
sources:
- name: mssql
kind: mssql
tables: []
configuration:
connection_info:
database_url: *sqlserverConnectInfo
pool_settings: {}
|]
-- Setup tables
Sqlserver.run_
[sql|
CREATE TABLE hasura.author
(
id INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
name NVARCHAR(45) NOT NULL UNIQUE NONCLUSTERED
);
|]
Sqlserver.run_
[sql|
INSERT INTO hasura.author
(name)
VALUES
('Author 1'),
('Author 2');
|]
-- Track the tables
GraphqlEngine.post_
state
"/v1/metadata"
[yaml|
type: mssql_track_table
args:
source: mssql
table:
schema: hasura
name: author
|]
sqlserverTeardown :: State -> IO ()
sqlserverTeardown _ = do
Sqlserver.run_
[sql|
DROP TABLE hasura.author;
|]
--------------------------------------------------------------------------------
-- Tests
tests :: SpecWith State
tests = do
it "Author fields" $ \state ->
shouldReturnYaml
( GraphqlEngine.postGraphql
state
[graphql|
query {
hasura_author {
name
id
}
}
|]
)
[yaml|
data:
hasura_author:
- name: Author 1
id: 1
- name: Author 2
id: 2
|]
it "Use operationName" $ \state ->
shouldReturnYaml
( GraphqlEngine.postGraphqlYaml
state
[yaml|
operationName: chooseThisOne
query: |
query ignoreThisOne {
MyQuery {
name
}
}
query chooseThisOne {
hasura_author {
id
name
}
}
|]
)
[yaml|
data:
hasura_author:
- name: Author 1
id: 1
- name: Author 2
id: 2
|]
it "Missing field" $ \state -> do
shouldReturnYaml
( GraphqlEngine.postGraphql
state
[graphql|
query {
hasura_author {
id
name
notPresentCol
}
}
|]
)
[yaml|
errors:
- extensions:
code: validation-failed
path: $.selectionSet.hasura_author.selectionSet.notPresentCol
message: |-
field "notPresentCol" not found in type: 'hasura_author'
|]
it "Missing table" $ \state ->
shouldReturnYaml
( GraphqlEngine.postGraphql
state
[graphql|
query {
random {
id
name
}
}
|]
)
[yaml|
errors:
- extensions:
code: validation-failed
path: $.selectionSet.random
message: |-
field "random" not found in type: 'query_root'
|]