{-# LANGUAGE OverloadedStrings #-}
module Test.ColumnSpec (columnSpec) where
import Database.ClickHouseDriver
( ClickhouseType(CKNull, CKTuple, CKArray, CKInt8, CKInt16,
CKString),
defaultClient,
insertMany,
query )
import Test.Hspec
( hspec, describe, it, parallel, runIO, shouldBe, Spec )
import Data.Vector (fromList)
columnSpec :: IO()
columnSpec = hspec $ parallel $ do
stringAndIntSpec
arraySpec
tupleAndEnumSpec
lowCardinalitySpec
--ipAndDateSpec
--aggregateFunctionSpec
uuidSpec
--nullableSpec
stringAndIntSpec :: Spec
stringAndIntSpec = describe "test string and int columns" $ do
conn <- runIO $ defaultClient
runIO $ query conn ("CREATE TABLE IF NOT EXISTS str_and_int_suite " ++
"(`str` String, `int` Int16, `fix` FixedString(3))" ++ "ENGINE = Memory")
runIO $ Database.ClickHouseDriver.insertMany conn "INSERT INTO str_and_int_suite VALUES"
[
[CKString "teststr1", CKInt16 323, CKString "abc"],
[CKString "teststr2", CKInt16 456 ,CKString "axy"],
[CKString "teststr2", CKInt16 220, CKString "ffa"]
]
q <- runIO $ query conn "SELECT * FROM str_and_int_suite"
it "returns query result in standard format" $ do
show q `shouldBe` "[[CKString \"teststr1\", CKInt16 323, CKString \"abc\"]," ++
"[CKString \"teststr2\", CKInt16 456 ,CKString \"axy\"],[CKString \"teststr2\"," ++
"CKInt16 220, CKString \"ffa\"]]"
arraySpec :: Spec
arraySpec = describe "test array" $ do
conn <- runIO $ defaultClient
runIO $ query conn ("CREATE TABLE IF NOT EXISTS array_suite " ++
"(`id` Int8, `arr` Array(String))" ++ "ENGINE = Memory")
runIO $ Database.ClickHouseDriver.insertMany conn "INSERT INTO array_suite VALUES"
[
[CKInt8 1, CKArray $ fromList [CKString "Clickhouse", CKString "Test1"]],
[CKInt8 2, CKArray $ fromList [CKString "Clickhouse", CKString "Test2"]],
[CKInt8 3, CKArray $ fromList [CKString "Clickhouse", CKString "Test3"]]
]
q <- runIO $ query conn "SELECT * FROM array_suite"
it "returns query result in standard format" $ do
show q `shouldBe` (show $ ([
[CKInt8 1, CKArray $ fromList [CKString "Clickhouse", CKString "Test1"]],
[CKInt8 2, CKArray $ fromList [CKString "Clickhouse", CKString "Test2"]],
[CKInt8 3, CKArray $ fromList [CKString "Clickhouse", CKString "Test3"]]
]))
tupleAndEnumSpec :: Spec
tupleAndEnumSpec = describe "tuple and enum test" $ do
conn <- runIO $ defaultClient
runIO $ query conn ("CREATE TABLE IF NOT EXISTS tuple_enum_suite " ++
"(`id` Int8, `tup` Tuple(Int8, String), `enum` Enum('hello' = 1, 'world' = 2))" ++ "ENGINE = Memory")
runIO $ Database.ClickHouseDriver.insertMany conn "INSERT INTO tuple_enum_suite VALUES"
[
[CKInt8 1, CKTuple $ fromList [CKInt8 11, CKString "Test1"], CKString "hello"],
[CKInt8 2, CKTuple $ fromList [CKInt8 12, CKString "Test2"], CKString "world"],
[CKInt8 3, CKTuple $ fromList [CKInt8 13, CKString "Test3"], CKString "hello"]
]
q <- runIO $ query conn "SELECT * FROM tuple_enum_suite"
it "returns query result in standard format" $ do
show q `shouldBe` (show $ ([
[CKInt8 1, CKTuple $ fromList [CKInt8 11, CKString "Test1"], CKString "hello"],
[CKInt8 2, CKTuple $ fromList [CKInt8 12, CKString "Test2"], CKString "world"],
[CKInt8 3, CKTuple $ fromList [CKInt8 13, CKString "Test3"], CKString "hello"]
]))
lowCardinalitySpec :: Spec
lowCardinalitySpec = describe "lowcardinality type test" $ do
conn <- runIO $ defaultClient
runIO $ query conn ("CREATE TABLE IF NOT EXISTS lowcardinality_suite " ++
"(`id` Int8, `lowstr` LowCardinality(String))" ++ "ENGINE = Memory")
runIO $ Database.ClickHouseDriver.insertMany conn "INSERT INTO lowcardinality_suite VALUES"
[
[CKInt8 1, CKString "Clickhouse", CKInt8 123],
[CKInt8 2, CKString "driver", CKInt8 123],
[CKInt8 3, CKString "Clickhouse", CKInt8 120]
]
q <- runIO $ query conn "SELECT * FROM lowcardinality_suite"
it "returns query result in standard format" $ do
show q `shouldBe` "[[CKInt8 1, CKString \"Clickhouse\"]," ++
"[CKInt8 2, CKString \"driver\",]," ++
"[CKInt8 3, CKString \"Clickhouse\"]]"
ipAndDateSpec :: Spec
ipAndDateSpec = undefined
aggregateFunctionSpec :: Spec
aggregateFunctionSpec = undefined
uuidSpec :: Spec
uuidSpec = describe "uuid test" $ do
conn <- runIO $ defaultClient
runIO $ query conn ("CREATE TABLE IF NOT EXISTS uuid_suite " ++
"(`id` Int8, `uuid` UUID)" ++ "ENGINE = Memory")
runIO $ Database.ClickHouseDriver.insertMany conn "INSERT INTO uuid_suite VALUES"
[
[CKInt8 1, CKString "123e4567-e89b-12d3-a456-426614174000"],
[CKInt8 2, CKString "123e4567-e89b-12d3-a456-426614174000"],
[CKInt8 3, CKString "123e4567-e89b-12d3-a456-426614174000"]
]
q <- runIO $ query conn "SELECT * FROM uuid_suite"
it "returns query result in standard format" $ do
show q `shouldBe` "[[CKInt8 1,CKString \"123e4567-e89b-12d3-a456-426614174000\"]," ++
"[CKInt8 2,CKString \"123e4567-e89b-12d3-a456-426614174000\"]," ++
"[CKInt8 3,CKString \"123e4567-e89b-12d3-a456-426614174000\"]]"
nullableSpec :: Spec
nullableSpec = describe "nullable type test" $ do
conn <- runIO $ defaultClient
runIO $ query conn ("CREATE TABLE IF NOT EXISTS nullable_suite " ++
"(`id` Int8, `nullableStr` Nullable(String), `nullableInt` Nullable(Int16), `nullableArr` Array(Nullable(Int16)))" ++ "ENGINE = Memory")
runIO $ Database.ClickHouseDriver.insertMany conn "INSERT INTO nullable_suie VALUES"
[
[CKInt8 1, CKString "string", CKNull, CKArray $ fromList [CKNull, CKNull, CKInt16 155]],
[CKInt8 2, CKNull, CKInt16 1100, CKArray $ fromList [CKNull,CKInt16 110, CKNull]],
[CKInt8 3, CKString "string", CKNull, CKArray $ fromList [CKInt16 220, CKInt16 110, CKNull]]
]
q <- runIO $ query conn "SELECT * FROM nullable_suite"
it "returns query result in standard format" $ do
show q `shouldBe` "[[CKInt8 1, CKString \"17ddc5d-e556-4d27-95dd-a34d84e46a50\"]," ++
"[CKInt8 2, CKString \"17ddc5d-0000-4d27-95dd-a34d84e46a50\"]," ++
"[CKInt8 3, CKString \"17ddc5d-e556-4d27-0000-a34d84e46a50\"]]"