2021-11-19 18:13:33 +03:00
{- # LANGUAGE QuasiQuotes # -}
{- # LANGUAGE RecordWildCards # -}
-- | Tests for limit/offset.
2022-01-21 10:48:27 +03:00
module Test.LimitOffsetSpec ( 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.Constants
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 ,
teardown = mysqlTeardown
}
] ,
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
GraphqlEngine . post_
2021-11-23 21:15:17 +03:00
state
2021-11-19 18:13:33 +03:00
" /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 ' ) ,
( 'Author 3 ' ) ,
( 'Author 4 ' ) ;
| ]
-- 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
| ]
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 author ;
| ]
--------------------------------------------------------------------------------
-- Tests
2021-11-23 21:15:17 +03:00
tests :: SpecWith State
2021-11-19 18:13:33 +03:00
tests = do
2021-11-23 21:15:17 +03:00
it " limit 1 " $ \ state ->
2021-11-19 18:13:33 +03:00
shouldReturnYaml
( GraphqlEngine . postGraphql
2021-11-23 21:15:17 +03:00
state
2021-11-19 18:13:33 +03:00
[ graphql |
query {
hasura_author ( limit : 1 ) {
name
id
}
}
| ]
)
[ yaml |
data :
hasura_author :
- name : Author 1
id : 1
| ]
2022-01-07 20:51:42 +03:00
-- Originally from <https://github.com/hasura/graphql-engine-mono/blob/719d03bd970def443e25d04210a37556d350d84b/server/tests-py/queries/graphql_query/mysql/select_query_author_offset.yaml>
--
-- Technically without an ORDER, the results are UB-ish. Keep an eye
-- on ordering with tests like this.
it " Basic offset query " $ \ state ->
shouldReturnYaml
( GraphqlEngine . postGraphql
state
[ graphql |
query {
hasura_author ( offset : 1 ) {
name
id
}
}
| ]
)
[ yaml |
data :
hasura_author :
- name : Author 2
id : 2
- name : Author 3
id : 3
- name : Author 4
id : 4
| ]
-- This is a more precise version of <https://github.com/hasura/graphql-engine-mono/blob/dbf32f15c25c12fba88afced311fd876111cb987/server/tests-py/queries/graphql_query/mysql/select_query_author_limit_offset.yaml#L1>
--
-- We use ordering here, which yields a stable result.
2021-11-23 21:15:17 +03:00
it " order descending, offset 2, limit 1 " $ \ state ->
2021-11-19 18:13:33 +03:00
shouldReturnYaml
( GraphqlEngine . postGraphql
2021-11-23 21:15:17 +03:00
state
2021-11-19 18:13:33 +03:00
[ graphql |
query {
hasura_author ( limit : 1 , offset : 2 , order_by : { id : desc } ) {
id
name
}
}
| ]
)
[ yaml |
data :
hasura_author :
- id : 2
name : Author 2
| ]