@@ -166,4 +166,100 @@ describe('mockResource', () => {
166166 expect ( handle . ref . status ( ) ) . toBe ( 'error' ) ;
167167 } ) ;
168168 } ) ;
169+
170+ describe ( 'response sequence' , ( ) => {
171+ it ( 'applies first entry on initial factory call' , ( ) => {
172+ const handle = mockResource < string [ ] > ( TOKEN as never , {
173+ sequence : [ { value : [ 'a' ] } , { value : [ 'b' ] } ] ,
174+ } ) ;
175+ const fn = handle . useFactory ! ( ) as FakeFn ;
176+ fn ( ) ;
177+ expect ( handle . ref . status ( ) ) . toBe ( 'resolved' ) ;
178+ expect ( handle . ref . value ( ) ) . toEqual ( [ 'a' ] ) ;
179+ } ) ;
180+
181+ it ( 'advances to the next entry on each factory call' , ( ) => {
182+ const handle = mockResource < string [ ] > ( TOKEN as never , {
183+ sequence : [ { value : [ 'first' ] } , { value : [ 'second' ] } ] ,
184+ } ) ;
185+ const fn = handle . useFactory ! ( ) as FakeFn ;
186+ fn ( ) ;
187+ expect ( handle . ref . value ( ) ) . toEqual ( [ 'first' ] ) ;
188+ fn ( ) ;
189+ expect ( handle . ref . value ( ) ) . toEqual ( [ 'second' ] ) ;
190+ } ) ;
191+
192+ it ( 'also advances on reload() when in resolved state' , ( ) => {
193+ const handle = mockResource < string [ ] > ( TOKEN as never , {
194+ sequence : [ { value : [ 'v1' ] } , { value : [ 'v2' ] } ] ,
195+ } ) ;
196+ const fn = handle . useFactory ! ( ) as FakeFn ;
197+ fn ( ) ;
198+ expect ( handle . ref . value ( ) ) . toEqual ( [ 'v1' ] ) ;
199+ handle . ref . reload ( ) ; // reload() calls _notifyRequest internally → advances sequence
200+ expect ( handle . ref . value ( ) ) . toEqual ( [ 'v2' ] ) ;
201+ } ) ;
202+
203+ it ( 'error-then-success pattern' , ( ) => {
204+ const err = new Error ( 'timeout' ) ;
205+ const handle = mockResource < number > ( TOKEN as never , {
206+ sequence : [ { error : err } , { value : 42 } ] ,
207+ } ) ;
208+ const fn = handle . useFactory ! ( ) as FakeFn ;
209+ fn ( ) ; // call 1 → error
210+ expect ( handle . ref . status ( ) ) . toBe ( 'error' ) ;
211+ expect ( handle . ref . error ( ) ) . toBe ( err ) ;
212+ fn ( ) ; // call 2 → success (simulates param change / retry)
213+ expect ( handle . ref . status ( ) ) . toBe ( 'resolved' ) ;
214+ expect ( handle . ref . value ( ) ) . toBe ( 42 ) ;
215+ } ) ;
216+
217+ it ( 'loading → resolved pattern' , ( ) => {
218+ const handle = mockResource < string > ( TOKEN as never , {
219+ sequence : [ { loading : true } , { value : 'done' } ] ,
220+ } ) ;
221+ const fn = handle . useFactory ! ( ) as FakeFn ;
222+ fn ( ) ; // call 1 → loading
223+ expect ( handle . ref . isLoading ( ) ) . toBe ( true ) ;
224+ fn ( ) ; // call 2 → resolved
225+ expect ( handle . ref . value ( ) ) . toBe ( 'done' ) ;
226+ } ) ;
227+
228+ it ( 'repeats last entry when sequence is exhausted' , ( ) => {
229+ const handle = mockResource < number > ( TOKEN as never , {
230+ sequence : [ { value : 1 } , { value : 2 } ] ,
231+ } ) ;
232+ const fn = handle . useFactory ! ( ) as FakeFn ;
233+ fn ( ) ;
234+ expect ( handle . ref . value ( ) ) . toBe ( 1 ) ;
235+ fn ( ) ;
236+ expect ( handle . ref . value ( ) ) . toBe ( 2 ) ;
237+ fn ( ) ; // beyond sequence — last entry repeats
238+ expect ( handle . ref . value ( ) ) . toBe ( 2 ) ;
239+ } ) ;
240+
241+ it ( 'still tracks calls in sequence mode' , ( ) => {
242+ const handle = mockResource < string > ( TOKEN as never , {
243+ sequence : [ { value : 'x' } ] ,
244+ } ) ;
245+ const fn = handle . useFactory ! ( ) as FakeFn ;
246+ fn ( { param : 1 } ) ;
247+ expect ( handle . calls ) . toHaveLength ( 1 ) ;
248+ expect ( handle . calls [ 0 ] ) . toEqual ( [ { param : 1 } ] ) ;
249+ } ) ;
250+
251+ it ( 'delay in sequence entry: loading immediately then resolves after delay' , ( ) => {
252+ vi . useFakeTimers ( ) ;
253+ const handle = mockResource < string > ( TOKEN as never , {
254+ sequence : [ { value : 'slow' , delay : 300 } ] ,
255+ } ) ;
256+ const fn = handle . useFactory ! ( ) as FakeFn ;
257+ fn ( ) ;
258+ expect ( handle . ref . isLoading ( ) ) . toBe ( true ) ;
259+ vi . advanceTimersByTime ( 300 ) ;
260+ expect ( handle . ref . status ( ) ) . toBe ( 'resolved' ) ;
261+ expect ( handle . ref . value ( ) ) . toBe ( 'slow' ) ;
262+ vi . useRealTimers ( ) ;
263+ } ) ;
264+ } ) ;
169265} ) ;
0 commit comments