graphql-engine/server/tests-hspec/ObjectRelationshipsSpec.hs

170 lines
2.9 KiB
Haskell
Raw Normal View History

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
-- | Testing object relationships.
module ObjectRelationshipsSpec (spec) where
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.Sql
import Harness.Yaml
import Test.Hspec
import Prelude
--------------------------------------------------------------------------------
-- Preamble
spec :: Spec
spec =
Feature.feature
Feature.Feature
{ Feature.backends =
[ Feature.Backend
{ name = "MySQL",
setup = mysqlSetup,
teardown = mysqlTeardown
}
],
Feature.tests = tests
}
--------------------------------------------------------------------------------
-- MySQL backend
mysqlSetup :: IO ()
mysqlSetup = do
-- Clear and reconfigure the metadata
GraphqlEngine.post_
"/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 author
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(45) UNIQUE KEY
);
|]
Mysql.run_
[sql|
INSERT INTO author
(name)
VALUES
( 'Author 1'),
( 'Author 2');
|]
-- Setup tables
Mysql.run_
[sql|
CREATE TABLE article (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
author_id INT UNSIGNED,
FOREIGN KEY (author_id) REFERENCES author(id)
);
|]
Mysql.run_
[sql|
INSERT INTO article
(author_id)
VALUES
( 1 ),
( 1 ),
( 2 );
|]
-- Track the tables
GraphqlEngine.post_
"/v1/metadata"
[yaml|
type: mysql_track_table
args:
source: mysql
table:
schema: hasura
name: author
|]
GraphqlEngine.post_
"/v1/metadata"
[yaml|
type: mysql_track_table
args:
source: mysql
table:
schema: hasura
name: article
|]
-- Setup relationships
GraphqlEngine.post_
"/v1/metadata"
[yaml|
type: mysql_create_object_relationship
args:
source: mysql
table:
name: article
schema: hasura
name: author
using:
foreign_key_constraint_on: author_id
|]
mysqlTeardown :: IO ()
mysqlTeardown = do
Mysql.run_
[sql|
DROP TABLE article;
|]
Mysql.run_
[sql|
DROP TABLE author;
|]
--------------------------------------------------------------------------------
-- Tests
tests :: Spec
tests = do
it "Author of article where id=1" $
shouldReturnYaml
( GraphqlEngine.postGraphql
[graphql|
query {
hasura_article(where: {id: {_eq: 1}}) {
id
author {
id
}
}
}
|]
)
[yaml|
data:
hasura_article:
- id: 1
author:
id: 1
|]