packages feed

grapesy-1.2.2: test-grapesy/Test/Sanity/CBOR.hs

{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Sanity.CBOR (tests) where

import Codec.Serialise (serialise)
import Data.Either (isLeft)
import Test.Tasty
import Test.Tasty.HUnit

import Network.GRPC.Client (rpc)
import Network.GRPC.Client.StreamType.IO qualified as Client
import Network.GRPC.Common
import Network.GRPC.Common.CBOR
import Network.GRPC.Server.StreamType qualified as Server

import Test.Driver.ClientServer

type Sum = CborRpc "calculator" "sum"

type instance Input  Sum = [Int]
type instance Output Sum = Int

type instance RequestMetadata          Sum = NoMetadata
type instance ResponseInitialMetadata  Sum = NoMetadata
type instance ResponseTrailingMetadata Sum = NoMetadata

tests :: TestTree
tests = testGroup "Test.Sanity.CBOR" [
      testCase "sum"           test_sum
    , testCase "trailingBytes" test_trailingBytes
    ]

test_sum :: IO ()
test_sum = testClientServer $ ClientServerTest {
      config = def
    , client = simpleTestClient $ \conn -> do
        resp <- Client.nonStreaming conn (rpc @Sum) [1 .. 100]
        assertEqual "" 5050 resp
    , server = [
          Server.fromMethod @Sum $ Server.mkNonStreaming $ return . sum
        ]
    }

test_trailingBytes :: IO ()
test_trailingBytes = do
    let input  = serialise [1, 2 :: Int]
        output = serialise (3 :: Int)
    assertEqual "" (Right [1, 2]) $
      rpcDeserializeInput (Proxy @Sum) input
    assertEqual "" (Right 3) $
      rpcDeserializeOutput (Proxy @Sum) output
    assertBool "" $ isLeft $
      rpcDeserializeInput (Proxy @Sum) (input <> output)
    assertBool "" $ isLeft $
      rpcDeserializeOutput (Proxy @Sum) (output <> input)