{-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} module NutLink where import Data.Aeson (Value (..), eitherDecode, object, (.=)) import Data.Text (Text) import qualified Data.Vector import Test.Hspec import Test.Tasty.Hspec import Text.RawString.QQ import Blockfrost.Types spec_nutlink :: Spec spec_nutlink = do it "parses nutlink address sample" $ do eitherDecode nutlinkAddressSample `shouldBe` Right nutlinkAddressExpected it "parses nutlink address tickers sample" $ do eitherDecode nutlinkAddressTickersSample `shouldBe` Right nutlinkAddressTickersExpected it "parses nutlink ticker sample" $ do eitherDecode nutlinkTickerSample `shouldBe` Right nutlinkTickerExpected it "parses nutlink ticker with address sample" $ do eitherDecode nutlinkTickerWithAddressSample `shouldBe` Right nutlinkTickerWithAddressExpected nutlinkAddressSample = [r| { "address": "addr1qxqs59lphg8g6qndelq8xwqn60ag3aeyfcp33c2kdp46a09re5df3pzwwmyq946axfcejy5n4x0y99wqpgtp2gd0k09qsgy6pz", "metadata_url": "https://nut.link/metadata.json", "metadata_hash": "6bf124f217d0e5a0a8adb1dbd8540e1334280d49ab861127868339f43b3948af", "metadata": {} } |] nutlinkAddressExpected = NutlinkAddress { _nutlinkAddressAddress = "addr1qxqs59lphg8g6qndelq8xwqn60ag3aeyfcp33c2kdp46a09re5df3pzwwmyq946axfcejy5n4x0y99wqpgtp2gd0k09qsgy6pz" , _nutlinkAddressMetadataUrl = "https://nut.link/metadata.json" , _nutlinkAddressMetadataHash = "6bf124f217d0e5a0a8adb1dbd8540e1334280d49ab861127868339f43b3948af" , _nutlinkAddressMetadata = pure $ object [] } nutlinkAddressTickersSample = [r| [ { "name": "ADAUSD", "count": 1980038, "latest_block": 2657092 }, { "name": "ADAEUR", "count": 1980038, "latest_block": 2657092 }, { "name": "ADABTC", "count": 1980038, "latest_block": 2657092 } ] |] nutlinkAddressTickersExpected = [ NutlinkAddressTicker { _nutlinkAddressTickerName = "ADAUSD" , _nutlinkAddressTickerCount = 1980038 , _nutlinkAddressTickerLatestBlock = 2657092 } , NutlinkAddressTicker { _nutlinkAddressTickerName = "ADAEUR" , _nutlinkAddressTickerCount = 1980038 , _nutlinkAddressTickerLatestBlock = 2657092 } , NutlinkAddressTicker { _nutlinkAddressTickerName = "ADABTC" , _nutlinkAddressTickerCount = 1980038 , _nutlinkAddressTickerLatestBlock = 2657092 } ] nutlinkTickerSample = [r| { "tx_hash": "e8073fd5318ff43eca18a852527166aa8008bee9ee9e891f585612b7e4ba700b", "block_height": 2657092, "tx_index": 8, "payload": [ { "source": "coinGecko", "value": "1.29" }, { "source": "cryptoCompare", "value": "1.283" } ] } |] sampleArray = Array $ Data.Vector.fromList [ object [ "source" .= ("coinGecko" :: Text) , "value" .= ("1.29" :: Text) ] , object [ "source" .= ("cryptoCompare" :: Text), "value" .= ("1.283" :: Text) ] ] nutlinkTickerExpected = NutlinkTicker { _nutlinkTickerTxHash = "e8073fd5318ff43eca18a852527166aa8008bee9ee9e891f585612b7e4ba700b" , _nutlinkTickerBlockHeight = 2657092 , _nutlinkTickerTxIndex = 8 , _nutlinkTickerPayload = sampleArray } nutlinkTickerWithAddressSample = [r| { "address": "addr_test1qpmtp5t0t5y6cqkaz7rfsyrx7mld77kpvksgkwm0p7en7qum7a589n30e80tclzrrnj8qr4qvzj6al0vpgtnmrkkksnqd8upj0", "tx_hash": "e8073fd5318ff43eca18a852527166aa8008bee9ee9e891f585612b7e4ba700b", "block_height": 2657092, "tx_index": 8, "payload": [ { "source": "coinGecko", "value": "1.29" }, { "source": "cryptoCompare", "value": "1.283" } ] } |] nutlinkTickerWithAddressExpected :: (Address, NutlinkTicker) nutlinkTickerWithAddressExpected = ("addr_test1qpmtp5t0t5y6cqkaz7rfsyrx7mld77kpvksgkwm0p7en7qum7a589n30e80tclzrrnj8qr4qvzj6al0vpgtnmrkkksnqd8upj0" , nutlinkTickerExpected)