packages feed

couchdb-enumerator-0.3.5: test/Database/CouchDB/Enumerator/Test/Generic.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}


-- | Generic tests. For tests make database "testcouchdbenum"
module Database.CouchDB.Enumerator.Test.Generic where

import Test.Framework (testGroup, Test)
import Test.Framework.Providers.HUnit (testCase)
import Test.HUnit (Assertion, (@=?))

import Control.Monad.IO.Class (liftIO)

import Data.Data (Typeable, Data)
import Data.ByteString (ByteString)
import qualified Data.Text as T
import Data.Text.Encoding

import Data.Aeson
import qualified Data.Enumerator.List as EL
import           Data.Enumerator hiding (map, mapM)

import Database.CouchDB.Enumerator
import qualified Database.CouchDB.Enumerator.Generic as CG

tests :: Test
tests = testGroup "Generic" [
      testCase "Put and Get" case_forsed,
      testCase "Iter View" case_view,
      testCase "Strict View" case_viewConsume
    ]

-- | View value
data DumpV = DumpV {rev :: String} deriving (Show, Eq, Data, Typeable)
    
data SimpleDoc = SimpleDoc {
    simpleFoo :: Int,
    simpleBar :: Int,
    simpleStr :: ByteString
} deriving (Show, Eq, Data, Typeable)

case_forsed :: Assertion
case_forsed = runCouch "localhost" 5984 "test_cdbe_gen" $ do
    couchPutDb ""
    _ <- CG.couchPut' "gen_doc" [] $ genDoc 0 
    CG.CouchDoc _ _ r <- CG.couchGet "gen_doc" [] 
    liftIO $ r @=? genDoc 0
    couchDeleteDb ""
    return ()

case_view :: Assertion
case_view = runCouch "localhost" 5984 "test_cdbe_gen_view" $ do
    couchPutDb ""
    couchPut_ "_design/dataviews" [] viewObj
    mapM_ (\n -> CG.couchPut' (show n) [] $ genDoc n) ([1..5] :: [Int])
    r <- run_ $ couchView "dataviews/_view/my" [] 
            $= extractViewValue $= CG.parseGeneric $$ EL.consume
    mapM_ (\(ex, f) -> liftIO $ ex @=? f) 
            $ zip r $ map genDoc ([1..5] :: [Int])
    couchDeleteDb ""

case_viewConsume :: Assertion
case_viewConsume = runCouch "localhost" 5984 "test_cdbe_gen_view" $ do
    couchPutDb ""
    couchPut_ "_design/dataviews" [] viewObj
    mapM_ (\n -> CG.couchPut' (show n) [] $ genDoc n) ([1..5] :: [Int])
    r <- CG.consumeView "dataviews/_view/my" [] 
    mapM_ (\(ex, f) -> liftIO $ ex @=? f) 
            $ zip r $ map genDoc ([1..5] :: [Int])
    couchDeleteDb ""

viewObj :: Value
viewObj = object 
    [ "language" .= ("javascript" :: T.Text)
    , "views" .= object [ "my"  .= object
        [ "map" .= ("function(doc) {emit(null, doc); }" :: T.Text) ]
    ] ]

genDoc :: Int -> SimpleDoc
genDoc n = SimpleDoc n n $ encodeUtf8 "И проч"