99import com .hedera .hashgraph .sdk .PrivateKey ;
1010import com .hedera .hashgraph .sdk .PublicKey ;
1111import com .hedera .hashgraph .sdk .TokenId ;
12+ import com .hedera .hashgraph .sdk .TokenType ;
1213import com .openelements .hiero .base .HieroException ;
1314import com .openelements .hiero .base .data .Account ;
1415import com .openelements .hiero .base .implementation .FungibleTokenClientImpl ;
1516import com .openelements .hiero .base .protocol .ProtocolLayerClient ;
17+ import com .openelements .hiero .base .protocol .data .TokenCreateRequest ;
18+ import com .openelements .hiero .base .protocol .data .TokenCreateResult ;
1619import com .openelements .hiero .base .protocol .data .TokenAssociateRequest ;
1720import com .openelements .hiero .base .protocol .data .TokenAssociateResult ;
1821import com .openelements .hiero .base .protocol .data .TokenDissociateRequest ;
@@ -30,6 +33,7 @@ public class FungibleClientImplTest {
3033 Account operationalAccount ;
3134 FungibleTokenClientImpl fungibleClientImpl ;
3235
36+ ArgumentCaptor <TokenCreateRequest > tokenCreateCaptor = ArgumentCaptor .forClass (TokenCreateRequest .class );
3337 ArgumentCaptor <TokenAssociateRequest > tokenAssociateCaptor = ArgumentCaptor .forClass (TokenAssociateRequest .class );
3438 ArgumentCaptor <TokenDissociateRequest > tokenDissociateCaptor = ArgumentCaptor .forClass (TokenDissociateRequest .class );
3539
@@ -40,6 +44,204 @@ public void setup() {
4044 fungibleClientImpl = new FungibleTokenClientImpl (protocolLayerClient , operationalAccount );
4145 }
4246
47+ @ Test
48+ void testCreateToken () throws HieroException {
49+ final TokenCreateResult tokenCreateResult = Mockito .mock (TokenCreateResult .class );
50+ final AccountId accountId = AccountId .fromString ("1.2.3" );
51+ final PrivateKey privateKey = PrivateKey .generateECDSA ();
52+ final TokenId tokenId = TokenId .fromString ("0.0.1" );
53+
54+ final String name = "TOKEN" ;
55+ final String symbol = "FT" ;
56+
57+ when (operationalAccount .accountId ()).thenReturn (accountId );
58+ when (operationalAccount .privateKey ()).thenReturn (privateKey );
59+ when (protocolLayerClient .executeTokenCreateTransaction (any (TokenCreateRequest .class )))
60+ .thenReturn (tokenCreateResult );
61+ when (tokenCreateResult .tokenId ()).thenReturn (tokenId );
62+
63+ final TokenId result = fungibleClientImpl .createToken (name , symbol );
64+
65+ verify (operationalAccount , times (1 )).accountId ();
66+ verify (operationalAccount , times (2 )).privateKey (); // for supply & treasuryKey
67+ verify (protocolLayerClient , times (1 ))
68+ .executeTokenCreateTransaction (tokenCreateCaptor .capture ());
69+ verify (tokenCreateResult , times (1 )).tokenId ();
70+
71+ final TokenCreateRequest capture = tokenCreateCaptor .getValue ();
72+ Assertions .assertEquals (tokenId , result );
73+ Assertions .assertEquals (accountId , capture .treasuryAccountId ());
74+ Assertions .assertEquals (privateKey , capture .treasuryKey ());
75+ Assertions .assertEquals (privateKey , capture .supplyKey ());
76+ Assertions .assertEquals (name , capture .name ());
77+ Assertions .assertEquals (symbol , capture .symbol ());
78+ Assertions .assertEquals (TokenType .FUNGIBLE_COMMON , capture .tokenType ());
79+ }
80+
81+ @ Test
82+ void testCreateTokenWithSupplyKey () throws HieroException {
83+ final TokenCreateResult tokenCreateResult = Mockito .mock (TokenCreateResult .class );
84+ final AccountId accountId = AccountId .fromString ("1.2.3" );
85+ final PrivateKey privateKey = PrivateKey .generateECDSA ();
86+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
87+ final TokenId tokenId = TokenId .fromString ("0.0.1" );
88+
89+ final String name = "TOKEN" ;
90+ final String symbol = "FT" ;
91+
92+ when (operationalAccount .accountId ()).thenReturn (accountId );
93+ when (operationalAccount .privateKey ()).thenReturn (privateKey );
94+ when (protocolLayerClient .executeTokenCreateTransaction (any (TokenCreateRequest .class )))
95+ .thenReturn (tokenCreateResult );
96+ when (tokenCreateResult .tokenId ()).thenReturn (tokenId );
97+
98+ final TokenId result = fungibleClientImpl .createToken (name , symbol , supplyKey );
99+
100+ verify (operationalAccount , times (1 )).accountId ();
101+ verify (operationalAccount , times (1 )).privateKey ();
102+ verify (protocolLayerClient , times (1 ))
103+ .executeTokenCreateTransaction (tokenCreateCaptor .capture ());
104+ verify (tokenCreateResult , times (1 )).tokenId ();
105+
106+ final TokenCreateRequest capture = tokenCreateCaptor .getValue ();
107+ Assertions .assertEquals (tokenId , result );
108+ Assertions .assertEquals (accountId , capture .treasuryAccountId ());
109+ Assertions .assertEquals (privateKey , capture .treasuryKey ());
110+ Assertions .assertEquals (supplyKey , capture .supplyKey ());
111+ Assertions .assertEquals (name , capture .name ());
112+ Assertions .assertEquals (symbol , capture .symbol ());
113+ Assertions .assertEquals (TokenType .FUNGIBLE_COMMON , capture .tokenType ());
114+ }
115+
116+ @ Test
117+ void testCreateTokenWithAccountIdAndTreasuryKey () throws HieroException {
118+ final TokenCreateResult tokenCreateResult = Mockito .mock (TokenCreateResult .class );
119+ final AccountId treasuryAccountId = AccountId .fromString ("1.2.3" );
120+ final PrivateKey treasuryKey = PrivateKey .generateECDSA ();
121+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
122+ final TokenId tokenId = TokenId .fromString ("0.0.1" );
123+
124+ final String name = "TOKEN" ;
125+ final String symbol = "FT" ;
126+
127+ when (operationalAccount .privateKey ()).thenReturn (supplyKey );
128+ when (protocolLayerClient .executeTokenCreateTransaction (any (TokenCreateRequest .class )))
129+ .thenReturn (tokenCreateResult );
130+ when (tokenCreateResult .tokenId ()).thenReturn (tokenId );
131+
132+ final TokenId result = fungibleClientImpl .createToken (name , symbol , treasuryAccountId , treasuryKey );
133+
134+ verify (operationalAccount , times (1 )).privateKey ();
135+ verify (protocolLayerClient , times (1 ))
136+ .executeTokenCreateTransaction (tokenCreateCaptor .capture ());
137+ verify (tokenCreateResult , times (1 )).tokenId ();
138+
139+ final TokenCreateRequest capture = tokenCreateCaptor .getValue ();
140+ Assertions .assertEquals (tokenId , result );
141+ Assertions .assertEquals (treasuryAccountId , capture .treasuryAccountId ());
142+ Assertions .assertEquals (treasuryKey , capture .treasuryKey ());
143+ Assertions .assertEquals (supplyKey , capture .supplyKey ());
144+ Assertions .assertEquals (name , capture .name ());
145+ Assertions .assertEquals (symbol , capture .symbol ());
146+ Assertions .assertEquals (TokenType .FUNGIBLE_COMMON , capture .tokenType ());
147+ }
148+
149+ @ Test
150+ void testCreateTokenWithAccountIdAndTreasuryKeyAndSupplyKey () throws HieroException {
151+ final TokenCreateResult tokenCreateResult = Mockito .mock (TokenCreateResult .class );
152+ final AccountId treasuryAccountId = AccountId .fromString ("1.2.3" );
153+ final PrivateKey treasuryKey = PrivateKey .generateECDSA ();
154+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
155+ final TokenId tokenId = TokenId .fromString ("0.0.1" );
156+
157+ final String name = "TOKEN" ;
158+ final String symbol = "FT" ;
159+
160+ when (protocolLayerClient .executeTokenCreateTransaction (any (TokenCreateRequest .class )))
161+ .thenReturn (tokenCreateResult );
162+ when (tokenCreateResult .tokenId ()).thenReturn (tokenId );
163+
164+ final TokenId result = fungibleClientImpl .createToken (name , symbol , treasuryAccountId , treasuryKey , supplyKey );
165+
166+ verify (protocolLayerClient , times (1 ))
167+ .executeTokenCreateTransaction (tokenCreateCaptor .capture ());
168+ verify (tokenCreateResult , times (1 )).tokenId ();
169+
170+ final TokenCreateRequest capture = tokenCreateCaptor .getValue ();
171+ Assertions .assertEquals (tokenId , result );
172+ Assertions .assertEquals (treasuryAccountId , capture .treasuryAccountId ());
173+ Assertions .assertEquals (treasuryKey , capture .treasuryKey ());
174+ Assertions .assertEquals (supplyKey , capture .supplyKey ());
175+ Assertions .assertEquals (name , capture .name ());
176+ Assertions .assertEquals (symbol , capture .symbol ());
177+ Assertions .assertEquals (TokenType .FUNGIBLE_COMMON , capture .tokenType ());
178+ }
179+
180+ @ Test
181+ void testCreateTokenThrowExceptionIfSymbolLengthGreaterThanMaxSymbolLen () {
182+ final String message = "Symbol length must be less than or equal to 100" ;
183+
184+ final AccountId accountId = AccountId .fromString ("1.2.3" );
185+ final PrivateKey privateKey = PrivateKey .generateECDSA ();
186+ final PrivateKey supplyKey = PrivateKey .generateECDSA ();
187+
188+ final String name = "TOKEN" ;
189+ final String symbol = new String (new byte [101 ]);
190+
191+ when (operationalAccount .accountId ()).thenReturn (accountId );
192+ when (operationalAccount .privateKey ()).thenReturn (privateKey );
193+
194+ final IllegalArgumentException e1 = Assertions .assertThrows (
195+ IllegalArgumentException .class ,
196+ () -> fungibleClientImpl .createToken (name , symbol )
197+ );
198+ final IllegalArgumentException e2 = Assertions .assertThrows (
199+ IllegalArgumentException .class ,
200+ () -> fungibleClientImpl .createToken (name , symbol , supplyKey )
201+ );
202+ final IllegalArgumentException e3 = Assertions .assertThrows (
203+ IllegalArgumentException .class ,
204+ () -> fungibleClientImpl .createToken (name , symbol , accountId , privateKey )
205+ );
206+ final IllegalArgumentException e4 = Assertions .assertThrows (
207+ IllegalArgumentException .class ,
208+ () -> fungibleClientImpl .createToken (name , symbol , accountId , privateKey , supplyKey )
209+ );
210+
211+ Assertions .assertEquals (message , e1 .getMessage ());
212+ Assertions .assertEquals (message , e2 .getMessage ());
213+ Assertions .assertEquals (message , e3 .getMessage ());
214+ Assertions .assertEquals (message , e4 .getMessage ());
215+ }
216+
217+ @ Test
218+ void testCreateTokenThrowExceptionForNullParams () {
219+ final PrivateKey privateKey = PrivateKey .generateECDSA ();
220+ final String name = "TOKEN" ;
221+ final String symbol = "FT" ;
222+
223+ final NullPointerException e1 = Assertions .assertThrows (
224+ NullPointerException .class ,
225+ () -> fungibleClientImpl .createToken (null , symbol )
226+ );
227+ final NullPointerException e2 = Assertions .assertThrows (
228+ NullPointerException .class ,
229+ () -> fungibleClientImpl .createToken (name , null )
230+ );
231+ final NullPointerException e3 = Assertions .assertThrows (
232+ NullPointerException .class ,
233+ () -> fungibleClientImpl .createToken (name , symbol , (PrivateKey ) null )
234+ );
235+ final NullPointerException e4 = Assertions .assertThrows (
236+ NullPointerException .class ,
237+ () -> fungibleClientImpl .createToken (name , symbol , (AccountId ) null , privateKey )
238+ );
239+ Assertions .assertEquals ("name must not be null" , e1 .getMessage ());
240+ Assertions .assertEquals ("symbol must not be null" , e2 .getMessage ());
241+ Assertions .assertEquals ("supplyKey must not be null" , e3 .getMessage ());
242+ Assertions .assertEquals ("Treasury account ID cannot be null" , e4 .getMessage ());
243+ }
244+
43245
44246 @ Test
45247 void testAssociateToken () throws HieroException {
0 commit comments