packages feed

grakn-0.3.0: test/Grakn/ClientSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Grakn.ClientSpec
  ( spec
  ) where

import           Data.Aeson      (decode)
import           Grakn           (Value (ValueNumber), label)
import           Grakn.Client
import qualified Servant.Client  as S
import           Test.Hspec
import           Test.QuickCheck (Arbitrary, arbitrary, elements, property)

spec :: Spec
spec = do
  it "The client's keyspace is set correctly" $
    property $ \(BaseUrl u) k ->
      let client = Client {url = u, keyspace = k}
      in keyspace client `shouldBe` k
  it "The client's URI is set correctly" $
    property $ \(BaseUrl u) k ->
      let client = Client {url = u, keyspace = k}
      in url client `shouldBe` u
  it "type can be parsed from JSON" $ do
    let person = Just (label "person")
    let json = "{\"id\": \"V123\", \"label\": \"person\"}"
    let concept =
          Concept
          {cid = "V123", clabel = person, ctype = Nothing, value = Nothing}
    decode json `shouldBe` Just concept
  it "instance can be parsed from JSON" $ do
    let number = Just (label "number")
    let val = Just (ValueNumber 3)
    let json =
          "{\"id\": \"V123\", \"type\": {\"label\": \"number\"}, \"value\": 3}"
    let concept =
          Concept {cid = "V123", clabel = Nothing, ctype = number, value = val}
    decode json `shouldBe` Just concept

newtype BaseUrl =
  BaseUrl S.BaseUrl
  deriving (Show)

instance Arbitrary BaseUrl where
  arbitrary = do
    let scheme = elements [S.Http, S.Https]
    BaseUrl <$> (S.BaseUrl <$> scheme <*> arbitrary <*> arbitrary <*> arbitrary)