@@ -2,7 +2,6 @@ import untypedTest, { TestFn } from 'ava'
22import { Adapter , AdapterEndpoint } from '../../src/adapter'
33import { AdapterConfig } from '../../src/config'
44import { TransportRoutes } from '../../src/transports'
5- import { AdapterRequest } from '../../src/util'
65import { NopTransport , NopTransportTypes , TestAdapter } from '../../src/util/testing-utils'
76
87const test = untypedTest as TestFn < { testAdapter : TestAdapter } >
@@ -25,8 +24,8 @@ function tsResponse(result: unknown) {
2524}
2625
2726function buildFallbackAdapter (
28- primary : NopTransport < NopTransportTypes > ,
29- fallback : NopTransport < NopTransportTypes > ,
27+ primary ?: ( ) => Promise < ReturnType < typeof tsResponse > > ,
28+ fallback ?: ( ) => Promise < ReturnType < typeof tsResponse > > ,
3029) {
3130 const config = new AdapterConfig (
3231 { } ,
@@ -44,61 +43,124 @@ function buildFallbackAdapter(
4443 new AdapterEndpoint < NopTransportTypes > ( {
4544 name : 'price' ,
4645 transportRoutes : new TransportRoutes < NopTransportTypes > ( )
47- . register ( 'primary' , primary )
48- . register ( 'fallback' , fallback ) ,
46+ . register (
47+ 'primary' ,
48+ primary
49+ ? new ( class extends NopTransport < NopTransportTypes > {
50+ override async foregroundExecute ( ) {
51+ return primary ( )
52+ }
53+ } ) ( )
54+ : new NopTransport ( ) ,
55+ )
56+ . register (
57+ 'fallback' ,
58+ fallback
59+ ? new ( class extends NopTransport < NopTransportTypes > {
60+ override async foregroundExecute ( ) {
61+ return fallback ( )
62+ }
63+ } ) ( )
64+ : new NopTransport ( ) ,
65+ ) ,
4966 defaultTransport : 'primary' ,
5067 fallbackTransport : { primary : 'fallback' } ,
5168 } ) ,
5269 ] ,
5370 } )
5471}
5572
56- test . serial ( 'uses primary transport when it returns before fallback' , async ( t ) => {
73+ test . serial ( 'uses primary when both primary and fallback succeed ' , async ( t ) => {
5774 const adapter = buildFallbackAdapter (
58- new ( class extends NopTransport < NopTransportTypes > {
59- override async foregroundExecute ( _req : AdapterRequest < NopTransportTypes [ 'Parameters' ] > ) {
60- return tsResponse ( 'primary' )
61- }
62- } ) ( ) ,
63- new ( class extends NopTransport < NopTransportTypes > {
64- override async foregroundExecute ( _req : AdapterRequest < NopTransportTypes [ 'Parameters' ] > ) {
65- await new Promise ( ( r ) => {
66- setTimeout ( r , 500 )
67- } )
68- return tsResponse ( 'fallback' )
69- }
70- } ) ( ) ,
75+ ( ) => Promise . resolve ( tsResponse ( 'primary' ) ) ,
76+ ( ) => Promise . resolve ( tsResponse ( 'fallback' ) ) ,
7177 )
78+ const testAdapter = await TestAdapter . start ( adapter , t . context )
79+
80+ const response = await testAdapter . request ( { } )
7281
82+ t . is ( response . statusCode , 200 )
83+ t . is ( response . json ( ) . result , 'primary' )
84+ } )
85+
86+ test . serial ( 'uses primary when fallback stalls' , async ( t ) => {
87+ const adapter = buildFallbackAdapter (
88+ ( ) => Promise . resolve ( tsResponse ( 'primary' ) ) ,
89+ async ( ) => {
90+ await new Promise ( ( r ) => {
91+ setTimeout ( r , 500 )
92+ } )
93+ return tsResponse ( 'fallback' )
94+ } ,
95+ )
7396 const testAdapter = await TestAdapter . start ( adapter , t . context )
7497 const started = Date . now ( )
98+
7599 const response = await testAdapter . request ( { } )
100+
76101 t . is ( response . statusCode , 200 )
77102 t . is ( response . json ( ) . result , 'primary' )
78103 t . true ( Date . now ( ) - started < 200 , 'should not wait for slow fallback path' )
79104} )
80105
81- test . serial ( 'uses fallback when primary does not return data' , async ( t ) => {
106+ test . serial ( 'uses primary when fallback failed' , async ( t ) => {
107+ const adapter = buildFallbackAdapter (
108+ ( ) => Promise . resolve ( tsResponse ( 'primary' ) ) ,
109+ ( ) => Promise . reject ( new Error ( 'Fallback fail' ) ) ,
110+ )
111+ const testAdapter = await TestAdapter . start ( adapter , t . context )
112+
113+ const response = await testAdapter . request ( { } )
114+
115+ t . is ( response . statusCode , 200 )
116+ t . is ( response . json ( ) . result , 'primary' )
117+ } )
118+
119+ test . serial ( 'uses primary when primary stalls' , async ( t ) => {
120+ const adapter = buildFallbackAdapter (
121+ async ( ) => {
122+ await new Promise ( ( r ) => {
123+ setTimeout ( r , 500 )
124+ } )
125+ return tsResponse ( 'primary' )
126+ } ,
127+ ( ) => Promise . resolve ( tsResponse ( 'fallback' ) ) ,
128+ )
129+ const testAdapter = await TestAdapter . start ( adapter , t . context )
130+
131+ const response = await testAdapter . request ( { } )
132+
133+ t . is ( response . statusCode , 200 )
134+ t . is ( response . json ( ) . result , 'primary' )
135+ } )
136+
137+ test . serial ( 'uses fallback when primary throw exception' , async ( t ) => {
82138 const adapter = buildFallbackAdapter (
83- new NopTransport ( ) ,
84- new ( class extends NopTransport < NopTransportTypes > {
85- override async foregroundExecute ( _req : AdapterRequest < NopTransportTypes [ 'Parameters' ] > ) {
86- return tsResponse ( 'from-fallback' )
87- }
88- } ) ( ) ,
139+ ( ) => Promise . reject ( new Error ( 'Primary fail' ) ) ,
140+ ( ) => Promise . resolve ( tsResponse ( 'fallback' ) ) ,
89141 )
142+ const testAdapter = await TestAdapter . start ( adapter , t . context )
143+
144+ const response = await testAdapter . request ( { } )
90145
146+ t . is ( response . statusCode , 200 )
147+ t . is ( response . json ( ) . result , 'fallback' )
148+ } )
149+
150+ test . serial ( 'uses fallback when primary does not return data' , async ( t ) => {
151+ const adapter = buildFallbackAdapter ( undefined , ( ) => Promise . resolve ( tsResponse ( 'fallback' ) ) )
91152 const testAdapter = await TestAdapter . start ( adapter , t . context )
153+
92154 const response = await testAdapter . request ( { } )
93155
94156 t . is ( response . statusCode , 200 )
95- t . is ( response . json ( ) . result , 'from- fallback' )
157+ t . is ( response . json ( ) . result , 'fallback' )
96158} )
97159
98160test . serial ( 'returns timeout when primary and fallback both fail' , async ( t ) => {
99- const adapter = buildFallbackAdapter ( new NopTransport ( ) , new NopTransport ( ) )
100-
161+ const adapter = buildFallbackAdapter ( )
101162 const testAdapter = await TestAdapter . start ( adapter , t . context )
163+
102164 const response = await testAdapter . request ( { } )
103165
104166 t . is ( response . statusCode , 504 )
0 commit comments