2021-11-19 18:13:33 +03:00
{- # LANGUAGE QuasiQuotes # -}
{- # LANGUAGE RecordWildCards # -}
-- | Testing object relationships.
2022-01-21 10:48:27 +03:00
module Test.ObjectRelationshipsSpec ( spec ) where
2021-11-19 18:13:33 +03:00
2022-01-21 10:48:27 +03:00
import Harness.Backend.Mysql as Mysql
2021-11-19 18:13:33 +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
2021-11-23 21:15:17 +03:00
import Harness.State ( State )
2022-01-21 10:48:27 +03:00
import Harness.Test.Feature qualified as Feature
2021-11-19 18:13:33 +03:00
import Test.Hspec
import Prelude
--------------------------------------------------------------------------------
-- Preamble
2021-11-23 21:15:17 +03:00
spec :: SpecWith State
2021-11-19 18:13:33 +03:00
spec =
Feature . feature
Feature . Feature
{ Feature . backends =
[ Feature . Backend
{ name = " MySQL " ,
setup = mysqlSetup ,
2022-02-09 18:26:14 +03:00
teardown = mysqlTeardown ,
backendOptions = Feature . defaultBackendOptions
2021-11-19 18:13:33 +03:00
}
] ,
Feature . tests = tests
}
--------------------------------------------------------------------------------
-- MySQL backend
2021-11-23 21:15:17 +03:00
mysqlSetup :: State -> IO ()
mysqlSetup state = do
2021-11-19 18:13:33 +03:00
-- Clear and reconfigure the metadata
2022-01-25 19:34:29 +03:00
GraphqlEngine . setSource state Mysql . defaultSourceMetadata
2021-11-19 18:13:33 +03:00
-- Setup tables
Mysql . run_
[ sql |
CREATE TABLE author
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
2022-01-07 20:51:42 +03:00
name VARCHAR ( 45 ) UNIQUE KEY ,
createdAt DATETIME
2021-11-19 18:13:33 +03:00
) ;
| ]
Mysql . run_
[ sql |
INSERT INTO author
2022-01-07 20:51:42 +03:00
( name , createdAt )
2021-11-19 18:13:33 +03:00
VALUES
2022-01-07 20:51:42 +03:00
( 'Author 1 ' , ' 2017 - 09 - 21 09 : 39 : 44 ' ) ,
( 'Author 2 ' , ' 2017 - 09 - 21 09 : 50 : 44 ' ) ;
2021-11-19 18:13:33 +03:00
| ]
-- 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_
2021-11-23 21:15:17 +03:00
state
2021-11-19 18:13:33 +03:00
" /v1/metadata "
[ yaml |
type : mysql_track_table
args :
source : mysql
table :
schema : hasura
name : author
| ]
GraphqlEngine . post_
2021-11-23 21:15:17 +03:00
state
2021-11-19 18:13:33 +03:00
" /v1/metadata "
[ yaml |
type : mysql_track_table
args :
source : mysql
table :
schema : hasura
name : article
| ]
-- Setup relationships
GraphqlEngine . post_
2021-11-23 21:15:17 +03:00
state
2021-11-19 18:13:33 +03:00
" /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
| ]
2021-11-23 21:15:17 +03:00
mysqlTeardown :: State -> IO ()
mysqlTeardown _ = do
2021-11-19 18:13:33 +03:00
Mysql . run_
[ sql |
DROP TABLE article ;
| ]
Mysql . run_
[ sql |
DROP TABLE author ;
| ]
--------------------------------------------------------------------------------
-- Tests
2022-02-09 18:26:14 +03:00
tests :: Feature . BackendOptions -> SpecWith State
tests opts = do
2021-11-23 21:15:17 +03:00
it " Author of article where id=1 " $ \ state ->
2021-11-19 18:13:33 +03:00
shouldReturnYaml
2022-02-09 18:26:14 +03:00
opts
2021-11-19 18:13:33 +03:00
( GraphqlEngine . postGraphql
2021-11-23 21:15:17 +03:00
state
2021-11-19 18:13:33 +03:00
[ graphql |
query {
hasura_article ( where : { id : { _eq : 1 } } ) {
id
author {
id
}
}
}
| ]
)
[ yaml |
data :
hasura_article :
- id : 1
author :
id : 1
| ]
2022-01-07 20:51:42 +03:00
-- originally from <https://github.com/hasura/graphql-engine-mono/blob/cf64da26e818ca0e4ec39667296c67021bc03c2a/server/tests-py/queries/graphql_query/mysql/select_query_author_quoted_col.yaml>
it " Simple GraphQL object query on author " $ \ 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_author {
createdAt
name
id
}
}
| ]
)
-- I believe that the order is not necessarily guaranteed, but
-- the Python test was written like this. We can't use
-- limit/order here without requiring that new backends
-- implement those too. Approach: hope that ordering is never
-- violated, and if it is, rework this test.
[ yaml |
data :
hasura_author :
- createdAt : ' 2 0 1 7 - 0 9 - 2 1 0 9 : 3 9 : 4 4'
name : Author 1
id : 1
- createdAt : ' 2 0 1 7 - 0 9 - 2 1 0 9 : 5 0 : 4 4'
name : Author 2
id : 2
| ]