graphql-engine/server/tests-hspec/Harness/Feature.hs
Chris Done 926da74819 Auto-launch graphql-engine (close hasura/graphql-engine#7801, hasura/graphql-engine#7827 )
Dupe of https://github.com/hasura/graphql-engine-mono/pull/2853 with branch renamed so it doesn't break a tool.

prev pr: https://github.com/hasura/graphql-engine-mono/pull/2911

next pr: https://github.com/hasura/graphql-engine-mono/pull/2922

This implements https://github.com/hasura/graphql-engine/issues/7801

Some points to keep in mind for review:

* How state is passed to the tests. Do we like how this works?
   * I quite like it, with the opaque type [`State`](68f33051ca/server/tests-hspec/Harness/State.hs (L17)), we can avoid churn when adding things.
   * The [setup/teardown](68f33051ca/server/tests-hspec/Spec.hs (L19-L31)) seems clean.
   * By using hspec's own means to pass and denote context, we avoid "getting new ideas" for how to structure the tests -- we use a standard. Hopefully, that means the tests' structure rarely change.
* The various flags passed in the [ServeOptions](68f33051ca/server/tests-hspec/Harness/Constants.hs (L123)) - if there are any causes for concern, raise them here. My thinking is that, there are lots. I've picked some "sane" defaults (mostly empty). The tests pass. I think as we add more complex tests, these flags will be scrutinised and updated as needed. I think it's valuable that all flags are explicitly listed here, though.

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/2921
GitOrigin-RevId: 2c2e70bf784ef571a48509a7e5006fd0f48773b5
2021-11-23 18:16:15 +00:00

50 lines
1.3 KiB
Haskell

-- | Helper functions for easily testing features.
module Harness.Feature
( feature,
Feature (..),
Backend (..),
)
where
import Control.Exception
import Data.Foldable
import Harness.State (State)
import Test.Hspec
import Prelude
-- | Use this record to put together a test against a set of backends.
data Feature = Feature
{ backends :: [Backend],
tests :: SpecWith State
}
-- | A backend specification.
data Backend = Backend
{ -- | Can be any name you want (e.g. "PostgreSQL" or "MySQL v1.2")
-- or whatnot.
name :: String,
-- | To setup the test suite: Run SQL commands, run metadata track
-- tables calls.
setup :: State -> IO (),
-- | Clean up any resources you created in 'setup'.
teardown :: State -> IO ()
}
-- | Test the feature, running the setup before any tests are run, and
-- and ensuring teardown happens after all tests are run.
feature :: Feature -> SpecWith State
feature Feature {backends, tests} =
for_
backends
( \Backend {name, setup, teardown} ->
describe
name
( aroundAllWith
( \actionWith server -> do
setup server
finally (actionWith server) (teardown server)
)
tests
)
)