1+ /**
2+ * Tests for RequestQueue
3+ *
4+ * Run with: npm test or yarn test
5+ */
6+
7+ import { RequestQueue } from '../queue'
8+
9+ describe ( 'RequestQueue' , ( ) => {
10+ let queue
11+
12+ beforeEach ( ( ) => {
13+ queue = new RequestQueue ( )
14+ } )
15+
16+ test ( 'should process single request' , async ( ) => {
17+ const result = await queue . enqueue ( async ( ) => {
18+ return 'test-result'
19+ } )
20+
21+ expect ( result ) . toBe ( 'test-result' )
22+ } )
23+
24+ test ( 'should process multiple concurrent requests sequentially' , async ( ) => {
25+ const results = [ ]
26+ const delays = [ 50 , 30 , 10 ] // Different delays to test sequencing
27+
28+ const promises = delays . map ( ( delay , index ) =>
29+ queue . enqueue ( async ( ) => {
30+ await new Promise ( resolve => setTimeout ( resolve , delay ) )
31+ results . push ( index )
32+ return index
33+ } )
34+ )
35+
36+ const values = await Promise . all ( promises )
37+
38+ // Results should be in order [0, 1, 2] because of queue sequencing
39+ expect ( results ) . toEqual ( [ 0 , 1 , 2 ] )
40+ expect ( values ) . toEqual ( [ 0 , 1 , 2 ] )
41+ } )
42+
43+ test ( 'should handle request errors without blocking queue' , async ( ) => {
44+ const results = [ ]
45+
46+ const promise1 = queue . enqueue ( async ( ) => {
47+ results . push ( 1 )
48+ return 1
49+ } )
50+
51+ const promise2 = queue . enqueue ( async ( ) => {
52+ results . push ( 2 )
53+ throw new Error ( 'Test error' )
54+ } )
55+
56+ const promise3 = queue . enqueue ( async ( ) => {
57+ results . push ( 3 )
58+ return 3
59+ } )
60+
61+ const result1 = await promise1
62+ await expect ( promise2 ) . rejects . toThrow ( 'Test error' )
63+ const result3 = await promise3
64+
65+ expect ( result1 ) . toBe ( 1 )
66+ expect ( result3 ) . toBe ( 3 )
67+ expect ( results ) . toEqual ( [ 1 , 2 , 3 ] )
68+ } )
69+
70+ test ( 'should return correct queue size' , ( ) => {
71+ expect ( queue . size ( ) ) . toBe ( 0 )
72+
73+ queue . enqueue ( async ( ) => {
74+ await new Promise ( resolve => setTimeout ( resolve , 100 ) )
75+ } )
76+
77+ queue . enqueue ( async ( ) => 'test' )
78+ queue . enqueue ( async ( ) => 'test2' )
79+
80+ // First request is processing, so queue size should be 2
81+ expect ( queue . size ( ) ) . toBeGreaterThanOrEqual ( 0 )
82+ } )
83+
84+ test ( 'should clear pending requests' , async ( ) => {
85+ // Add requests
86+ queue . enqueue ( async ( ) => {
87+ await new Promise ( resolve => setTimeout ( resolve , 100 ) )
88+ } )
89+
90+ queue . enqueue ( async ( ) => 'test' )
91+
92+ // Clear queue
93+ queue . clear ( )
94+
95+ expect ( queue . size ( ) ) . toBe ( 0 )
96+ } )
97+
98+ test ( 'should simulate concurrent API calls' , async ( ) => {
99+ const mockApiCall = ( id , delay = 10 ) => {
100+ return queue . enqueue ( async ( ) => {
101+ await new Promise ( resolve => setTimeout ( resolve , delay ) )
102+ return { id, timestamp : Date . now ( ) }
103+ } )
104+ }
105+
106+ // Simulate concurrent calls
107+ const results = await Promise . all ( [
108+ mockApiCall ( 'call1' , 30 ) ,
109+ mockApiCall ( 'call2' , 20 ) ,
110+ mockApiCall ( 'call3' , 10 )
111+ ] )
112+
113+ // All calls should complete successfully
114+ expect ( results ) . toHaveLength ( 3 )
115+ expect ( results [ 0 ] . id ) . toBe ( 'call1' )
116+ expect ( results [ 1 ] . id ) . toBe ( 'call2' )
117+ expect ( results [ 2 ] . id ) . toBe ( 'call3' )
118+
119+ // Timestamps should be in order (sequential execution)
120+ expect ( results [ 0 ] . timestamp ) . toBeLessThanOrEqual ( results [ 1 ] . timestamp )
121+ expect ( results [ 1 ] . timestamp ) . toBeLessThanOrEqual ( results [ 2 ] . timestamp )
122+ } )
123+ } )
0 commit comments