1+ package main
2+
3+ import (
4+ "encoding/json"
5+ "net/http"
6+ "net/http/httptest"
7+ "testing"
8+ "time"
9+
10+ "github.com/stretchr/testify/require"
11+ )
12+
13+ func TestListTransactionsPagination (t * testing.T ) {
14+ // Create a server with some test transactions
15+ server := & Server {
16+ transactions : []TrackedTx {
17+ {Timestamp : time .Now (), Type : "register_property" , TxHash : "hash1" },
18+ {Timestamp : time .Now (), Type : "transfer_shares" , TxHash : "hash2" },
19+ {Timestamp : time .Now (), Type : "edit_property_metadata" , TxHash : "hash3" },
20+ {Timestamp : time .Now (), Type : "register_property" , TxHash : "hash4" },
21+ {Timestamp : time .Now (), Type : "transfer_shares" , TxHash : "hash5" },
22+ {Timestamp : time .Now (), Type : "register_property" , TxHash : "hash6" },
23+ {Timestamp : time .Now (), Type : "transfer_shares" , TxHash : "hash7" },
24+ },
25+ }
26+
27+ tests := []struct {
28+ name string
29+ queryParams string
30+ expectedCount int
31+ expectedPage int
32+ expectedTotal int
33+ expectedHasNext bool
34+ expectedHasPrev bool
35+ }{
36+ {
37+ name : "Default pagination" ,
38+ queryParams : "" ,
39+ expectedCount : 7 , // All transactions since we have less than default 50
40+ expectedPage : 1 ,
41+ expectedTotal : 7 ,
42+ expectedHasNext : false ,
43+ expectedHasPrev : false ,
44+ },
45+ {
46+ name : "First page with limit 3" ,
47+ queryParams : "?page=1&page_size=3" ,
48+ expectedCount : 3 ,
49+ expectedPage : 1 ,
50+ expectedTotal : 7 ,
51+ expectedHasNext : true ,
52+ expectedHasPrev : false ,
53+ },
54+ {
55+ name : "Second page with limit 3" ,
56+ queryParams : "?page=2&page_size=3" ,
57+ expectedCount : 3 ,
58+ expectedPage : 2 ,
59+ expectedTotal : 7 ,
60+ expectedHasNext : true ,
61+ expectedHasPrev : true ,
62+ },
63+ {
64+ name : "Third page with limit 3" ,
65+ queryParams : "?page=3&page_size=3" ,
66+ expectedCount : 1 , // Last page with remaining transaction
67+ expectedPage : 3 ,
68+ expectedTotal : 7 ,
69+ expectedHasNext : false ,
70+ expectedHasPrev : true ,
71+ },
72+ {
73+ name : "Page beyond available data" ,
74+ queryParams : "?page=10&page_size=3" ,
75+ expectedCount : 0 ,
76+ expectedPage : 10 ,
77+ expectedTotal : 7 ,
78+ expectedHasNext : false ,
79+ expectedHasPrev : true ,
80+ },
81+ {
82+ name : "Large page size" ,
83+ queryParams : "?page=1&page_size=100" ,
84+ expectedCount : 7 ,
85+ expectedPage : 1 ,
86+ expectedTotal : 7 ,
87+ expectedHasNext : false ,
88+ expectedHasPrev : false ,
89+ },
90+ }
91+
92+ for _ , tt := range tests {
93+ t .Run (tt .name , func (t * testing.T ) {
94+ req , err := http .NewRequest ("GET" , "/tx/list" + tt .queryParams , nil )
95+ require .NoError (t , err )
96+
97+ rr := httptest .NewRecorder ()
98+ server .listTransactionsHandler (rr , req )
99+
100+ require .Equal (t , http .StatusOK , rr .Code )
101+ require .Equal (t , "application/json" , rr .Header ().Get ("Content-Type" ))
102+
103+ var response PaginatedTransactionsResponse
104+ err = json .Unmarshal (rr .Body .Bytes (), & response )
105+ require .NoError (t , err )
106+
107+ require .Equal (t , tt .expectedCount , len (response .Transactions ))
108+ require .Equal (t , tt .expectedPage , response .Page )
109+ require .Equal (t , tt .expectedTotal , response .Total )
110+ require .Equal (t , tt .expectedHasNext , response .HasNext )
111+ require .Equal (t , tt .expectedHasPrev , response .HasPrev )
112+ })
113+ }
114+ }
115+
116+ func TestListTransactionsPaginationEdgeCases (t * testing.T ) {
117+ // Create a server with no transactions
118+ server := & Server {
119+ transactions : []TrackedTx {},
120+ }
121+
122+ req , err := http .NewRequest ("GET" , "/tx/list" , nil )
123+ require .NoError (t , err )
124+
125+ rr := httptest .NewRecorder ()
126+ server .listTransactionsHandler (rr , req )
127+
128+ require .Equal (t , http .StatusOK , rr .Code )
129+
130+ var response PaginatedTransactionsResponse
131+ err = json .Unmarshal (rr .Body .Bytes (), & response )
132+ require .NoError (t , err )
133+
134+ require .Equal (t , 0 , len (response .Transactions ))
135+ require .Equal (t , 1 , response .Page )
136+ require .Equal (t , 0 , response .Total )
137+ require .Equal (t , false , response .HasNext )
138+ require .Equal (t , false , response .HasPrev )
139+ }
140+
141+ func TestListTransactionsPaginationInvalidParams (t * testing.T ) {
142+ server := & Server {
143+ transactions : []TrackedTx {
144+ {Timestamp : time .Now (), Type : "register_property" , TxHash : "hash1" },
145+ {Timestamp : time .Now (), Type : "transfer_shares" , TxHash : "hash2" },
146+ },
147+ }
148+
149+ tests := []struct {
150+ name string
151+ queryParams string
152+ expectedPage int
153+ expectedPageSize int
154+ }{
155+ {
156+ name : "Invalid page number" ,
157+ queryParams : "?page=invalid&page_size=10" ,
158+ expectedPage : 1 , // Should default to 1
159+ expectedPageSize : 10 ,
160+ },
161+ {
162+ name : "Invalid page size" ,
163+ queryParams : "?page=1&page_size=invalid" ,
164+ expectedPage : 1 ,
165+ expectedPageSize : 50 , // Should default to 50
166+ },
167+ {
168+ name : "Negative page number" ,
169+ queryParams : "?page=-1&page_size=10" ,
170+ expectedPage : 1 , // Should default to 1
171+ expectedPageSize : 10 ,
172+ },
173+ {
174+ name : "Zero page size" ,
175+ queryParams : "?page=1&page_size=0" ,
176+ expectedPage : 1 ,
177+ expectedPageSize : 50 , // Should default to 50
178+ },
179+ {
180+ name : "Excessive page size" ,
181+ queryParams : "?page=1&page_size=2000" ,
182+ expectedPage : 1 ,
183+ expectedPageSize : 1000 , // Should cap at 1000
184+ },
185+ }
186+
187+ for _ , tt := range tests {
188+ t .Run (tt .name , func (t * testing.T ) {
189+ req , err := http .NewRequest ("GET" , "/tx/list" + tt .queryParams , nil )
190+ require .NoError (t , err )
191+
192+ rr := httptest .NewRecorder ()
193+ server .listTransactionsHandler (rr , req )
194+
195+ require .Equal (t , http .StatusOK , rr .Code )
196+
197+ var response PaginatedTransactionsResponse
198+ err = json .Unmarshal (rr .Body .Bytes (), & response )
199+ require .NoError (t , err )
200+
201+ require .Equal (t , tt .expectedPage , response .Page )
202+ require .Equal (t , tt .expectedPageSize , response .PageSize )
203+ })
204+ }
205+ }
0 commit comments