packages feed

cleveland-0.1.2: test/TestSuite/Cleveland/PrefixNetworkScenario.hs

-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

module TestSuite.Cleveland.PrefixNetworkScenario
  ( test_PrefixNetworkScenario
  , test_newAddress_with_prefix
  ) where

import Data.Fixed (Nano)
import Data.Text (takeEnd)
import Data.Time.Clock.POSIX (getPOSIXTime)
import System.IO.Temp (withSystemTempDirectory)
import Test.Tasty (TestTree)
import Test.Tasty.HUnit (testCase, (@=?))

import Morley.Client qualified as Client
import Morley.Client.TezosClient.Types (tceAliasPrefixL, tceMbTezosClientDataDirL)
import Morley.Tezos.Crypto (SecretKey, detSecretKey)
import Test.Cleveland
import Test.Cleveland.Internal.Abstract (Moneybag(Moneybag), moneybagL)
import Test.Cleveland.Internal.Client
  (neMoneybagAliasL, neMorleyClientEnvL, neSecretKeyL, runClevelandT)
import Test.Cleveland.Tasty (modifyNetworkEnv, setAliasPrefix, whenNetworkEnabled)

aliasName :: Client.Alias
aliasName = Client.mkAlias "testMoneybagAlias"

aliasPrefix :: Text
aliasPrefix = "testPrefix"

mangleNetworkEnv :: SecretKey -> TestTree -> TestTree
mangleNetworkEnv sk = modifyNetworkEnv $
    (neMorleyClientEnvL . Client.mceTezosClientL . tceAliasPrefixL .~ Just aliasPrefix)
  . (neSecretKeyL .~ Just sk)
  . (neMoneybagAliasL .~ aliasName)

setTmpDir :: FilePath -> NetworkEnv -> NetworkEnv
setTmpDir dir = neMorleyClientEnvL . Client.mceTezosClientL . tceMbTezosClientDataDirL .~ Just dir

test_PrefixNetworkScenario :: IO TestTree
test_PrefixNetworkScenario = do
  -- use 7 digits of the current POSIX time in nanoseconds to generate seed
  -- this ensures we test for a fresh key more often than not
  -- taking 7 digits ensures that we're generating Ed25519 key.
  seed <- encodeUtf8 . takeEnd 7 . show @Text . realToFrac @_ @Nano <$> getPOSIXTime
  let key = detSecretKey seed
  pure $ mangleNetworkEnv key $ whenNetworkEnabled $ \withEnv ->
    testCase "Moneybag alias is not affected by alias prefix" $ withEnv $ \env' ->
      -- NB: we can't have 'withSystemTempDirectory' outside the test because
      -- the outer IO action finishes before the test itself is run.
      -- hence we have to change the tmpdir in env inside the test too
      withSystemTempDirectory "tezos-client" \tmpdir -> do
        let env = setTmpDir tmpdir env'
        Moneybag moneybagAddress <- runClevelandT env $ view moneybagL

        actualAlias <- Client.runMorleyClientM (neMorleyClientEnv env) $
          Client.getAlias $ Client.AddressResolved moneybagAddress
        actualAlias @=? aliasName

test_newAddress_with_prefix :: TestTree
test_newAddress_with_prefix =
  setAliasPrefix "prefix" $
    testScenario "`newAddress` prepends alias prefix to alias hint" $ scenario do
      addr1 <- newAddress "alias"
      addr2 <- resolveAddress "alias"

      addr1 @== addr2