2424import com .openelements .hiero .base .protocol .data .TokenCreateResult ;
2525import com .openelements .hiero .base .protocol .data .TokenTransferRequest ;
2626import com .openelements .hiero .base .protocol .data .TokenTransferResult ;
27+ import com .openelements .hiero .base .protocol .data .TokenMintResult ;
28+ import com .openelements .hiero .base .protocol .data .TokenMintRequest ;
2729import java .util .List ;
2830import java .util .Set ;
2931import org .junit .jupiter .api .Assertions ;
@@ -42,6 +44,7 @@ public class NftClientImplTest {
4244 ArgumentCaptor <TokenBurnRequest > tokenBurnCaptor = ArgumentCaptor .forClass (TokenBurnRequest .class );
4345 ArgumentCaptor <TokenAssociateRequest > tokenAssociateCaptor = ArgumentCaptor .forClass (TokenAssociateRequest .class );
4446 ArgumentCaptor <TokenDissociateRequest > tokenDissociateCaptor = ArgumentCaptor .forClass (TokenDissociateRequest .class );
47+ ArgumentCaptor <TokenMintRequest > tokenMintCaptor = ArgumentCaptor .forClass (TokenMintRequest .class );
4548
4649 @ BeforeEach
4750 public void setup () {
@@ -627,4 +630,238 @@ void testDissociateNftWithMultipleTokenThrowExceptionIfListEmpty() {
627630 () -> nftClientImpl .dissociateNft (List .of (), accountId , accountKey ));
628631 Assertions .assertEquals ("tokenIds must not be empty" , e .getMessage ());
629632 }
633+
634+ @ Test
635+ void testMintNft () throws HieroException {
636+ final TokenMintResult tokenMintResult = Mockito .mock (TokenMintResult .class );
637+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
638+
639+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
640+ final byte [] metadata = "Hello Hiero" .getBytes ();
641+
642+ when (operationalAccount .privateKey ()).thenReturn (supplyKey );
643+ when (protocolLayerClient .executeMintTokenTransaction (any (TokenMintRequest .class )))
644+ .thenReturn (tokenMintResult );
645+ when (tokenMintResult .serials ()).thenReturn (List .of (1L ));
646+
647+ final long result = nftClientImpl .mintNft (tokenId , metadata );
648+
649+ verify (operationalAccount , times (1 )).privateKey ();
650+ verify (protocolLayerClient , times (1 ))
651+ .executeMintTokenTransaction (tokenMintCaptor .capture ());
652+
653+ final TokenMintRequest capture = tokenMintCaptor .getValue ();
654+
655+ Assertions .assertEquals (supplyKey , capture .supplyKey ());
656+ Assertions .assertEquals (tokenId , capture .tokenId ());
657+ Assertions .assertEquals (List .of (metadata ), capture .metadata ());
658+
659+ Assertions .assertEquals (1L , result );
660+ }
661+
662+ @ Test
663+ void testMintNftWithSupplyKey () throws HieroException {
664+ final TokenMintResult tokenMintResult = Mockito .mock (TokenMintResult .class );
665+
666+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
667+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
668+ final byte [] metadata = "Hello Hiero" .getBytes ();
669+
670+ when (protocolLayerClient .executeMintTokenTransaction (any (TokenMintRequest .class )))
671+ .thenReturn (tokenMintResult );
672+ when (tokenMintResult .serials ()).thenReturn (List .of (1L ));
673+
674+ final long result = nftClientImpl .mintNft (tokenId , supplyKey , metadata );
675+
676+ verify (protocolLayerClient , times (1 ))
677+ .executeMintTokenTransaction (tokenMintCaptor .capture ());
678+
679+ final TokenMintRequest capture = tokenMintCaptor .getValue ();
680+
681+ Assertions .assertEquals (supplyKey , capture .supplyKey ());
682+ Assertions .assertEquals (tokenId , capture .tokenId ());
683+ Assertions .assertEquals (List .of (metadata ), capture .metadata ());
684+
685+ Assertions .assertEquals (1L , result );
686+ }
687+
688+ @ Test
689+ void testMintNftThrowExceptionIfMetadataGreaterThenMaxLen () {
690+ final String message = "each metadata entry must be less than 100 bytes" ;
691+
692+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
693+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
694+ final byte [] metadata = new byte [101 ];
695+
696+ when (operationalAccount .privateKey ()).thenReturn (supplyKey );
697+
698+ final IllegalArgumentException e1 = Assertions .assertThrows (
699+ IllegalArgumentException .class ,
700+ () -> nftClientImpl .mintNft (tokenId , metadata )
701+ );
702+ final IllegalArgumentException e2 = Assertions .assertThrows (
703+ IllegalArgumentException .class ,
704+ () -> nftClientImpl .mintNft (tokenId , supplyKey , metadata )
705+ );
706+
707+ Assertions .assertEquals (message , e1 .getMessage ());
708+ Assertions .assertEquals (message , e2 .getMessage ());
709+ }
710+
711+ @ Test
712+ void testMintNftThrowExceptionForInvalidId () throws HieroException {
713+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
714+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
715+ final byte [] metadata = "Hello Hiero" .getBytes ();
716+
717+ when (operationalAccount .privateKey ()).thenReturn (supplyKey );
718+ when (protocolLayerClient .executeMintTokenTransaction (any (TokenMintRequest .class )))
719+ .thenThrow (new HieroException ("Failed to execute transaction of type TokenTransferTransaction" ));
720+
721+ Assertions .assertThrows (HieroException .class , () -> nftClientImpl .mintNft (tokenId , metadata ));
722+ Assertions .assertThrows (HieroException .class , () -> nftClientImpl .mintNft (tokenId , supplyKey , metadata ));
723+ }
724+
725+ @ Test
726+ void testMintNftThrowExceptionForNullValue () {
727+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
728+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
729+ final byte [] metadata = "Hello Hiero" .getBytes ();
730+
731+ Assertions .assertThrows (NullPointerException .class , () -> nftClientImpl .mintNft ((TokenId ) null , metadata ));
732+ Assertions .assertThrows (NullPointerException .class , () -> nftClientImpl .mintNft (tokenId , null ));
733+
734+ Assertions .assertThrows (
735+ NullPointerException .class ,
736+ () -> nftClientImpl .mintNft ((TokenId ) null , supplyKey , metadata )
737+ );
738+ Assertions .assertThrows (
739+ NullPointerException .class ,
740+ () -> nftClientImpl .mintNft (tokenId , null , metadata )
741+ );
742+ Assertions .assertThrows (
743+ NullPointerException .class ,
744+ () -> nftClientImpl .mintNft (tokenId , supplyKey , null )
745+ );
746+ }
747+
748+ @ Test
749+ void testMintNfts () throws HieroException {
750+ final List <Long > serials = List .of (1L , 2L );
751+ final TokenMintResult tokenMintResult = Mockito .mock (TokenMintResult .class );
752+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
753+
754+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
755+ final byte [] metadata1 = "Hello Hiero1" .getBytes ();
756+ final byte [] metadata2 = "Hello Hiero2" .getBytes ();
757+
758+ when (operationalAccount .privateKey ()).thenReturn (supplyKey );
759+ when (protocolLayerClient .executeMintTokenTransaction (any (TokenMintRequest .class )))
760+ .thenReturn (tokenMintResult );
761+ when (tokenMintResult .serials ()).thenReturn (serials );
762+
763+ final List <Long > result = nftClientImpl .mintNfts (tokenId , metadata1 , metadata2 );
764+
765+ verify (operationalAccount , times (1 )).privateKey ();
766+ verify (protocolLayerClient , times (1 ))
767+ .executeMintTokenTransaction (tokenMintCaptor .capture ());
768+
769+ final TokenMintRequest capture = tokenMintCaptor .getValue ();
770+
771+ Assertions .assertEquals (supplyKey , capture .supplyKey ());
772+ Assertions .assertEquals (tokenId , capture .tokenId ());
773+ Assertions .assertEquals (List .of (metadata1 , metadata2 ), capture .metadata ());
774+
775+ Assertions .assertEquals (serials , result );
776+ }
777+
778+ @ Test
779+ void testMintNftsWithSupplyKey () throws HieroException {
780+ final List <Long > serials = List .of (1L , 2L );
781+ final TokenMintResult tokenMintResult = Mockito .mock (TokenMintResult .class );
782+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
783+
784+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
785+ final byte [] metadata1 = "Hello Hiero1" .getBytes ();
786+ final byte [] metadata2 = "Hello Hiero2" .getBytes ();
787+
788+ when (protocolLayerClient .executeMintTokenTransaction (any (TokenMintRequest .class )))
789+ .thenReturn (tokenMintResult );
790+ when (tokenMintResult .serials ()).thenReturn (serials );
791+
792+ final List <Long > result = nftClientImpl .mintNfts (tokenId , supplyKey , metadata1 , metadata2 );
793+
794+ verify (protocolLayerClient , times (1 ))
795+ .executeMintTokenTransaction (tokenMintCaptor .capture ());
796+
797+ final TokenMintRequest capture = tokenMintCaptor .getValue ();
798+
799+ Assertions .assertEquals (supplyKey , capture .supplyKey ());
800+ Assertions .assertEquals (tokenId , capture .tokenId ());
801+ Assertions .assertEquals (List .of (metadata1 , metadata2 ), capture .metadata ());
802+
803+ Assertions .assertEquals (serials , result );
804+ }
805+
806+ @ Test
807+ void testMintNftsThrowExceptionIfMetadataGreaterThenMaxLen () {
808+ final String message = "each metadata entry must be less than 100 bytes" ;
809+
810+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
811+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
812+ final byte [] metadata1 = new byte [101 ];
813+ final byte [] metadata2 = "Hello Hiero" .getBytes ();
814+
815+ when (operationalAccount .privateKey ()).thenReturn (supplyKey );
816+
817+ final IllegalArgumentException e1 = Assertions .assertThrows (
818+ IllegalArgumentException .class ,
819+ () -> nftClientImpl .mintNfts (tokenId , metadata1 , metadata2 )
820+ );
821+ final IllegalArgumentException e2 = Assertions .assertThrows (
822+ IllegalArgumentException .class ,
823+ () -> nftClientImpl .mintNfts (tokenId , supplyKey , metadata1 , metadata2 )
824+ );
825+
826+ Assertions .assertEquals (message , e1 .getMessage ());
827+ Assertions .assertEquals (message , e2 .getMessage ());
828+ }
829+
830+ @ Test
831+ void testMintNftsThrowExceptionForInvalidId () throws HieroException {
832+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
833+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
834+ final byte [] metadata1 = "Hello Hiero1" .getBytes ();
835+ final byte [] metadata2 = "Hello Hiero2" .getBytes ();
836+
837+ when (operationalAccount .privateKey ()).thenReturn (supplyKey );
838+ when (protocolLayerClient .executeMintTokenTransaction (any (TokenMintRequest .class )))
839+ .thenThrow (new HieroException ("Failed to execute transaction of type TokenTransferTransaction" ));
840+
841+ Assertions .assertThrows (HieroException .class , () -> nftClientImpl .mintNfts (tokenId , metadata1 , metadata2 ));
842+ Assertions .assertThrows (HieroException .class , () -> nftClientImpl .mintNfts (tokenId , supplyKey , metadata1 , metadata2 ));
843+ }
844+
845+ @ Test
846+ void testMintNftsThrowExceptionForNullValue () {
847+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
848+ final TokenId tokenId = TokenId .fromString ("1.2.3" );
849+ final byte [] metadata = "Hello Hiero" .getBytes ();
850+
851+ Assertions .assertThrows (NullPointerException .class , () -> nftClientImpl .mintNfts ((TokenId ) null , metadata ));
852+ Assertions .assertThrows (NullPointerException .class , () -> nftClientImpl .mintNfts (tokenId , null ));
853+
854+ Assertions .assertThrows (
855+ NullPointerException .class ,
856+ () -> nftClientImpl .mintNfts ((TokenId ) null , supplyKey , null )
857+ );
858+ Assertions .assertThrows (
859+ NullPointerException .class ,
860+ () -> nftClientImpl .mintNfts (tokenId , (PrivateKey ) null , metadata )
861+ );
862+ Assertions .assertThrows (
863+ NullPointerException .class ,
864+ () -> nftClientImpl .mintNfts (tokenId , supplyKey , null )
865+ );
866+ }
630867}
0 commit comments