use of io.nem.symbol.sdk.api.MetadataSearchCriteria in project nem2-sdk-java by nemtech.
the class MetadataTransactionServiceTest method shouldNotCreateAccountMetadataTransactionFactoryWhenBug.
@Test
public void shouldNotCreateAccountMetadataTransactionFactoryWhenBug() {
BigInteger metadataKey = BigInteger.valueOf(10);
String newValue = "the new Message";
IllegalArgumentException expectedException = new IllegalArgumentException("Some unexpected error");
MetadataSearchCriteria criteria = new MetadataSearchCriteria().sourceAddress(sourceAddress).scopedMetadataKey(metadataKey).targetAddress(targetAccount.getAddress()).metadataType(MetadataType.ACCOUNT);
Mockito.when(metadataRepositoryMock.search(Mockito.eq(criteria))).thenReturn(Observable.error(expectedException));
IllegalArgumentException exception = Assertions.assertThrows(IllegalArgumentException.class, () -> ExceptionUtils.propagate(() -> service.createAccountMetadataTransactionFactory(targetAccount.getAddress(), metadataKey, newValue, sourceAddress).toFuture().get()));
Assertions.assertEquals(expectedException, exception);
Mockito.verify(metadataRepositoryMock).search(Mockito.eq(criteria));
}
use of io.nem.symbol.sdk.api.MetadataSearchCriteria in project nem2-sdk-java by nemtech.
the class MetadataTransactionServiceTest method shouldCreateMosaicMetadataTransactionFactoryWhenNotFound.
@Test
void shouldCreateMosaicMetadataTransactionFactoryWhenNotFound() throws Exception {
BigInteger metadataKey = BigInteger.valueOf(10);
String newValue = "the new Message";
MetadataSearchCriteria criteria = new MetadataSearchCriteria().sourceAddress(sourceAddress).scopedMetadataKey(metadataKey).targetId(mosaicId).metadataType(MetadataType.MOSAIC);
Mockito.when(metadataRepositoryMock.search(Mockito.eq(criteria))).thenReturn(Observable.just(new Page<>(Collections.emptyList())));
MosaicMetadataTransactionFactory result = service.createMosaicMetadataTransactionFactory(targetAccount.getAddress(), metadataKey, newValue, sourceAddress, mosaicId).toFuture().get();
Assertions.assertEquals(metadataKey, result.getScopedMetadataKey());
Assertions.assertArrayEquals(StringEncoder.getBytes(newValue), result.getValue());
Assertions.assertEquals(StringEncoder.getBytes(newValue).length, result.getValueSizeDelta());
Assertions.assertEquals(targetAccount.getAddress(), result.getTargetAddress());
Assertions.assertEquals(mosaicId.getId(), result.getTargetMosaicId().getId());
Mockito.verify(metadataRepositoryMock).search(Mockito.eq(criteria));
}
use of io.nem.symbol.sdk.api.MetadataSearchCriteria in project nem2-sdk-java by nemtech.
the class MetadataTransactionServiceTest method shouldNotCreateMosaicMetadataTransactionFactoryWhenAnyOtherRemoteException.
@Test
void shouldNotCreateMosaicMetadataTransactionFactoryWhenAnyOtherRemoteException() {
BigInteger metadataKey = BigInteger.valueOf(10);
String newValue = "the new Message";
RepositoryCallException expectedException = new RepositoryCallException("Some other problem.", 500, null);
MetadataSearchCriteria criteria = new MetadataSearchCriteria().sourceAddress(sourceAddress).scopedMetadataKey(metadataKey).targetId(mosaicId).metadataType(MetadataType.MOSAIC);
Mockito.when(metadataRepositoryMock.search(Mockito.eq(criteria))).thenReturn(Observable.error(expectedException));
RepositoryCallException exception = Assertions.assertThrows(RepositoryCallException.class, () -> ExceptionUtils.propagate(() -> service.createMosaicMetadataTransactionFactory(targetAccount.getAddress(), metadataKey, newValue, sourceAddress, mosaicId).toFuture().get()));
Assertions.assertEquals(expectedException, exception);
Mockito.verify(metadataRepositoryMock).search(criteria);
}
use of io.nem.symbol.sdk.api.MetadataSearchCriteria in project nem2-sdk-java by nemtech.
the class MetadataTransactionServiceTest method shouldCreateAccountMetadataTransactionFactoryWhenNotFound.
@Test
void shouldCreateAccountMetadataTransactionFactoryWhenNotFound() throws Exception {
BigInteger metadataKey = BigInteger.valueOf(10);
String newValue = "the new Message";
MetadataSearchCriteria criteria = new MetadataSearchCriteria().sourceAddress(sourceAddress).scopedMetadataKey(metadataKey).targetAddress(targetAccount.getAddress()).metadataType(MetadataType.ACCOUNT);
Mockito.when(metadataRepositoryMock.search(Mockito.eq(criteria))).thenReturn(Observable.just(new Page<>(Collections.emptyList())));
AccountMetadataTransactionFactory result = service.createAccountMetadataTransactionFactory(targetAccount.getAddress(), metadataKey, newValue, sourceAddress).toFuture().get();
Assertions.assertEquals(metadataKey, result.getScopedMetadataKey());
Assertions.assertArrayEquals(StringEncoder.getBytes(newValue), result.getValue());
Assertions.assertEquals(StringEncoder.getBytes(newValue).length, result.getValueSizeDelta());
Assertions.assertEquals(targetAccount.getAddress(), result.getTargetAddress());
Mockito.verify(metadataRepositoryMock).search(Mockito.eq(criteria));
}
use of io.nem.symbol.sdk.api.MetadataSearchCriteria in project nem2-sdk-java by nemtech.
the class MetadataTransactionServiceImpl method processMetadata.
/**
* Generic way of processing a metadata entity and creating a new metadata transaction factory
* depending on the existing metadata value. This works for Account, Mosaic and Namespace
* metadata.
*
* @param criteria the criteria
* @param transactionFactory the function that creates a transaction factory
* @param newValue the new value you want to set.
* @param <T> the type of the transaction factory.
* @return an Observable of a transaction factory.
*/
private <T extends MetadataTransactionFactory> Observable<T> processMetadata(MetadataSearchCriteria criteria, TriFunction<byte[], NetworkType, Deadline, T> transactionFactory, String newValue) {
return Observable.combineLatest(networkTypeObservable, epochAdjustmentObservable, (networkType, epochAdjustment) -> metadataRepository.search(criteria).map(page -> {
Deadline deadline = Deadline.create(epochAdjustment);
if (page.getData().isEmpty()) {
return transactionFactory.apply(StringEncoder.getBytes(newValue), networkType, deadline);
} else {
byte[] originalValue = page.getData().get(0).getValue();
byte[] newValueBytes = StringEncoder.getBytes(newValue);
byte[] xoredBytes = ConvertUtils.xor(originalValue, newValueBytes);
T factory = transactionFactory.apply(xoredBytes, networkType, deadline);
factory.valueSizeDelta(newValueBytes.length - originalValue.length);
return factory;
}
})).flatMap(f -> f);
}
Aggregations