Skip to content

Commit cd0f4db

Browse files
authored
fix: announce method missing observable map (#795)
1 parent 616c7a1 commit cd0f4db

File tree

2 files changed

+75
-47
lines changed

2 files changed

+75
-47
lines changed

src/service/TransactionService.ts

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,29 @@
1515
*/
1616

1717
import { combineLatest, merge, Observable, of } from 'rxjs';
18-
import { first, flatMap, map, mergeMap, toArray } from 'rxjs/operators';
19-
import { IListener } from '../infrastructure/IListener';
20-
import { ReceiptPaginationStreamer } from '../infrastructure/paginationStreamer/ReceiptPaginationStreamer';
21-
import { ReceiptRepository } from '../infrastructure/ReceiptRepository';
22-
import { TransactionGroup } from '../infrastructure/TransactionGroup';
23-
import { TransactionRepository } from '../infrastructure/TransactionRepository';
24-
import { Address } from '../model/account/Address';
25-
import { NamespaceId } from '../model/namespace/NamespaceId';
26-
import { Statement } from '../model/receipt/Statement';
27-
import { AccountAddressRestrictionTransaction } from '../model/transaction/AccountAddressRestrictionTransaction';
28-
import { AggregateTransaction } from '../model/transaction/AggregateTransaction';
29-
import { LockFundsTransaction } from '../model/transaction/LockFundsTransaction';
30-
import { MosaicAddressRestrictionTransaction } from '../model/transaction/MosaicAddressRestrictionTransaction';
31-
import { MosaicGlobalRestrictionTransaction } from '../model/transaction/MosaicGlobalRestrictionTransaction';
32-
import { MosaicMetadataTransaction } from '../model/transaction/MosaicMetadataTransaction';
33-
import { MosaicSupplyChangeTransaction } from '../model/transaction/MosaicSupplyChangeTransaction';
34-
import { SecretLockTransaction } from '../model/transaction/SecretLockTransaction';
35-
import { SecretProofTransaction } from '../model/transaction/SecretProofTransaction';
36-
import { SignedTransaction } from '../model/transaction/SignedTransaction';
37-
import { Transaction } from '../model/transaction/Transaction';
38-
import { TransactionStatusError } from '../model/transaction/TransactionStatusError';
39-
import { TransactionType } from '../model/transaction/TransactionType';
40-
import { TransferTransaction } from '../model/transaction/TransferTransaction';
41-
import { ITransactionService } from './interfaces/ITransactionService';
18+
import { first, map, mergeMap, toArray } from 'rxjs/operators';
19+
import { IListener, ReceiptRepository, TransactionGroup, TransactionRepository } from '../infrastructure';
20+
import { ReceiptPaginationStreamer } from '../infrastructure/paginationStreamer';
21+
import { Address } from '../model/account';
22+
import { NamespaceId } from '../model/namespace';
23+
import { Statement } from '../model/receipt';
24+
import {
25+
AccountAddressRestrictionTransaction,
26+
AggregateTransaction,
27+
LockFundsTransaction,
28+
MosaicAddressRestrictionTransaction,
29+
MosaicGlobalRestrictionTransaction,
30+
MosaicMetadataTransaction,
31+
MosaicSupplyChangeTransaction,
32+
SecretLockTransaction,
33+
SecretProofTransaction,
34+
SignedTransaction,
35+
Transaction,
36+
TransactionStatusError,
37+
TransactionType,
38+
TransferTransaction,
39+
} from '../model/transaction';
40+
import { ITransactionService } from './interfaces';
4241

4342
/**
4443
* Transaction Service
@@ -73,13 +72,18 @@ export class TransactionService implements ITransactionService {
7372
*/
7473
public announce(signedTransaction: SignedTransaction, listener: IListener): Observable<Transaction> {
7574
const signerAddress = signedTransaction.getSignerAddress();
76-
this.transactionRepository.announce(signedTransaction);
77-
return this.getTransactionOrRaiseError(
78-
listener,
79-
signerAddress,
80-
signedTransaction.hash,
81-
listener.confirmed(signerAddress, signedTransaction.hash),
82-
);
75+
return this.transactionRepository
76+
.announce(signedTransaction)
77+
.pipe(
78+
mergeMap(() =>
79+
this.getTransactionOrRaiseError(
80+
listener,
81+
signerAddress,
82+
signedTransaction.hash,
83+
listener.confirmed(signerAddress, signedTransaction.hash),
84+
),
85+
),
86+
);
8387
}
8488

8589
/**
@@ -93,7 +97,7 @@ export class TransactionService implements ITransactionService {
9397
const signerAddress = signedTransaction.getSignerAddress();
9498
const transactionObservable = this.transactionRepository
9599
.announceAggregateBonded(signedTransaction)
96-
.pipe(flatMap(() => listener.aggregateBondedAdded(signerAddress, signedTransaction.hash)));
100+
.pipe(mergeMap(() => listener.aggregateBondedAdded(signerAddress, signedTransaction.hash)));
97101
return this.getTransactionOrRaiseError(listener, signerAddress, signedTransaction.hash, transactionObservable);
98102
}
99103

@@ -113,7 +117,7 @@ export class TransactionService implements ITransactionService {
113117
listener: IListener,
114118
): Observable<AggregateTransaction> {
115119
return this.announce(signedHashLockTransaction, listener).pipe(
116-
flatMap(() => this.announceAggregateBonded(signedAggregateTransaction, listener)),
120+
mergeMap(() => this.announceAggregateBonded(signedAggregateTransaction, listener)),
117121
);
118122
}
119123

test/service/TransactionService.spec.ts

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@
1616

1717
import { ChronoUnit } from '@js-joda/core';
1818
import { expect } from 'chai';
19-
import { EMPTY, of as observableOf } from 'rxjs';
19+
import { EMPTY, from, of as observableOf } from 'rxjs';
2020
import { deepEqual, instance, mock, when } from 'ts-mockito';
21-
import { IListener } from '../../src/infrastructure/IListener';
22-
import { ReceiptRepository } from '../../src/infrastructure/ReceiptRepository';
23-
import { TransactionRepository } from '../../src/infrastructure/TransactionRepository';
21+
import { IListener, ReceiptRepository, TransactionRepository } from '../../src/infrastructure';
22+
import { UInt64 } from '../../src/model';
2423
import { Account, Address } from '../../src/model/account';
25-
import { PlainMessage } from '../../src/model/message/PlainMessage';
26-
import { NetworkType } from '../../src/model/network/NetworkType';
27-
import { AggregateTransaction } from '../../src/model/transaction/AggregateTransaction';
28-
import { Deadline } from '../../src/model/transaction/Deadline';
29-
import { HashLockTransaction } from '../../src/model/transaction/HashLockTransaction';
30-
import { TransactionAnnounceResponse } from '../../src/model/transaction/TransactionAnnounceResponse';
31-
import { TransactionStatusError } from '../../src/model/transaction/TransactionStatusError';
32-
import { TransferTransaction } from '../../src/model/transaction/TransferTransaction';
33-
import { UInt64 } from '../../src/model/UInt64';
34-
import { TransactionService } from '../../src/service/TransactionService';
24+
import { PlainMessage } from '../../src/model/message';
25+
import { NetworkType } from '../../src/model/network';
26+
import {
27+
AggregateTransaction,
28+
Deadline,
29+
HashLockTransaction,
30+
TransactionAnnounceResponse,
31+
TransactionStatusError,
32+
TransferTransaction,
33+
} from '../../src/model/transaction';
34+
import { TransactionService } from '../../src/service';
3535
import { NetworkCurrencyLocal } from '../model/mosaic/Currency.spec';
3636

3737
/**
@@ -81,6 +81,30 @@ describe('TransactionService', () => {
8181
listener = mock();
8282
});
8383

84+
it('announce transaction when reject promise', async () => {
85+
const signedTransaction = account.sign(transferTransaction, generationHash);
86+
when(transactionRepositoryMock.announce(deepEqual(signedTransaction))).thenReturn(from(Promise.reject(Error('break this!'))));
87+
const service = new TransactionService(instance(transactionRepositoryMock), instance(mockedReceiptRepository));
88+
try {
89+
await service.announce(signedTransaction, instance(listener)).toPromise();
90+
expect(false).true;
91+
} catch (e) {
92+
expect(e.message).eq('break this!');
93+
}
94+
});
95+
96+
it('announce transaction when exception', async () => {
97+
const signedTransaction = account.sign(transferTransaction, generationHash);
98+
when(transactionRepositoryMock.announce(deepEqual(signedTransaction))).thenThrow(Error('break this!'));
99+
const service = new TransactionService(instance(transactionRepositoryMock), instance(mockedReceiptRepository));
100+
try {
101+
await service.announce(signedTransaction, instance(listener)).toPromise();
102+
expect(false).true;
103+
} catch (e) {
104+
expect(e.message).eq('break this!');
105+
}
106+
});
107+
84108
it('announce when valid transaction', async () => {
85109
const signedTransaction = account.sign(transferTransaction, generationHash);
86110

0 commit comments

Comments
 (0)