Skip to content

Commit 05e3c59

Browse files
committed
Merge branch 'main' into configure-request-timeout
# Conflicts: # hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/HieroTestContext.java
2 parents 6b23a0f + 5915bae commit 05e3c59

File tree

11 files changed

+348
-74
lines changed

11 files changed

+348
-74
lines changed

hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/HieroTestContext.java

Lines changed: 0 additions & 70 deletions
This file was deleted.

hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/NftClientImplTest.java

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@
1313
import com.openelements.hiero.base.data.Account;
1414
import com.openelements.hiero.base.implementation.NftClientImpl;
1515
import com.openelements.hiero.base.protocol.ProtocolLayerClient;
16+
import com.openelements.hiero.base.protocol.data.TokenBurnRequest;
17+
import com.openelements.hiero.base.protocol.data.TokenBurnResult;
1618
import com.openelements.hiero.base.protocol.data.TokenCreateRequest;
1719
import com.openelements.hiero.base.protocol.data.TokenCreateResult;
1820
import com.openelements.hiero.base.protocol.data.TokenTransferRequest;
1921
import com.openelements.hiero.base.protocol.data.TokenTransferResult;
2022
import java.util.List;
23+
import java.util.Set;
2124
import org.junit.jupiter.api.Assertions;
2225
import org.junit.jupiter.api.BeforeEach;
2326
import org.junit.jupiter.api.Test;
@@ -31,6 +34,7 @@ public class NftClientImplTest {
3134

3235
ArgumentCaptor<TokenCreateRequest> tokenRequestCaptor = ArgumentCaptor.forClass(TokenCreateRequest.class);
3336
ArgumentCaptor<TokenTransferRequest> tokenTransferCaptor = ArgumentCaptor.forClass(TokenTransferRequest.class);
37+
ArgumentCaptor<TokenBurnRequest> tokenBurnCaptor = ArgumentCaptor.forClass(TokenBurnRequest.class);
3438

3539
@BeforeEach
3640
public void setup() {
@@ -313,4 +317,127 @@ void testTransferNftNullParams() {
313317
() -> nftClientImpl.transferNfts(null, null, null,
314318
null, null));
315319
}
320+
321+
@Test
322+
void testBurnNft() throws HieroException {
323+
final PrivateKey privateKey = PrivateKey.generateECDSA();
324+
final TokenBurnResult tokenBurnRequest = Mockito.mock(TokenBurnResult.class);
325+
326+
final TokenId tokenId = TokenId.fromString("1.2.3");
327+
final long serials = 1L;
328+
329+
when(operationalAccount.privateKey()).thenReturn(privateKey);
330+
when(protocolLayerClient.executeBurnTokenTransaction(any(TokenBurnRequest.class)))
331+
.thenReturn(tokenBurnRequest);
332+
333+
nftClientImpl.burnNft(tokenId, serials);
334+
335+
verify(operationalAccount, times(1)).privateKey();
336+
verify(protocolLayerClient, times(1))
337+
.executeBurnTokenTransaction(tokenBurnCaptor.capture());
338+
339+
final TokenBurnRequest request = tokenBurnCaptor.getValue();
340+
Assertions.assertEquals(tokenId, request.tokenId());
341+
Assertions.assertEquals(Set.of(serials), request.serials());
342+
Assertions.assertEquals(privateKey, request.supplyKey());
343+
}
344+
345+
@Test
346+
void testBurnNftWithSupplyKey() throws HieroException {
347+
final TokenBurnResult tokenBurnRequest = Mockito.mock(TokenBurnResult.class);
348+
349+
final TokenId tokenId = TokenId.fromString("1.2.3");
350+
final long serials = 1L;
351+
final PrivateKey privateKey = PrivateKey.generateECDSA();
352+
353+
when(protocolLayerClient.executeBurnTokenTransaction(any(TokenBurnRequest.class)))
354+
.thenReturn(tokenBurnRequest);
355+
356+
nftClientImpl.burnNft(tokenId, serials, privateKey);
357+
358+
verify(protocolLayerClient, times(1))
359+
.executeBurnTokenTransaction(tokenBurnCaptor.capture());
360+
361+
final TokenBurnRequest request = tokenBurnCaptor.getValue();
362+
Assertions.assertEquals(tokenId, request.tokenId());
363+
Assertions.assertEquals(Set.of(serials), request.serials());
364+
Assertions.assertEquals(privateKey, request.supplyKey());
365+
}
366+
367+
@Test
368+
void testBurnNfts() throws HieroException {
369+
final PrivateKey privateKey = PrivateKey.generateECDSA();
370+
final TokenBurnResult tokenBurnRequest = Mockito.mock(TokenBurnResult.class);
371+
372+
final TokenId tokenId = TokenId.fromString("1.2.3");
373+
final Set<Long> serials = Set.of(1L);
374+
375+
when(operationalAccount.privateKey()).thenReturn(privateKey);
376+
when(protocolLayerClient.executeBurnTokenTransaction(any(TokenBurnRequest.class)))
377+
.thenReturn(tokenBurnRequest);
378+
379+
nftClientImpl.burnNfts(tokenId, serials);
380+
381+
verify(operationalAccount, times(1)).privateKey();
382+
verify(protocolLayerClient, times(1))
383+
.executeBurnTokenTransaction(tokenBurnCaptor.capture());
384+
385+
final TokenBurnRequest request = tokenBurnCaptor.getValue();
386+
Assertions.assertEquals(tokenId, request.tokenId());
387+
Assertions.assertEquals(serials, request.serials());
388+
Assertions.assertEquals(privateKey, request.supplyKey());
389+
}
390+
391+
@Test
392+
void testBurnNftsWithSupplyKey() throws HieroException {
393+
final TokenBurnResult tokenBurnRequest = Mockito.mock(TokenBurnResult.class);
394+
395+
final TokenId tokenId = TokenId.fromString("1.2.3");
396+
final Set<Long> serials = Set.of(1L);
397+
final PrivateKey privateKey = PrivateKey.generateECDSA();
398+
399+
when(protocolLayerClient.executeBurnTokenTransaction(any(TokenBurnRequest.class)))
400+
.thenReturn(tokenBurnRequest);
401+
402+
nftClientImpl.burnNfts(tokenId, serials, privateKey);
403+
404+
verify(protocolLayerClient, times(1))
405+
.executeBurnTokenTransaction(tokenBurnCaptor.capture());
406+
407+
final TokenBurnRequest request = tokenBurnCaptor.getValue();
408+
Assertions.assertEquals(tokenId, request.tokenId());
409+
Assertions.assertEquals(serials, request.serials());
410+
Assertions.assertEquals(privateKey, request.supplyKey());
411+
}
412+
413+
@Test
414+
void testBurnNftThrowsExceptionForInvalidTokenId() throws HieroException {
415+
final PrivateKey privateKey = PrivateKey.generateECDSA();
416+
final TokenId tokenId = TokenId.fromString("1.2.3");
417+
final long serials = 1L;
418+
419+
when(operationalAccount.privateKey()).thenReturn(privateKey);
420+
when(protocolLayerClient.executeBurnTokenTransaction(any(TokenBurnRequest.class)))
421+
.thenThrow(new HieroException("Failed to execute transaction of type TokenBurnTransaction"));
422+
423+
Assertions.assertThrows(HieroException.class , () -> nftClientImpl.burnNft(tokenId, serials));
424+
Assertions.assertThrows(HieroException.class , () -> nftClientImpl.burnNft(tokenId, serials, privateKey));
425+
Assertions.assertThrows(HieroException.class , () -> nftClientImpl.burnNfts(tokenId, Set.of(serials)));
426+
Assertions.assertThrows(HieroException.class , () -> nftClientImpl.burnNfts(tokenId, Set.of(serials), privateKey));
427+
}
428+
429+
@Test
430+
void testBurnNftNullParam() {
431+
Assertions.assertThrows(NullPointerException.class,
432+
() -> nftClientImpl.burnNft(null, 0));
433+
434+
Assertions.assertThrows(NullPointerException.class,
435+
() -> nftClientImpl.burnNft(null, 0, null));
436+
437+
Assertions.assertThrows(NullPointerException.class,
438+
() -> nftClientImpl.burnNfts(null, null));
439+
440+
Assertions.assertThrows(NullPointerException.class,
441+
() -> nftClientImpl.burnNfts(null, null, null));
442+
}
316443
}

hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/ProtocolLayerClientAccountTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
import com.openelements.hiero.base.HieroException;
77
import com.openelements.hiero.base.data.Account;
88
import com.openelements.hiero.base.implementation.ProtocolLayerClientImpl;
9+
import com.openelements.hiero.base.protocol.ProtocolLayerClient;
910
import com.openelements.hiero.base.protocol.data.AccountBalanceRequest;
1011
import com.openelements.hiero.base.protocol.data.AccountBalanceResponse;
1112
import com.openelements.hiero.base.protocol.data.AccountCreateRequest;
1213
import com.openelements.hiero.base.protocol.data.AccountCreateResult;
1314
import com.openelements.hiero.base.protocol.data.AccountDeleteRequest;
14-
import com.openelements.hiero.base.protocol.ProtocolLayerClient;
15+
import com.openelements.hiero.base.test.config.HieroTestContext;
1516
import org.junit.jupiter.api.Assertions;
1617
import org.junit.jupiter.api.BeforeAll;
1718
import org.junit.jupiter.api.Test;

hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/ProtocolLayerClientTokenTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.openelements.hiero.base.protocol.data.TokenCreateResult;
1111
import com.openelements.hiero.base.protocol.data.TokenMintRequest;
1212
import com.openelements.hiero.base.protocol.data.TokenMintResult;
13+
import com.openelements.hiero.base.test.config.HieroTestContext;
1314
import org.junit.jupiter.api.Assertions;
1415
import org.junit.jupiter.api.BeforeAll;
1516
import org.junit.jupiter.api.Test;
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.openelements.hiero.base.test.config;
2+
3+
import com.hedera.hashgraph.sdk.AccountId;
4+
import com.hedera.hashgraph.sdk.Client;
5+
import com.hedera.hashgraph.sdk.PrivateKey;
6+
import com.hedera.hashgraph.sdk.PublicKey;
7+
import com.openelements.hiero.base.HieroContext;
8+
import com.openelements.hiero.base.config.NetworkSettings;
9+
import com.openelements.hiero.base.data.Account;
10+
import io.github.cdimascio.dotenv.Dotenv;
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
import java.util.Optional;
14+
import org.jspecify.annotations.NonNull;
15+
import org.slf4j.Logger;
16+
17+
public class HieroTestContext implements HieroContext {
18+
19+
private final static Logger log = org.slf4j.LoggerFactory.getLogger(HieroTestContext.class);
20+
21+
private final Account operationalAccount;
22+
23+
private final Client client;
24+
25+
public HieroTestContext() {
26+
final Dotenv dotenv = Dotenv.configure().ignoreIfMissing().load();
27+
28+
final String hieroAccountIdByEnv = Optional.ofNullable(System.getenv("HEDERA_ACCOUNT_ID"))
29+
.orElse(dotenv.get("hiero.accountId"));
30+
final String hieroPrivateKeyByEnv = Optional.ofNullable(System.getenv("HEDERA_PRIVATE_KEY"))
31+
.orElse(dotenv.get("hiero.privateKey"));
32+
final String hieroNetwork = Optional.ofNullable(System.getenv("HEDERA_NETWORK"))
33+
.or(() -> Optional.ofNullable(dotenv.get("hiero.network")))
34+
.orElse("hedera-testnet");
35+
36+
if (hieroAccountIdByEnv == null) {
37+
throw new IllegalStateException(
38+
"AccountId for operator account is not set. Please set 'HEDERA_ACCOUNT_ID' or 'hiero.accountId' in .env file.");
39+
}
40+
if (hieroPrivateKeyByEnv == null) {
41+
throw new IllegalStateException(
42+
"PrivateKey for operator account is not set. Please set 'HEDERA_PRIVATE_KEY' or 'hiero.privateKey' in .env file.");
43+
}
44+
45+
log.info("Using operator account: {}", hieroAccountIdByEnv);
46+
log.info("Using network: {}", hieroNetwork);
47+
48+
final AccountId accountId = AccountId.fromString(hieroAccountIdByEnv);
49+
final PrivateKey privateKey = PrivateKey.fromString(hieroPrivateKeyByEnv);
50+
final PublicKey publicKey = privateKey.getPublicKey();
51+
operationalAccount = new Account(accountId, publicKey, privateKey);
52+
53+
final NetworkSettings networkSettings = NetworkSettings.forIdentifier(hieroNetwork)
54+
.orElseThrow(() -> new IllegalStateException("ENV 'HEDERA_NETWORK' is set to '" + hieroNetwork
55+
+ "' but no network settings are available for this network."));
56+
57+
final Map<String, AccountId> nodes = new HashMap<>();
58+
networkSettings.getConsensusNodes()
59+
.forEach(consensusNode -> nodes.put(consensusNode.getAddress(), consensusNode.getAccountId()));
60+
client = Client.forNetwork(nodes);
61+
if (!networkSettings.getMirrorNodeAddresses().isEmpty()) {
62+
try {
63+
client.setMirrorNetwork(networkSettings.getMirrorNodeAddresses().stream().toList());
64+
} catch (InterruptedException e) {
65+
throw new RuntimeException("Error in configuring Mirror Node", e);
66+
}
67+
}
68+
client.setOperator(accountId, privateKey);
69+
}
70+
71+
@Override
72+
public @NonNull Account getOperatorAccount() {
73+
return operationalAccount;
74+
}
75+
76+
public Client getClient() {
77+
return client;
78+
}
79+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.openelements.hiero.base.test.config;
2+
3+
import com.openelements.hiero.base.config.ConsensusNode;
4+
import com.openelements.hiero.base.config.NetworkSettings;
5+
import java.util.Optional;
6+
import java.util.Set;
7+
import org.jspecify.annotations.NonNull;
8+
9+
10+
public class SoloActionNetworkSettings implements NetworkSettings {
11+
12+
@Override
13+
public @NonNull String getNetworkIdentifier() {
14+
return "hiero-solo-action";
15+
}
16+
17+
@Override
18+
public @NonNull Optional<String> getNetworkName() {
19+
return Optional.of("Hiero Solo Action");
20+
}
21+
22+
@Override
23+
public @NonNull Set<String> getMirrorNodeAddresses() {
24+
return Set.of("http://localhost:8080");
25+
}
26+
27+
@Override
28+
public @NonNull Set<ConsensusNode> getConsensusNodes() {
29+
return Set.of(new ConsensusNode("127.0.0.1", "50211", "0.0.3"));
30+
}
31+
32+
@Override
33+
public @NonNull Optional<Long> chainId() {
34+
return Optional.empty();
35+
}
36+
37+
@Override
38+
public @NonNull Optional<String> relayUrl() {
39+
return Optional.empty();
40+
}
41+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.openelements.hiero.base.test.config;
2+
3+
import com.openelements.hiero.base.config.NetworkSettings;
4+
import com.openelements.hiero.base.config.NetworkSettingsProvider;
5+
import java.util.Set;
6+
7+
public class SoloActionNetworkSettingsProvider implements NetworkSettingsProvider {
8+
9+
@Override
10+
public String getName() {
11+
return "Provider for Hiero Solo Action";
12+
}
13+
14+
@Override
15+
public Set<NetworkSettings> createNetworkSettings() {
16+
return Set.of(new SoloActionNetworkSettings());
17+
}
18+
}

hiero-enterprise-base/src/test/java/module-info.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,7 @@
55
requires org.junit.jupiter.api;
66
requires org.junit.jupiter.params;
77
requires org.mockito;
8+
requires org.slf4j;
9+
10+
provides com.openelements.hiero.base.config.NetworkSettingsProvider with com.openelements.hiero.base.test.config.SoloActionNetworkSettingsProvider;
811
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
com.openelements.hiero.base.test.config.SoloActionNetworkSettingsProvider

0 commit comments

Comments
 (0)