2022-01-07 20:51:42 +03:00
{- # LANGUAGE QuasiQuotes # -}
{- # LANGUAGE RecordWildCards # -}
-- | Testing nested relationships.
--
2022-01-21 10:48:27 +03:00
-- Original inspiration for this module Test.is <https://github.com/hasura/graphql-engine-mono/blob/08caf7df10cad0aea0916327736147a0a8f808d1/server/tests-py/queries/graphql_query/mysql/nested_select_query_deep.yaml>
module Test.NestedRelationshipsSpec ( spec ) where
2022-01-07 20:51:42 +03:00
2022-01-21 10:48:27 +03:00
import Harness.Backend.Mysql as Mysql
2022-01-07 20:51:42 +03:00
import Harness.GraphqlEngine qualified as GraphqlEngine
2022-01-21 10:48:27 +03:00
import Harness.Quoter.Graphql
import Harness.Quoter.Sql
import Harness.Quoter.Yaml
2022-01-07 20:51:42 +03:00
import Harness.State ( State )
2022-01-21 10:48:27 +03:00
import Harness.Test.Feature qualified as Feature
2022-01-07 20:51:42 +03:00
import Test.Hspec
import Prelude
--------------------------------------------------------------------------------
-- Preamble
spec :: SpecWith State
spec =
2022-02-14 20:24:24 +03:00
Feature . run
[ Feature . Context
{ name = " MySQL " ,
setup = mysqlSetup ,
teardown = mysqlTeardown ,
options = Feature . defaultOptions
}
]
tests
2022-01-07 20:51:42 +03:00
--------------------------------------------------------------------------------
-- MySQL backend
mysqlSetup :: State -> IO ()
mysqlSetup state = do
-- Clear and reconfigure the metadata
2022-01-25 19:34:29 +03:00
GraphqlEngine . setSource state Mysql . defaultSourceMetadata
2022-01-07 20:51:42 +03:00
-- Setup tables
Mysql . run_
[ sql |
CREATE TABLE author
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
name VARCHAR ( 45 ) UNIQUE KEY ,
createdAt DATETIME
) ;
| ]
Mysql . run_
[ sql |
INSERT INTO author
( name , createdAt )
VALUES
( 'Author 1 ' , ' 2017 - 09 - 21 09 : 39 : 44 ' ) ,
( 'Author 2 ' , ' 2017 - 09 - 21 09 : 50 : 44 ' ) ;
| ]
-- Setup tables
Mysql . run_
[ sql |
CREATE TABLE article (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
title TEXT ,
content TEXT ,
is_published BIT ,
published_on TIMESTAMP ,
author_id INT UNSIGNED ,
co_author_id INT UNSIGNED ,
FOREIGN KEY ( author_id ) REFERENCES author ( id ) ,
FOREIGN KEY ( co_author_id ) REFERENCES author ( id )
) ;
| ]
Mysql . run_
[ sql |
INSERT INTO article
( title , content , author_id , is_published )
VALUES
( 'Article 1 ' , ' Sample article content 1 ' , 1 , 0 ) ,
( 'Article 2 ' , ' Sample article content 2 ' , 1 , 1 ) ,
( 'Article 3 ' , ' Sample article content 3 ' , 2 , 1 ) ;
| ]
-- Track the tables
2022-02-14 20:24:24 +03:00
GraphqlEngine . postMetadata_
2022-01-07 20:51:42 +03:00
state
[ yaml |
2022-02-14 20:24:24 +03:00
type : bulk
2022-01-07 20:51:42 +03:00
args :
2022-02-14 20:24:24 +03:00
- type : mysql_track_table
args :
source : mysql
table :
schema : hasura
name : author
- type : mysql_track_table
args :
source : mysql
table :
schema : hasura
name : article
2022-01-07 20:51:42 +03:00
| ]
-- Setup relationships
2022-02-14 20:24:24 +03:00
GraphqlEngine . postMetadata_
2022-01-07 20:51:42 +03:00
state
[ yaml |
2022-02-14 20:24:24 +03:00
type : bulk
2022-01-07 20:51:42 +03:00
args :
2022-02-14 20:24:24 +03:00
- type : mysql_create_object_relationship
args :
source : mysql
table :
name : article
schema : hasura
2022-01-07 20:51:42 +03:00
name : author
2022-02-14 20:24:24 +03:00
using :
foreign_key_constraint_on : author_id
- type : mysql_create_array_relationship
args :
source : mysql
table :
name : author
schema : hasura
name : articles
using :
foreign_key_constraint_on :
table :
name : article
schema : hasura
column : author_id
2022-01-07 20:51:42 +03:00
| ]
2022-02-14 20:24:24 +03:00
mysqlTeardown :: ( State , () ) -> IO ()
2022-01-07 20:51:42 +03:00
mysqlTeardown _ = do
Mysql . run_
[ sql |
DROP TABLE article ;
| ]
Mysql . run_
[ sql |
DROP TABLE author ;
| ]
--------------------------------------------------------------------------------
-- Tests
2022-02-14 20:24:24 +03:00
tests :: Feature . Options -> SpecWith State
2022-02-09 18:26:14 +03:00
tests opts = do
2022-01-07 20:51:42 +03:00
it " Nested select on article " $ \ state ->
shouldReturnYaml
2022-02-09 18:26:14 +03:00
opts
2022-01-07 20:51:42 +03:00
( GraphqlEngine . postGraphql
state
[ graphql |
query {
hasura_article ( where : { id : { _eq : 1 } } ) {
id
author {
id
articles ( where : { id : { _eq : 1 } } ) {
id
author {
id
articles ( where : { id : { _eq : 1 } } ) {
id
author {
id
}
}
}
}
}
}
}
| ]
)
[ yaml |
data :
hasura_article :
- id : 1
author :
id : 1
articles :
- id : 1
author :
id : 1
articles :
- id : 1
author :
id : 1
| ]