Skip to content

Commit c6f9d58

Browse files
authored
Return [] rather than null when getTransactions is empty (#408)
1 parent da5778f commit c6f9d58

File tree

3 files changed

+113
-35
lines changed

3 files changed

+113
-35
lines changed

Diff for: cmd/stellar-rpc/internal/methods/get_transaction_test.go

+39
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,45 @@ func txMetaWithEvents(acctSeq uint32, successful bool) xdr.LedgerCloseMeta {
337337
return meta
338338
}
339339

340+
func emptyTxMeta(acctSeq uint32) xdr.LedgerCloseMeta {
341+
txProcessing := []xdr.TransactionResultMeta{}
342+
components := []xdr.TxSetComponent{
343+
{
344+
Type: xdr.TxSetComponentTypeTxsetCompTxsMaybeDiscountedFee,
345+
TxsMaybeDiscountedFee: &xdr.TxSetComponentTxsMaybeDiscountedFee{
346+
BaseFee: nil,
347+
Txs: []xdr.TransactionEnvelope{},
348+
},
349+
},
350+
}
351+
return xdr.LedgerCloseMeta{
352+
V: 1,
353+
V1: &xdr.LedgerCloseMetaV1{
354+
LedgerHeader: xdr.LedgerHeaderHistoryEntry{
355+
Header: xdr.LedgerHeader{
356+
ScpValue: xdr.StellarValue{
357+
CloseTime: xdr.TimePoint(ledgerCloseTime(acctSeq + 100)),
358+
},
359+
LedgerSeq: xdr.Uint32(acctSeq + 100),
360+
},
361+
},
362+
TxProcessing: txProcessing,
363+
TxSet: xdr.GeneralizedTransactionSet{
364+
V: 1,
365+
V1TxSet: &xdr.TransactionSetV1{
366+
PreviousLedgerHash: xdr.Hash{1},
367+
Phases: []xdr.TransactionPhase{
368+
{
369+
V: 0,
370+
V0Components: &components,
371+
},
372+
},
373+
},
374+
},
375+
},
376+
}
377+
}
378+
340379
func TestGetTransaction_JSONFormat(t *testing.T) {
341380
mockDBReader := db.NewMockTransactionStore(NetworkPassphrase)
342381
mockLedgerReader := db.NewMockLedgerReader(mockDBReader)

Diff for: cmd/stellar-rpc/internal/methods/get_transactions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ func (h transactionsRPCHandler) getTransactionsByLedgerSequence(ctx context.Cont
216216

217217
// Iterate through each ledger and its transactions until limit or end range is reached.
218218
// The latest ledger acts as the end ledger range for the request.
219-
var txns []protocol.TransactionInfo
219+
txns := make([]protocol.TransactionInfo, 0, limit)
220220
var done bool
221221
cursor := toid.New(0, 0, 0)
222222
for ledgerSeq := start.LedgerSequence; ledgerSeq <= int32(ledgerRange.LastLedger.Sequence); ledgerSeq++ {

Diff for: cmd/stellar-rpc/internal/methods/get_transactions_test.go

+73-34
Original file line numberDiff line numberDiff line change
@@ -38,40 +38,6 @@ var expectedTransactionInfo = protocol.TransactionInfo{
3838
LedgerCloseTime: 125,
3939
}
4040

41-
// createTestLedger Creates a test ledger with 2 transactions
42-
func createTestLedger(sequence uint32) xdr.LedgerCloseMeta {
43-
sequence -= 100
44-
meta := txMeta(sequence, true)
45-
meta.V1.TxProcessing = append(meta.V1.TxProcessing, xdr.TransactionResultMeta{
46-
TxApplyProcessing: xdr.TransactionMeta{
47-
V: 3,
48-
Operations: &[]xdr.OperationMeta{},
49-
V3: &xdr.TransactionMetaV3{},
50-
},
51-
Result: xdr.TransactionResultPair{
52-
TransactionHash: txHash(sequence),
53-
Result: transactionResult(false),
54-
},
55-
})
56-
return meta
57-
}
58-
59-
func setupDB(t *testing.T, numLedgers int, skipLedger int) *db.DB {
60-
testDB := NewTestDB(t)
61-
daemon := interfaces.MakeNoOpDeamon()
62-
for sequence := 1; sequence <= numLedgers; sequence++ {
63-
if sequence == skipLedger {
64-
continue
65-
}
66-
ledgerCloseMeta := createTestLedger(uint32(sequence))
67-
tx, err := db.NewReadWriter(log.DefaultLogger, testDB, daemon, 150, 100, passphrase).NewTx(context.Background())
68-
require.NoError(t, err)
69-
require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta))
70-
require.NoError(t, tx.Commit(ledgerCloseMeta))
71-
}
72-
return testDB
73-
}
74-
7541
func TestGetTransactions_DefaultLimit(t *testing.T) { //nolint:dupl
7642
testDB := setupDB(t, 10, 0)
7743
handler := transactionsRPCHandler{
@@ -293,3 +259,76 @@ func TestGetTransactions_JSONFormat(t *testing.T) {
293259
require.Nilf(t, tx["resultMetaXdr"], "field: 'resultMetaXdr'")
294260
require.NotNilf(t, tx["resultMetaJson"], "field: 'resultMetaJson'")
295261
}
262+
263+
func TestGetTransactions_NoResults(t *testing.T) {
264+
testDB := setupDBNoTxs(t, 5)
265+
handler := transactionsRPCHandler{
266+
ledgerReader: db.NewLedgerReader(testDB),
267+
maxLimit: 100,
268+
defaultLimit: 10,
269+
networkPassphrase: NetworkPassphrase,
270+
}
271+
272+
request := protocol.GetTransactionsRequest{
273+
StartLedger: 1,
274+
}
275+
276+
txns, err := handler.getTransactionsByLedgerSequence(context.TODO(), request)
277+
require.NoError(t, err)
278+
require.NotNil(t, txns.Transactions)
279+
require.Empty(t, txns.Transactions)
280+
}
281+
282+
// createTestLedger Creates a test ledger with 2 transactions
283+
func createTestLedger(sequence uint32) xdr.LedgerCloseMeta {
284+
sequence -= 100
285+
meta := txMeta(sequence, true)
286+
meta.V1.TxProcessing = append(meta.V1.TxProcessing, xdr.TransactionResultMeta{
287+
TxApplyProcessing: xdr.TransactionMeta{
288+
V: 3,
289+
Operations: &[]xdr.OperationMeta{},
290+
V3: &xdr.TransactionMetaV3{},
291+
},
292+
Result: xdr.TransactionResultPair{
293+
TransactionHash: txHash(sequence),
294+
Result: transactionResult(false),
295+
},
296+
})
297+
return meta
298+
}
299+
300+
// createTestLedger Creates a test ledger with 2 transactions
301+
func createEmptyTestLedger(sequence uint32) xdr.LedgerCloseMeta {
302+
sequence -= 100
303+
return emptyTxMeta(sequence)
304+
}
305+
306+
func setupDB(t *testing.T, numLedgers int, skipLedger int) *db.DB {
307+
testDB := NewTestDB(t)
308+
daemon := interfaces.MakeNoOpDeamon()
309+
for sequence := 1; sequence <= numLedgers; sequence++ {
310+
if sequence == skipLedger {
311+
continue
312+
}
313+
ledgerCloseMeta := createTestLedger(uint32(sequence))
314+
tx, err := db.NewReadWriter(log.DefaultLogger, testDB, daemon, 150, 100, passphrase).NewTx(context.Background())
315+
require.NoError(t, err)
316+
require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta))
317+
require.NoError(t, tx.Commit(ledgerCloseMeta))
318+
}
319+
return testDB
320+
}
321+
322+
func setupDBNoTxs(t *testing.T, numLedgers int) *db.DB {
323+
testDB := NewTestDB(t)
324+
daemon := interfaces.MakeNoOpDeamon()
325+
for sequence := 1; sequence <= numLedgers; sequence++ {
326+
ledgerCloseMeta := createEmptyTestLedger(uint32(sequence))
327+
328+
tx, err := db.NewReadWriter(log.DefaultLogger, testDB, daemon, 150, 100, passphrase).NewTx(context.Background())
329+
require.NoError(t, err)
330+
require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta))
331+
require.NoError(t, tx.Commit(ledgerCloseMeta))
332+
}
333+
return testDB
334+
}

0 commit comments

Comments
 (0)