StringBuilder, and other, optimizations for repository-related classes.

Add optional "excludeZero" to API call GET /assets/balances

Added tests to call most API calls to check no exceptions are thrown.
This commit is contained in:
catbref
2019-06-21 14:04:42 +01:00
parent 48eae0cb38
commit e47b4dceb2
54 changed files with 1069 additions and 393 deletions

View File

@@ -0,0 +1,36 @@
package org.qora.test.api;
import static org.junit.Assert.*;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.qora.api.resource.AddressesResource;
import org.qora.test.common.ApiCommon;
public class AddressesApiTests extends ApiCommon {
private AddressesResource addressesResource;
@Before
public void buildResource() {
this.addressesResource = (AddressesResource) ApiCommon.buildResource(AddressesResource.class);
}
@Test
public void testGetAccountInfo() {
assertNotNull(this.addressesResource.getAccountInfo(aliceAddress));
}
@Test
public void testGetProxying() {
assertNotNull(this.addressesResource.getProxying(Collections.singletonList(aliceAddress), null, null, null, null, null));
assertNotNull(this.addressesResource.getProxying(null, Collections.singletonList(aliceAddress), null, null, null, null));
assertNotNull(this.addressesResource.getProxying(Collections.singletonList(aliceAddress), Collections.singletonList(aliceAddress), null, null, null, null));
assertNotNull(this.addressesResource.getProxying(null, null, Collections.singletonList(aliceAddress), null, null, null));
assertNotNull(this.addressesResource.getProxying(Collections.singletonList(aliceAddress), Collections.singletonList(aliceAddress), Collections.singletonList(aliceAddress), null, null, null));
assertNotNull(this.addressesResource.getProxying(Collections.singletonList(aliceAddress), Collections.singletonList(aliceAddress), Collections.singletonList(aliceAddress), 1, 1, true));
}
}

View File

@@ -0,0 +1,29 @@
package org.qora.test.api;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.qora.api.resource.AdminResource;
import org.qora.test.common.ApiCommon;
public class AdminApiTests extends ApiCommon {
private AdminResource adminResource;
@Before
public void buildResource() {
this.adminResource = (AdminResource) ApiCommon.buildResource(AdminResource.class);
}
@Test
public void testInfo() {
assertNotNull(this.adminResource.info());
}
@Test
public void testSummary() {
assertNotNull(this.adminResource.summary());
}
}

View File

@@ -0,0 +1,154 @@
package org.qora.test.api;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.qora.api.ApiError;
import org.qora.api.ApiException;
import org.qora.api.resource.AssetsResource;
import org.qora.api.resource.TransactionsResource.ConfirmationStatus;
import org.qora.repository.AccountRepository.BalanceOrdering;
import org.qora.test.common.ApiCommon;
public class AssetsApiTests extends ApiCommon {
private static final String FAKE_ORDER_ID_BASE58 = "C3CPq7c8PY";
private AssetsResource assetsResource;
@Before
public void buildResource() {
this.assetsResource = (AssetsResource) ApiCommon.buildResource(AssetsResource.class);
}
@Test
public void testGet() {
assertNotNull(this.assetsResource);
}
@Test
public void testGetAccountAssetPairOrders() {
String address = aliceAddress;
final int assetId = 0;
final int otherAssetId = 1;
for (Boolean includeClosed : ALL_BOOLEAN_VALUES) {
for (Boolean includeFulfilled : ALL_BOOLEAN_VALUES) {
assertNotNull(this.assetsResource.getAccountAssetPairOrders(address, assetId, otherAssetId, includeClosed, includeFulfilled, null, null, null));
assertNotNull(this.assetsResource.getAccountAssetPairOrders(address, assetId, otherAssetId, includeClosed, includeFulfilled, 1, 1, true));
}
}
}
@Test
public void testGetAccountOrders() {
for (Boolean includeClosed : TF_BOOLEAN_VALUES) {
for (Boolean includeFulfilled : TF_BOOLEAN_VALUES) {
assertNotNull(this.assetsResource.getAccountOrders(aliceAddress, includeClosed, includeFulfilled, null, null, null));
assertNotNull(this.assetsResource.getAccountOrders(aliceAddress, includeClosed, includeFulfilled, 1, 1, true));
}
}
}
@Test
public void testGetAggregatedOpenOrders() {
assertNotNull(this.assetsResource.getAggregatedOpenOrders(0, 1, null, null, null));
assertNotNull(this.assetsResource.getAggregatedOpenOrders(0, 1, 1, 1, true));
}
@Test
public void testGetAllAssets() {
assertNotNull(this.assetsResource.getAllAssets(null, null, null, null));
assertNotNull(this.assetsResource.getAllAssets(false, null, null, null));
assertNotNull(this.assetsResource.getAllAssets(false, 1, 1, true));
}
@Test
public void testGetAssetBalances() {
List<String> addresses = Arrays.asList(aliceAddress, aliceAddress);
List<Long> assetIds = Arrays.asList(1L, 2L, 3L);
for (BalanceOrdering balanceOrdering : BalanceOrdering.values()) {
for (Boolean excludeZero : ALL_BOOLEAN_VALUES) {
assertNotNull(this.assetsResource.getAssetBalances(Collections.emptyList(), assetIds, balanceOrdering, excludeZero, null, null, null));
assertNotNull(this.assetsResource.getAssetBalances(addresses, Collections.emptyList(), balanceOrdering, excludeZero, null, null, null));
assertNotNull(this.assetsResource.getAssetBalances(addresses, assetIds, balanceOrdering, excludeZero, null, null, null));
assertNotNull(this.assetsResource.getAssetBalances(addresses, assetIds, balanceOrdering, excludeZero, 1, 1, true));
}
}
}
@Test
public void testGetAssetInfo() {
assertNotNull(this.assetsResource.getAssetInfo((int) 0L, null));
assertNotNull(this.assetsResource.getAssetInfo(null, "QORA"));
}
@Test
public void testGetAssetOrder() {
try {
assertNotNull(this.assetsResource.getAssetOrder(FAKE_ORDER_ID_BASE58));
} catch (ApiException e) {
assertTrue(e.error == ApiError.ORDER_NO_EXISTS.getCode());
}
}
@Test
public void testGetAssetOrderTrades() {
try {
assertNotNull(this.assetsResource.getAssetOrderTrades(FAKE_ORDER_ID_BASE58, null, null, null));
} catch (ApiException e) {
assertTrue(e.error == ApiError.ORDER_NO_EXISTS.getCode());
}
try {
assertNotNull(this.assetsResource.getAssetOrderTrades(FAKE_ORDER_ID_BASE58, 1, 1, true));
} catch (ApiException e) {
assertTrue(e.error == ApiError.ORDER_NO_EXISTS.getCode());
}
}
@Test
public void testGetAssetTrades() {
assertNotNull(this.assetsResource.getAssetTrades(0, 1, null, null, null));
assertNotNull(this.assetsResource.getAssetTrades(0, 1, 1, 1, true));
}
@Test
public void testGetAssetTransactions() {
for (ConfirmationStatus confirmationStatus : ConfirmationStatus.values()) {
assertNotNull(this.assetsResource.getAssetTransactions(0, confirmationStatus, null, null, null));
assertNotNull(this.assetsResource.getAssetTransactions(0, confirmationStatus, 1, 1, true));
}
}
@Test
public void testGetAssetTransfers() {
assertNotNull(this.assetsResource.getAssetTransfers(0, null, null, null, null));
assertNotNull(this.assetsResource.getAssetTransfers(0, null, 1, 1, true));
assertNotNull(this.assetsResource.getAssetTransfers(0, aliceAddress, null, null, null));
assertNotNull(this.assetsResource.getAssetTransfers(0, aliceAddress, 1, 1, true));
}
@Test
public void testGetOpenOrders() {
assertNotNull(this.assetsResource.getOpenOrders(0, 1, null, null, null));
assertNotNull(this.assetsResource.getOpenOrders(0, 1, 1, 1, true));
}
@Test
public void testGetRecentTrades() {
List<Long> assetIds = Arrays.asList(1L, 2L, 3L);
assertNotNull(this.assetsResource.getRecentTrades(assetIds, Collections.emptyList(), null, null, null));
assertNotNull(this.assetsResource.getRecentTrades(assetIds, Collections.emptyList(), 1, 1, true));
assertNotNull(this.assetsResource.getRecentTrades(assetIds, assetIds, null, null, null));
assertNotNull(this.assetsResource.getRecentTrades(assetIds, assetIds, 1, 1, true));
}
}

View File

@@ -0,0 +1,44 @@
package org.qora.test.api;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.qora.api.resource.BlocksResource;
import org.qora.test.common.ApiCommon;
public class BlockApiTests extends ApiCommon {
private BlocksResource blocksResource;
@Before
public void buildResource() {
this.blocksResource = (BlocksResource) ApiCommon.buildResource(BlocksResource.class);
}
@Test
public void test() {
assertNotNull(this.blocksResource);
}
@Test
public void testGetBlockForgers() {
List<String> addresses = Arrays.asList(aliceAddress, aliceAddress);
assertNotNull(this.blocksResource.getBlockForgers(Collections.emptyList(), null, null, null));
assertNotNull(this.blocksResource.getBlockForgers(addresses, null, null, null));
assertNotNull(this.blocksResource.getBlockForgers(Collections.emptyList(), 1, 1, true));
assertNotNull(this.blocksResource.getBlockForgers(addresses, 1, 1, true));
}
@Test
public void testGetBlocksByForger() {
assertNotNull(this.blocksResource.getBlocksByForger(aliceAddress, null, null, null));
assertNotNull(this.blocksResource.getBlocksByForger(aliceAddress, 1, 1, true));
}
}

View File

@@ -0,0 +1,73 @@
package org.qora.test.api;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.qora.api.resource.GroupsResource;
import org.qora.test.common.ApiCommon;
public class GroupApiTests extends ApiCommon {
private GroupsResource groupsResource;
@Before
public void buildResource() {
this.groupsResource = (GroupsResource) ApiCommon.buildResource(GroupsResource.class);
}
@Test
public void test() {
assertNotNull(this.groupsResource);
}
@Test
public void testGetAllGroups() {
assertNotNull(this.groupsResource.getAllGroups(null, null, null));
assertNotNull(this.groupsResource.getAllGroups(1, 1, true));
}
@Test
public void testGetBans() {
assertNotNull(this.groupsResource.getBans(1));
}
@Test
public void testGetGroup() {
for (Boolean onlyAdmins : ALL_BOOLEAN_VALUES) {
assertNotNull(this.groupsResource.getGroup(1, onlyAdmins, null, null, null));
assertNotNull(this.groupsResource.getGroup(1, onlyAdmins, 1, 1, true));
}
}
@Test
public void testGetGroupData() {
assertNotNull(this.groupsResource.getGroupData(1));
}
@Test
public void testGetGroupsByOwner() {
assertNotNull(this.groupsResource.getGroupsByOwner(aliceAddress));
}
@Test
public void testGetGroupsWithMember() {
assertNotNull(this.groupsResource.getGroupsWithMember(aliceAddress));
}
@Test
public void testGetInvitesByGroupId() {
assertNotNull(this.groupsResource.getInvitesByGroupId(1));
}
@Test
public void testGetInvitesByInvitee() {
assertNotNull(this.groupsResource.getInvitesByInvitee(aliceAddress));
}
@Test
public void testGetJoinRequests() {
assertNotNull(this.groupsResource.getJoinRequests(1));
}
}

View File

@@ -0,0 +1,63 @@
package org.qora.test.api;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.qora.api.resource.TransactionsResource;
import org.qora.api.resource.TransactionsResource.ConfirmationStatus;
import org.qora.test.common.ApiCommon;
import org.qora.transaction.Transaction.TransactionType;
public class TransactionsApiTests extends ApiCommon {
private TransactionsResource transactionsResource;
@Before
public void buildResource() {
this.transactionsResource = (TransactionsResource) ApiCommon.buildResource(TransactionsResource.class);
}
@Test
public void test() {
assertNotNull(this.transactionsResource);
}
@Test
public void testGetPendingTransactions() {
for (Integer txGroupId : Arrays.asList(null, 0, 1)) {
assertNotNull(this.transactionsResource.getPendingTransactions(txGroupId, null, null, null));
assertNotNull(this.transactionsResource.getPendingTransactions(txGroupId, 1, 1, true));
}
}
@Test
public void testGetUnconfirmedTransactions() {
assertNotNull(this.transactionsResource.getUnconfirmedTransactions(null, null, null));
assertNotNull(this.transactionsResource.getUnconfirmedTransactions(1, 1, true));
}
@Test
public void testSearchTransactions() {
List<TransactionType> txTypes = Arrays.asList(TransactionType.PAYMENT, TransactionType.ISSUE_ASSET);
for (Integer startBlock : Arrays.asList(null, 1))
for (Integer blockLimit : Arrays.asList(null, 1))
for (Integer txGroupId : Arrays.asList(null, 1))
for (String address : Arrays.asList(null, aliceAddress))
for (ConfirmationStatus confirmationStatus : ConfirmationStatus.values()) {
if (confirmationStatus != ConfirmationStatus.CONFIRMED) {
startBlock = null;
blockLimit = null;
}
assertNotNull(this.transactionsResource.searchTransactions(startBlock, blockLimit, txGroupId, txTypes, address, confirmationStatus, null, null, null));
assertNotNull(this.transactionsResource.searchTransactions(startBlock, blockLimit, txGroupId, txTypes, address, confirmationStatus, 1, 1, true));
assertNotNull(this.transactionsResource.searchTransactions(startBlock, blockLimit, txGroupId, null, address, confirmationStatus, 1, 1, true));
}
}
}

View File

@@ -0,0 +1,49 @@
package org.qora.test.common;
import java.lang.reflect.Field;
import org.eclipse.jetty.server.Request;
import org.junit.Before;
import org.qora.repository.DataException;
public class ApiCommon extends Common {
public static final Boolean[] ALL_BOOLEAN_VALUES = new Boolean[] { null, true, false };
public static final Boolean[] TF_BOOLEAN_VALUES = new Boolean[] { true, false };
public static class FakeRequest extends Request {
public FakeRequest() {
super(null, null);
}
@Override
public String getRemoteAddr() {
return "127.0.0.1";
}
}
private static final FakeRequest FAKE_REQUEST = new FakeRequest();
public String aliceAddress;
@Before
public void beforeTests() throws DataException {
Common.useDefaultSettings();
this.aliceAddress = Common.getTestAccount(null, "alice").getAddress();
}
public static Object buildResource(Class<?> resourceClass) {
try {
Object resource = resourceClass.newInstance();
Field requestField = resourceClass.getDeclaredField("request");
requestField.setAccessible(true);
requestField.set(resource, FAKE_REQUEST);
return resource;
} catch (Exception e) {
throw new RuntimeException("Failed to build API resource " + resourceClass.getName() + ": " + e.getMessage(), e);
}
}
}

View File

@@ -110,7 +110,7 @@ public class Common {
// Build snapshot of initial state in case we want to compare with post-test orphaning
initialAssets = repository.getAssetRepository().getAllAssets();
initialGroups = repository.getGroupRepository().getAllGroups();
initialBalances = repository.getAccountRepository().getAssetBalances(Collections.emptyList(), Collections.emptyList(), BalanceOrdering.ASSET_ACCOUNT, null, null, null);
initialBalances = repository.getAccountRepository().getAssetBalances(Collections.emptyList(), Collections.emptyList(), BalanceOrdering.ASSET_ACCOUNT, false, null, null, null);
// Check that each test account can fetch their last reference
for (TestAccount testAccount : getTestAccounts(repository))
@@ -137,7 +137,7 @@ public class Common {
List<GroupData> remainingGroups = repository.getGroupRepository().getAllGroups();
checkOrphanedLists("group", initialGroups, remainingGroups, GroupData::getGroupId);
List<AccountBalanceData> remainingBalances = repository.getAccountRepository().getAssetBalances(Collections.emptyList(), Collections.emptyList(), BalanceOrdering.ASSET_ACCOUNT, null, null, null);
List<AccountBalanceData> remainingBalances = repository.getAccountRepository().getAssetBalances(Collections.emptyList(), Collections.emptyList(), BalanceOrdering.ASSET_ACCOUNT, false, null, null, null);
checkOrphanedLists("account balance", initialBalances, remainingBalances, entry -> entry.getAssetName() + "-" + entry.getAddress());
assertEquals("remainingBalances is different size", initialBalances.size(), remainingBalances.size());