{-# LANGUAGE TemplateHaskell, QuasiQuotes, OverloadedStrings #-}
{-# LANGUAGE TypeFamilies, EmptyDataDecls, GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Main where
import Database.Zookeeper ()
import Database.Persist
import Database.Persist.Zookeeper
import Database.Persist.Zookeeper.Internal
import Database.Persist.TH
import Language.Haskell.TH.Syntax ()
import Data.Maybe
import Data.Pool ()
import Test.Hspec
let zookeeperSettings = defaultZookeeperSettings
in share [mkPersist zookeeperSettings] [persistLowerCase|
Person
name String
age Int
hoge Int Maybe
PersonU name
deriving Show
deriving Eq
|]
zookeeperConf :: ZookeeperConf
zookeeperConf = ZookeeperConf "localhost:2181" 10000 1 50 30
main :: IO ()
main =
withZookeeperPool zookeeperConf $ \conn -> do
hspec $ do
let key = txtToKey "WyJzVGVzdC9ob2dlIl0="
let val = Person "Test/hoge" 12 Nothing
describe "PersistUnique test" $ do
it "insertUnique" $ do
v <- flip runZookeeperPool conn $ do
deleteBy $ PersonU "Test/hoge"
insertUnique val
v `shouldBe` (Just key)
it "getBy" $ do
v <- flip runZookeeperPool conn $ do
getBy $ PersonU "Test/hoge"
(entityKey (fromJust v)) `shouldBe` key
(entityVal (fromJust v)) `shouldBe` val
v `shouldBe` (Just (Entity key val))
it "deleteBy" $ do
v <- flip runZookeeperPool conn $ do
deleteBy $ PersonU "Test/hoge"
getBy $ PersonU "Test/hoge"
v `shouldBe` Nothing
describe "PersistStore test" $ do
it "StoreTest" $ do
key' <- flip runZookeeperPool conn $ do
insert val
v <- flip runZookeeperPool conn $ do
get key'
print $ show key'
v `shouldBe` (Just val)
v' <- flip runZookeeperPool conn $ do
delete key'
get key'
v' `shouldBe` Nothing
describe "PersistQeuery test" $ do
let check val' filter' expbool = case filterClause val' filter' of
a@(bool,_,_) -> do
print $ show a
bool `shouldBe` expbool
it "FilterTest Filter OR/AND" $ do
check (Person "Test/hoge" 12 Nothing) [FilterOr[]] False
check (Person "Test/hoge" 12 Nothing) [FilterAnd[]] True
it "FilterTest Nothing" $ do
check (Person "Test/hoge" 12 Nothing) [] True
check (Person "Test/hoge" 12 (Just 3)) [] True
check (Person "Test/hoge" 12 Nothing) [] True
it "FilterTestEq" $ do
check (Person "Test/hoge" 12 Nothing) [PersonName ==. ""] False
check (Person "Test/hoge" 12 (Just 3)) [PersonHoge ==. Just 3] True
check (Person "Test/hoge" 12 Nothing) [PersonAge ==. 12] True
it "FilterTestNe" $ do
check (Person "Test/hoge" 12 Nothing) [PersonAge !=. 12] False
check (Person "Test/hoge" 12 Nothing) [PersonAge !=. 11] True
check (Person "Test/hoge" 12 (Just 4)) [PersonHoge !=. Just 4] False
check (Person "Test/hoge" 12 Nothing) [PersonHoge !=. Just 3] True
check (Person "Test/hoge" 12 (Just 4)) [PersonHoge !=. Just 3] True
it "FilterTestLt" $ do
check (Person "Test/hoge" 12 (Just 4)) [PersonHoge <=. Just 3] False
check (Person "Test/hoge" 12 (Just 2)) [PersonHoge <=. Just 3] True
it "StoreTest" $ do
va <- flip runZookeeperPool conn $ do
deleteWhere [PersonName !=. ""]
_ <- insert (Person "hoge0" 1 Nothing)
_ <- insert (Person "hoge1" 2 Nothing)
_ <- insert (Person "hoge2" 3 Nothing)
_ <- insert (Person "hoge3" 4 Nothing)
selectList [PersonAge ==. 2] []
(entityVal (head va)) `shouldBe` (Person "hoge1" 2 Nothing)
[Entity _k v] <- flip runZookeeperPool conn $ do
selectList [PersonName ==. "hoge2"] []
v `shouldBe` (Person "hoge2" 3 Nothing)
[Entity _k v1] <- flip runZookeeperPool conn $ do
updateWhere [PersonName ==. "hoge2"] [PersonAge =. 10]
selectList [PersonName ==. "hoge2"] []
v1 `shouldBe` (Person "hoge2" 10 Nothing)
v2 <- flip runZookeeperPool conn $ do
selectList [PersonName !=. ""] []
length v2 `shouldBe` 4
v3 <- flip runZookeeperPool conn $ do
deleteWhere [PersonName !=. ""]
selectList [PersonName !=. ""] []
length v3 `shouldBe` 0