cleveland-0.3.0: test/TestSuite/Cleveland/ViewCall.hs
-- SPDX-FileCopyrightText: 2022 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA
-- | Views are tested mainly in lorentz-test, but here we check everything at
-- least works in simple scenarios.
module TestSuite.Cleveland.ViewCall
( test_RequesterContract
, test_ViewCall
, test_UnsafeViewCall
) where
import Lorentz
import Prelude hiding (drop, some, swap, take, view)
import Test.Tasty (TestTree)
import Morley.Michelson.Untyped (pattern ValueUnit)
import Test.Cleveland
import Test.Cleveland.Lorentz
import Test.Cleveland.Lorentz.Requester
import Test.Cleveland.Michelson.Import (testTreesWithUntypedContract)
import TestSuite.Util
import TestSuite.Util.Contracts (inContractsDir)
type Views = ViewsList
[ "add" ?:: Natural >-> Natural
, "id" ?:: Natural >-> (Natural, ())
, "fail" ?:: MText >-> Never
]
viewedContract :: Contract Never () Views
viewedContract = $$(embedContract $ inContractsDir "view_example.tz")
test_RequesterContract :: TestTree
test_RequesterContract = testScenario "Views can be called via requester contract" $ scenario do
viewed <- originate "viewed" () viewedContract
clarifyErrors "Calling view 'add'" do
requester <- originate "requester" [] (contractRequester @"add" viewed)
forM_ [5, 10] $ transfer requester . calling def
getStorage requester @@== [11, 6]
clarifyErrors "Calling view 'fail'" do
requester <- originate "requester" [] (contractRequester @"fail" viewed)
transfer requester (calling def [mt|nyan|])
& expectFailedWith [mt|nyan|]
clarifyErrors "Calling view 'id'" do
requester <- originate "requester" [] (contractRequester @"id" viewed)
forM_ [5, 0] $ transfer requester . calling def
getStorage requester @@== [(0, ()), (5, ())]
test_ViewCall :: TestTree
test_ViewCall = testScenario "Views can be called directly" $ scenario do
viewed <- originate "viewed" () viewedContract
clarifyErrors "Calling view 'add'" do
forM [5, 10] (callView viewed #add) @@== [6, 11]
clarifyErrors "Calling view 'fail'" do
callView viewed #fail [mt|nyan|]
& expectFailedWith [mt|nyan|]
clarifyErrors "Calling view 'id'" do
forM [5, 0] (callView viewed #id) @@== [(5, ()), (0, ())]
test_UnsafeViewCall :: IO [TestTree]
test_UnsafeViewCall = testTreesWithUntypedContract (inContractsDir "view_example.tz") \ct ->
pure $ pure $ testScenario "Views can be called directly" $ scenario do
viewed <- originate "viewed" ValueUnit ct
clarifyErrors "Calling view 'add'" do
forM [5 :: Natural, 10] (unsafeCallView @Natural viewed #add) @@== [6, 11]
clarifyErrors "Calling view 'fail'" do
unsafeCallView @Never viewed #fail [mt|nyan|]
& expectFailedWith [mt|nyan|]
clarifyErrors "Calling view 'id'" do
forM [5 :: Natural, 0] (unsafeCallView @(Natural, ()) viewed #id) @@== [(5, ()), (0, ())]
clarifyErrors "Calling view 'nonexistent' which doesn't exist" do
unsafeCallView @Never viewed #nonexistent ()
& shouldFailWithMessage "Failed to call view nonexistent"
clarifyErrors "Calling view 'id' with incorrect types" do
unsafeCallView @Never viewed #id ()
& shouldFailWithMessage "Failed to call view id"