From bf232b99f9d9badb32a1a4530c9e16c1df1186ec Mon Sep 17 00:00:00 2001 From: Manish Dait Date: Mon, 3 Feb 2025 15:21:28 +0530 Subject: [PATCH] Implemented test for transferNft() Signed-off-by: Manish Dait --- .../hiero/base/test/NftClientImplTest.java | 111 ++++++++++++++++++ .../hiero/spring/test/NftClientTests.java | 15 +++ 2 files changed, 126 insertions(+) diff --git a/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/NftClientImplTest.java b/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/NftClientImplTest.java index ee031492..07dd96db 100644 --- a/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/NftClientImplTest.java +++ b/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/NftClientImplTest.java @@ -9,6 +9,9 @@ import com.openelements.hiero.base.protocol.ProtocolLayerClient; import com.openelements.hiero.base.protocol.TokenCreateRequest; import com.openelements.hiero.base.protocol.TokenCreateResult; +import com.openelements.hiero.base.protocol.TokenTransferRequest; +import com.openelements.hiero.base.protocol.TokenTransferResult; +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,6 +30,7 @@ public class NftClientImplTest { NftClientImpl nftClientImpl; ArgumentCaptor tokenRequestCaptor = ArgumentCaptor.forClass(TokenCreateRequest.class); + ArgumentCaptor tokenTransferCaptor = ArgumentCaptor.forClass(TokenTransferRequest.class); @BeforeEach public void setup() { @@ -202,4 +206,111 @@ void testCreateNftForNullParam() { () -> nftClientImpl.createNftType(null, null, null, null, (PrivateKey) null) ); } + + @Test + void testTransferNft() throws HieroException { + // mock + final TokenTransferResult tokenTransferResult = Mockito.mock(TokenTransferResult.class); + + // given + final TokenId tokenId = TokenId.fromString("1.2.3"); + final long serialNumber = 1L; + final AccountId fromAccount = AccountId.fromString("1.2.3"); + final AccountId toAccount = AccountId.fromString("4.5.6"); + final PrivateKey fromAccountKey = PrivateKey.generateECDSA(); + + // when + when(protocolLayerClient.executeTransferTransaction(any(TokenTransferRequest.class))) + .thenReturn(tokenTransferResult); + nftClientImpl.transferNft(tokenId, serialNumber, fromAccount, fromAccountKey, toAccount); + + // then + verify(protocolLayerClient, times(1)) + .executeTransferTransaction(tokenTransferCaptor.capture()); + + final TokenTransferRequest request = tokenTransferCaptor.getValue(); + Assertions.assertEquals(tokenId, request.tokenId()); + Assertions.assertEquals(List.of(serialNumber), request.serials()); + Assertions.assertEquals(fromAccount, request.sender()); + Assertions.assertEquals(toAccount, request.receiver()); + Assertions.assertEquals(fromAccountKey, request.senderKey()); + } + + @Test + void testTransferNfts() throws HieroException { + // mock + final TokenTransferResult tokenTransferResult = Mockito.mock(TokenTransferResult.class); + + // given + final TokenId tokenId = TokenId.fromString("1.2.3"); + final List serialNumbers = List.of(1L, 2L); + final AccountId fromAccount = AccountId.fromString("1.2.3"); + final AccountId toAccount = AccountId.fromString("4.5.6"); + final PrivateKey fromAccountKey = PrivateKey.generateECDSA(); + + // when + when(protocolLayerClient.executeTransferTransaction(any(TokenTransferRequest.class))) + .thenReturn(tokenTransferResult); + nftClientImpl.transferNfts(tokenId, serialNumbers, fromAccount, fromAccountKey, toAccount); + + // then + verify(protocolLayerClient, times(1)) + .executeTransferTransaction(tokenTransferCaptor.capture()); + + final TokenTransferRequest request = tokenTransferCaptor.getValue(); + Assertions.assertEquals(tokenId, request.tokenId()); + Assertions.assertEquals(serialNumbers, request.serials()); + Assertions.assertEquals(fromAccount, request.sender()); + Assertions.assertEquals(toAccount, request.receiver()); + Assertions.assertEquals(fromAccountKey, request.senderKey()); + } + + @Test + void testTransferNftThrowsExceptionForInvalidTokenId() throws HieroException { + //given + final TokenId tokenId = TokenId.fromString("1.2.3"); + final AccountId fromAccount = AccountId.fromString("1.2.3"); + final AccountId toAccount = AccountId.fromString("4.5.6"); + final PrivateKey fromAccountKey = PrivateKey.generateECDSA(); + final long serial = 1L; + + //when + when(protocolLayerClient.executeTransferTransaction(any(TokenTransferRequest.class))) + .thenThrow(new HieroException("Failed to execute transaction of type TokenTransferTransaction")); + + //then + Assertions.assertThrows(HieroException.class, () -> nftClientImpl.transferNft(tokenId, serial, + fromAccount, fromAccountKey, toAccount)); + } + + @Test + void testTransferNftThrowsExceptionForInvalidSerial() { + final String e1Message = "serial must be positive"; + final String e2Message = "either amount or serial must be provided"; + + //given + final TokenId tokenId = TokenId.fromString("1.2.3"); + final AccountId fromAccount = AccountId.fromString("1.2.3"); + final AccountId toAccount = AccountId.fromString("4.5.6"); + final PrivateKey fromAccountKey = PrivateKey.generateECDSA(); + final long serial = -1L; + + IllegalArgumentException e1 = Assertions.assertThrows(IllegalArgumentException.class, + () -> nftClientImpl.transferNft(tokenId, serial, fromAccount, fromAccountKey, toAccount)); + Assertions.assertEquals(e1Message, e1.getMessage()); + + IllegalArgumentException e2 = Assertions.assertThrows(IllegalArgumentException.class, + () -> nftClientImpl.transferNfts(tokenId, List.of(), fromAccount, fromAccountKey, toAccount)); + Assertions.assertEquals(e2Message, e2.getMessage()); + } + + @Test + void testTransferNftNullParams() { + Assertions.assertThrows(NullPointerException.class, + () -> nftClientImpl.transferNft(null, 1L, null, + null, null)); + Assertions.assertThrows(NullPointerException.class, + () -> nftClientImpl.transferNfts(null, null, null, + null, null)); + } } diff --git a/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/NftClientTests.java b/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/NftClientTests.java index 926c2d0a..e8d6bb34 100644 --- a/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/NftClientTests.java +++ b/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/NftClientTests.java @@ -3,6 +3,7 @@ import com.hedera.hashgraph.sdk.AccountId; import com.hedera.hashgraph.sdk.PrivateKey; import com.hedera.hashgraph.sdk.TokenId; +import com.openelements.hiero.base.HieroException; import com.openelements.hiero.base.data.Account; import com.openelements.hiero.base.AccountClient; import com.openelements.hiero.base.NftClient; @@ -118,6 +119,20 @@ void transferNft() throws Exception { }); } + @Test + void transferNftThrowsExceptionForInvalidTokenId() throws Exception { + //given + final TokenId tokenId = TokenId.fromString("1.2.3"); + final Account treasuryAccount = accountClient.createAccount(1); + final Account userAccount = accountClient.createAccount(1); + final long serial = 1L; + //then + Assertions.assertThrows(HieroException.class, () -> nftClient.transferNft(tokenId, serial, + treasuryAccount.accountId(), treasuryAccount.privateKey(), userAccount.accountId())); + Assertions.assertThrows(HieroException.class, () -> nftClient.transferNfts(tokenId, List.of(serial), + treasuryAccount.accountId(), treasuryAccount.privateKey(), userAccount.accountId())); + } + @Test void mintNftByNewUserAndTransferByAnotherUser() throws Exception { //given