@@ -1012,6 +1012,199 @@ func TestGetEvents(t *testing.T) {
10121012 results ,
10131013 )
10141014 })
1015+
1016+ t .Run ("with descending order" , func (t * testing.T ) {
1017+ dbx := newTestDB (t )
1018+ ctx := context .TODO ()
1019+ log := log .DefaultLogger
1020+ log .SetLevel (logrus .TraceLevel )
1021+
1022+ writer := db .NewReadWriter (log , dbx , interfaces .MakeNoOpDeamon (), 10 , 10 , passphrase )
1023+ write , err := writer .NewTx (ctx )
1024+ require .NoError (t , err )
1025+
1026+ ledgerW , eventW := write .LedgerWriter (), write .EventWriter ()
1027+ store := db .NewEventReader (log , dbx , passphrase )
1028+
1029+ contractID := xdr .ContractId ([32 ]byte {})
1030+ var txMeta []xdr.TransactionMeta
1031+ for i := range 5 {
1032+ number := xdr .Uint64 (i )
1033+ txMeta = append (txMeta , transactionMetaWithEvents (
1034+ contractEvent (
1035+ contractID ,
1036+ xdr.ScVec {
1037+ xdr.ScVal {Type : xdr .ScValTypeScvSymbol , Sym : & counter },
1038+ },
1039+ xdr.ScVal {Type : xdr .ScValTypeScvU64 , U64 : & number },
1040+ ),
1041+ ))
1042+ }
1043+ ledgerCloseMeta := ledgerCloseMetaWithEvents (1 , now .Unix (), txMeta ... )
1044+ require .NoError (t , ledgerW .InsertLedger (ledgerCloseMeta ), "ingestion failed for ledger" )
1045+ require .NoError (t , eventW .InsertEvents (ledgerCloseMeta ), "ingestion failed for events" )
1046+ require .NoError (t , write .Commit (ledgerCloseMeta , nil ))
1047+
1048+ handler := eventsRPCHandler {
1049+ dbReader : store ,
1050+ maxLimit : 10000 ,
1051+ defaultLimit : 100 ,
1052+ ledgerReader : db .NewLedgerReader (dbx ),
1053+ }
1054+
1055+ // Test descending order returns events in reverse order
1056+ results , err := handler .getEvents (ctx , protocol.GetEventsRequest {
1057+ StartLedger : 1 ,
1058+ Pagination : & protocol.PaginationOptions {
1059+ Order : protocol .EventOrderDesc ,
1060+ },
1061+ })
1062+ require .NoError (t , err )
1063+ require .Len (t , results .Events , 5 )
1064+
1065+ // Verify events are returned in descending order (tx 5, 4, 3, 2, 1)
1066+ for i , event := range results .Events {
1067+ expectedTxIndex := uint32 (5 - i )
1068+ assert .Equal (t , expectedTxIndex , event .TxIndex ,
1069+ "event %d should have TxIndex %d" , i , expectedTxIndex )
1070+ }
1071+ })
1072+
1073+ t .Run ("descending order with limit" , func (t * testing.T ) {
1074+ dbx := newTestDB (t )
1075+ ctx := context .TODO ()
1076+ log := log .DefaultLogger
1077+ log .SetLevel (logrus .TraceLevel )
1078+
1079+ writer := db .NewReadWriter (log , dbx , interfaces .MakeNoOpDeamon (), 10 , 10 , passphrase )
1080+ write , err := writer .NewTx (ctx )
1081+ require .NoError (t , err )
1082+
1083+ ledgerW , eventW := write .LedgerWriter (), write .EventWriter ()
1084+ store := db .NewEventReader (log , dbx , passphrase )
1085+
1086+ contractID := xdr .ContractId ([32 ]byte {})
1087+ var txMeta []xdr.TransactionMeta
1088+ for i := range 10 {
1089+ number := xdr .Uint64 (i )
1090+ txMeta = append (txMeta , transactionMetaWithEvents (
1091+ contractEvent (
1092+ contractID ,
1093+ xdr.ScVec {
1094+ xdr.ScVal {Type : xdr .ScValTypeScvSymbol , Sym : & counter },
1095+ },
1096+ xdr.ScVal {Type : xdr .ScValTypeScvU64 , U64 : & number },
1097+ ),
1098+ ))
1099+ }
1100+ ledgerCloseMeta := ledgerCloseMetaWithEvents (1 , now .Unix (), txMeta ... )
1101+ require .NoError (t , ledgerW .InsertLedger (ledgerCloseMeta ), "ingestion failed for ledger" )
1102+ require .NoError (t , eventW .InsertEvents (ledgerCloseMeta ), "ingestion failed for events" )
1103+ require .NoError (t , write .Commit (ledgerCloseMeta , nil ))
1104+
1105+ handler := eventsRPCHandler {
1106+ dbReader : store ,
1107+ maxLimit : 10000 ,
1108+ defaultLimit : 100 ,
1109+ ledgerReader : db .NewLedgerReader (dbx ),
1110+ }
1111+
1112+ // Test descending order with limit returns the N newest events
1113+ results , err := handler .getEvents (ctx , protocol.GetEventsRequest {
1114+ StartLedger : 1 ,
1115+ Pagination : & protocol.PaginationOptions {
1116+ Limit : 3 ,
1117+ Order : protocol .EventOrderDesc ,
1118+ },
1119+ })
1120+ require .NoError (t , err )
1121+ require .Len (t , results .Events , 3 )
1122+
1123+ // Should return the 3 newest events (tx 10, 9, 8 in that order)
1124+ assert .Equal (t , uint32 (10 ), results .Events [0 ].TxIndex )
1125+ assert .Equal (t , uint32 (9 ), results .Events [1 ].TxIndex )
1126+ assert .Equal (t , uint32 (8 ), results .Events [2 ].TxIndex )
1127+ })
1128+
1129+ t .Run ("invalid order parameter" , func (t * testing.T ) {
1130+ dbx := newTestDB (t )
1131+ log := log .DefaultLogger
1132+ log .SetLevel (logrus .TraceLevel )
1133+ store := db .NewEventReader (log , dbx , passphrase )
1134+
1135+ handler := eventsRPCHandler {
1136+ dbReader : store ,
1137+ maxLimit : 10000 ,
1138+ defaultLimit : 100 ,
1139+ ledgerReader : db .NewLedgerReader (dbx ),
1140+ }
1141+
1142+ _ , err := handler .getEvents (context .TODO (), protocol.GetEventsRequest {
1143+ StartLedger : 1 ,
1144+ Pagination : & protocol.PaginationOptions {
1145+ Order : "invalid" ,
1146+ },
1147+ })
1148+ require .Error (t , err )
1149+ require .Contains (t , err .Error (), "order must be 'asc' or 'desc'" )
1150+ })
1151+
1152+ t .Run ("ascending order explicitly set" , func (t * testing.T ) {
1153+ dbx := newTestDB (t )
1154+ ctx := context .TODO ()
1155+ log := log .DefaultLogger
1156+ log .SetLevel (logrus .TraceLevel )
1157+
1158+ writer := db .NewReadWriter (log , dbx , interfaces .MakeNoOpDeamon (), 10 , 10 , passphrase )
1159+ write , err := writer .NewTx (ctx )
1160+ require .NoError (t , err )
1161+
1162+ ledgerW , eventW := write .LedgerWriter (), write .EventWriter ()
1163+ store := db .NewEventReader (log , dbx , passphrase )
1164+
1165+ contractID := xdr .ContractId ([32 ]byte {})
1166+ var txMeta []xdr.TransactionMeta
1167+ for i := range 5 {
1168+ number := xdr .Uint64 (i )
1169+ txMeta = append (txMeta , transactionMetaWithEvents (
1170+ contractEvent (
1171+ contractID ,
1172+ xdr.ScVec {
1173+ xdr.ScVal {Type : xdr .ScValTypeScvSymbol , Sym : & counter },
1174+ },
1175+ xdr.ScVal {Type : xdr .ScValTypeScvU64 , U64 : & number },
1176+ ),
1177+ ))
1178+ }
1179+ ledgerCloseMeta := ledgerCloseMetaWithEvents (1 , now .Unix (), txMeta ... )
1180+ require .NoError (t , ledgerW .InsertLedger (ledgerCloseMeta ), "ingestion failed for ledger" )
1181+ require .NoError (t , eventW .InsertEvents (ledgerCloseMeta ), "ingestion failed for events" )
1182+ require .NoError (t , write .Commit (ledgerCloseMeta , nil ))
1183+
1184+ handler := eventsRPCHandler {
1185+ dbReader : store ,
1186+ maxLimit : 10000 ,
1187+ defaultLimit : 100 ,
1188+ ledgerReader : db .NewLedgerReader (dbx ),
1189+ }
1190+
1191+ // Test explicitly set ascending order
1192+ results , err := handler .getEvents (ctx , protocol.GetEventsRequest {
1193+ StartLedger : 1 ,
1194+ Pagination : & protocol.PaginationOptions {
1195+ Order : protocol .EventOrderAsc ,
1196+ },
1197+ })
1198+ require .NoError (t , err )
1199+ require .Len (t , results .Events , 5 )
1200+
1201+ // Verify events are returned in ascending order (tx 1, 2, 3, 4, 5)
1202+ for i , event := range results .Events {
1203+ expectedTxIndex := uint32 (i + 1 )
1204+ assert .Equal (t , expectedTxIndex , event .TxIndex ,
1205+ "event %d should have TxIndex %d" , i , expectedTxIndex )
1206+ }
1207+ })
10151208}
10161209
10171210func BenchmarkGetEvents (b * testing.B ) {
0 commit comments