packages feed

OrchestrateDB-1.0.0.1: examples/Test.hs

{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes        #-}
{-# LANGUAGE TypeFamilies      #-}

module Main where

import           Control.Monad
import           Data.Aeson
import           Data.Aeson.Types
import           Data.Maybe
import           GHC.Generics
import qualified Database.Orchestrate   as DB
import           System.Exit      (exitFailure)
import           System.Random

data TestRecord = TestRecord
    { string :: String
    , number :: Int
    } deriving (Show,Read,Generic,Eq)

instance FromJSON TestRecord
instance ToJSON TestRecord

reachTest :: Integer -> IO ()
reachTest number = do
  putStrLn $ "Completed test number " ++ show number

main :: IO ()
main = do
  configTxt <- readFile "examples/config.txt"
  randomNumber <- randomIO :: IO Integer
  let config = read configTxt :: (String,String)
  let dbApplication = DB.createStdApplication "TestApp" (fst config)
  let dbCollection = DB.createStdCollection (snd config)
  let testRecord1 = TestRecord {string = "You may delay, but time will not.(Benjamin Franklin)",number = 903}
  let testRecord2 = TestRecord {string = "Two things are infinite: the universe and human stupidity; and I am not sure about the universe.(Albert Einstein)",number = 913}
  res1 <- DB.validateApplication dbApplication
  unless res1 exitFailure
  reachTest 1
  let testKey = "hello-world" ++ show randomNumber
  res2 <- DB.orchestrateCollectionPut dbApplication dbCollection testKey testRecord1
  unless res2 exitFailure
  reachTest 2
  res3 <- DB.orchestrateCollectionPut dbApplication dbCollection "irrelevant" testRecord1
  unless res3 exitFailure
  reachTest 3
  res4 <- DB.orchestrateCollectionPutWithoutKey dbApplication dbCollection testRecord2
  unless res4 exitFailure
  reachTest 4
  shouldBeTestRecord1Maybe <- DB.orchestrateCollectionGet dbApplication dbCollection testKey :: IO (Maybe TestRecord)
  let shouldBeTestRecord1 = fromJust shouldBeTestRecord1Maybe
  unless (shouldBeTestRecord1 == testRecord1) exitFailure
  reachTest 5
  res5 <- DB.orchestrateCollectionDeleteKey dbApplication dbCollection "irrelevant"
  unless res5 exitFailure
  reachTest 6
  res6Maybe <- DB.orchestrateCollectionSearch dbApplication dbCollection "You may delay,"
  let (res6,hasNextPage) = fromJust res6Maybe
  unless (checkIfResSixIsCorrect res6) exitFailure
  reachTest 7
  res7Maybe <- DB.orchestrateCollectionList dbApplication dbCollection 100
  let res7 = fromJust res7Maybe
  unless (res7 /= []) exitFailure
  reachTest 8

checkIfResSixIsCorrect :: [Object] -> Bool
checkIfResSixIsCorrect (first:rest) = do
  let num = flip parseMaybe first $ \obj -> obj .: "number" :: Parser Int
  isJust num &&
    (if fromJust num == 903 then checkIfResSixIsCorrect rest else
       False)

checkIfResSixIsCorrect [] = True