public void OnNonFungibleTokenReceived_Owner_Sell_Token_Success()
        {
            SetupMessage(creator, 0);
            SetupBlock(1);
            var store = new NFTAuctionStore(mContractState.Object);

            SetupMessage(tokenContract, 0);
            SetupGetOwnerOfToken(TransferResult.Succeed(contract));
            
            var parameters = new AuctionParam { StartingPrice = 100, Duration = duration };

            var paramBytes = Array.Empty<byte>();

            mSerializer.Setup(s => s.ToStruct<AuctionParam>(paramBytes)).Returns(parameters);

            store.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, paramBytes)
                 .Should()
                 .BeTrue();

            store.GetAuctionInfo(tokenContract, tokenId)
                 .Should()
                 .Be(new AuctionInfo { Seller = tokenOwner, EndBlock = 101, StartingPrice = 100 });

            VerifyLog(new AuctionStartedLog
            {
                Contract = tokenContract,
                TokenId = tokenId,
                startingPrice = 100,
                Seller = tokenOwner,
                EndBlock = 101
            });

        }
        public void OnNonFungibleTokenReceived_Sending_Coins_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTAuctionStore(mContractState.Object);

            SetupMessage(tokenContract, 10);

            var parameters = new AuctionParam { StartingPrice = 100, Duration = duration };
            
            var paramBytes = Array.Empty<byte>();

            mSerializer.Setup(s => s.ToStruct<AuctionParam>(paramBytes)).Returns(parameters);

            store.Invoking(s => s.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, paramBytes))
                 .Should()
                 .Throw<SmartContractAssertException>()
                 .WithMessage("The method is not payable.");
        }
        public void OnNonFungibleTokenReceived_GetOwner_Call_Raise_Exception_Fails()
        {
            SetupMessage(creator, 0);

            var store = new NFTAuctionStore(mContractState.Object);

            SetupGetOwnerOfToken(TransferResult.Failed());
            SetupMessage(tokenContract, 0);

            var parameters = new AuctionParam { StartingPrice = 100, Duration = duration };

            var paramBytes = Array.Empty<byte>();

            mSerializer.Setup(s => s.ToStruct<AuctionParam>(paramBytes)).Returns(parameters);

            store.Invoking(s => s.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, paramBytes))
                 .Should()
                 .Throw<SmartContractAssertException>()
                 .WithMessage("GetOwner method call failed.");
        }
        public void OnNonFungibleTokenReceived_Selling_Already_OnSale_Token_Fails()
        {
            SetupMessage(creator, 0);
            SetupBlock(1);
            var store = new NFTAuctionStore(mContractState.Object);

            SetupMessage(tokenContract, 0);
            SetupGetOwnerOfToken(TransferResult.Succeed(contract));
            
            var parameters = new AuctionParam { StartingPrice = 100, Duration = duration };

            var paramBytes = Array.Empty<byte>();

            mSerializer.Setup(s => s.ToStruct<AuctionParam>(paramBytes)).Returns(parameters);

            store.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, paramBytes);

            store.Invoking(s => s.OnNonFungibleTokenReceived(tokenOwner, tokenOwner, tokenId, paramBytes))
                 .Should()
                 .Throw<SmartContractAssertException>()
                 .WithMessage("The token is already on sale.");
        }