module Main where import Main.Prelude hiding (assert, isRight, isLeft) import Test.QuickCheck.Instances import Test.Tasty import qualified Main.Queries as Queries import qualified Test.Tasty.HUnit as HUnit import qualified Test.Tasty.SmallCheck as SmallCheck import qualified Test.Tasty.QuickCheck as QuickCheck import qualified Test.QuickCheck as QuickCheck import qualified Main.DSL as DSL import qualified Hasql.Query as Query import qualified Hasql.Encoding as Encoding import qualified Hasql.Decoding as Decoding main = defaultMain tree tree = testGroup "All tests" [ HUnit.testCase "Enum" $ HUnit.assertEqual "" (Right "ok") $ let actual = unsafePerformIO $ DSL.session $ do let query = Query.Query sql mempty Decoding.unit True where sql = "drop type if exists mood" in DSL.query () query let query = Query.Query sql mempty Decoding.unit True where sql = "create type mood as enum ('sad', 'ok', 'happy')" in DSL.query () query let query = Query.Query sql encoder decoder True where sql = "select ($1 :: mood)" decoder = (Decoding.singleRow (Decoding.value (Decoding.enum (Just . id)))) encoder = Encoding.value (Encoding.enum id) in DSL.query "ok" query in actual , HUnit.testCase "The same prepared statement used on different types" $ HUnit.assertEqual "" (Right ("ok", 1)) $ let actual = unsafePerformIO $ DSL.session $ do let effect1 = DSL.query "ok" query where query = Query.Query sql encoder decoder True where sql = "select $1" encoder = Encoding.value Encoding.text decoder = (Decoding.singleRow (Decoding.value (Decoding.text))) effect2 = DSL.query 1 query where query = Query.Query sql encoder decoder True where sql = "select $1" encoder = Encoding.value Encoding.int8 decoder = (Decoding.singleRow (Decoding.value Decoding.int8)) in (,) <$> effect1 <*> effect2 in actual , HUnit.testCase "Affected rows counting" $ HUnit.assertEqual "" (Right 100) $ let actual = unsafePerformIO $ DSL.session $ do dropTable createTable replicateM_ 100 insertRow deleteRows <* dropTable where dropTable = DSL.query () $ Queries.plain $ "drop table if exists a" createTable = DSL.query () $ Queries.plain $ "create table a (id bigserial not null, name varchar not null, primary key (id))" insertRow = DSL.query () $ Queries.plain $ "insert into a (name) values ('a')" deleteRows = DSL.query () $ Query.Query sql def decoder False where sql = "delete from a" decoder = Decoding.rowsAffected in actual , HUnit.testCase "Result of an auto-incremented column" $ let actualIO = DSL.session $ do DSL.query () $ Queries.plain $ "drop table if exists a" DSL.query () $ Queries.plain $ "create table a (id serial not null, v char not null, primary key (id))" id1 <- DSL.query () $ Query.Query "insert into a (v) values ('a') returning id" def (Decoding.singleRow (Decoding.value Decoding.int4)) False id2 <- DSL.query () $ Query.Query "insert into a (v) values ('b') returning id" def (Decoding.singleRow (Decoding.value Decoding.int4)) False DSL.query () $ Queries.plain $ "drop table if exists a" pure (id1, id2) in HUnit.assertEqual "" (Right (1, 2)) =<< actualIO , HUnit.testCase "List decoding" $ let actualIO = DSL.session $ DSL.query () $ Queries.selectList in HUnit.assertEqual "" (Right [(1, 2), (3, 4), (5, 6)]) =<< actualIO ]