diff --git a/test/Unit/PgQuerySpec.hs b/test/Unit/PgQuerySpec.hs index 2224aa281..30c647d3d 100644 --- a/test/Unit/PgQuerySpec.hs +++ b/test/Unit/PgQuerySpec.hs @@ -4,18 +4,46 @@ module Unit.PgQuerySpec where import Test.Hspec -import Database.HDBC (toSql, quickQuery) +import Database.HDBC (IConnection, SqlValue, toSql, prepare, execute, + SqlError, seState, fetchAllRowsAL) import PgQuery (insert) -import Types (SqlRow(..)) +import Types (SqlRow(SqlRow)) +import TestTypes (fromList, incStr, incNullableStr, incInsert, incId) +import Data.Map (toList) +import Data.Text(pack) -import SpecHelper +import SpecHelper(dbWithSchema) + +quickALQuery :: IConnection conn => conn -> String -> [SqlValue] -> IO [[(String, SqlValue)]] +quickALQuery conn q bind = do + sth <- prepare conn q + _ <- execute sth bind + fetchAllRowsAL sth spec :: Spec spec = around dbWithSchema $ do describe "insert" $ - it "can insert into an empty table" $ \conn -> do - _ <- insert 1 "auto_incrementing_pk" (SqlRow [ - ("non_nullable_string", toSql ("a string"::String))]) conn - r <- quickQuery conn "select count(1) from \"1\".auto_incrementing_pk" [] - [[toSql (1 :: Int)]] `shouldBe` r + describe "with an auto-increment key" $ do + it "inserts and responds with a full object description" $ \conn -> do + r <- insert 1 "auto_incrementing_pk" (SqlRow [ + ("non_nullable_string", toSql ("a string"::String))]) conn + let returnRow = fromList . toList $ r + incStr returnRow `shouldBe` "a string" + incNullableStr returnRow `shouldBe` Nothing + incInsert returnRow `shouldSatisfy` not . null + incId returnRow `shouldSatisfy` (>= 0) + tRows <- quickALQuery conn "select * from \"1\".auto_incrementing_pk" [] + [returnRow] `shouldBe` map fromList tRows + + it "throws an exception if the PK is not unique" $ \conn -> do + r <- insert 1 "auto_incrementing_pk" (SqlRow [ + ("non_nullable_string", toSql ("a string"::String))]) conn + let row = SqlRow . map (\(k, v) -> (pack k, v)) . toList $ r + insert 1 "auto_incrementing_pk" row conn `shouldThrow` \e -> + seState e == "23505" -- uniqueness violation code + + it "throws an exception if a required value is missing" $ \conn -> do + insert 1 "auto_incrementing_pk" (SqlRow [ + ("nullable_string", toSql ("a string"::String))]) conn + `shouldThrow` \e -> seState e == "23502"