@@ -157,5 +157,260 @@ describe('Fallback Version Filtering', () => {
157
157
expect ( versionToCheck ) . toBe ( '16.8.0' ) ;
158
158
expect ( shouldExclude ) . toBe ( true ) ; // Should be excluded
159
159
} ) ;
160
+
161
+ it ( 'should simulate ProvideSharedPlugin filtering logic' , ( ) => {
162
+ // Simulate the actual filtering logic used in ProvideSharedPlugin
163
+ const testCases = [
164
+ {
165
+ name : 'include filter passes with fallbackVersion' ,
166
+ actualVersion : '1.2.0' ,
167
+ config : {
168
+ include : {
169
+ version : '^2.0.0' ,
170
+ fallbackVersion : '2.1.0' ,
171
+ } ,
172
+ } ,
173
+ expected : true , // Should provide because fallbackVersion satisfies include
174
+ } ,
175
+ {
176
+ name : 'include filter fails even with fallbackVersion' ,
177
+ actualVersion : '1.2.0' ,
178
+ config : {
179
+ include : {
180
+ version : '^2.0.0' ,
181
+ fallbackVersion : '1.5.0' ,
182
+ } ,
183
+ } ,
184
+ expected : false , // Should not provide because fallbackVersion doesn't satisfy include
185
+ } ,
186
+ {
187
+ name : 'exclude filter triggers with fallbackVersion' ,
188
+ actualVersion : '2.0.0' ,
189
+ config : {
190
+ exclude : {
191
+ version : '^1.0.0' ,
192
+ fallbackVersion : '1.5.0' ,
193
+ } ,
194
+ } ,
195
+ expected : false , // Should not provide because fallbackVersion matches exclude
196
+ } ,
197
+ {
198
+ name : 'exclude filter does not trigger with fallbackVersion' ,
199
+ actualVersion : '2.0.0' ,
200
+ config : {
201
+ exclude : {
202
+ version : '^1.0.0' ,
203
+ fallbackVersion : '3.0.0' ,
204
+ } ,
205
+ } ,
206
+ expected : true , // Should provide because fallbackVersion doesn't match exclude
207
+ } ,
208
+ ] ;
209
+
210
+ testCases . forEach ( ( testCase ) => {
211
+ // Simulate ProvideSharedPlugin include filtering logic
212
+ let shouldProvide = true ;
213
+
214
+ if ( testCase . config . include ) {
215
+ let versionIncludeFailed = false ;
216
+ if ( typeof testCase . config . include . version === 'string' ) {
217
+ if (
218
+ typeof testCase . actualVersion === 'string' &&
219
+ testCase . actualVersion
220
+ ) {
221
+ if (
222
+ ! satisfy (
223
+ testCase . actualVersion ,
224
+ testCase . config . include . version ,
225
+ )
226
+ ) {
227
+ versionIncludeFailed = true ;
228
+ }
229
+ } else {
230
+ versionIncludeFailed = true ;
231
+ }
232
+ }
233
+
234
+ // Check fallback version for include
235
+ if (
236
+ versionIncludeFailed &&
237
+ testCase . config . include &&
238
+ typeof testCase . config . include . fallbackVersion === 'string' &&
239
+ testCase . config . include . fallbackVersion
240
+ ) {
241
+ if (
242
+ satisfy (
243
+ testCase . config . include . fallbackVersion ,
244
+ testCase . config . include . version ,
245
+ )
246
+ ) {
247
+ versionIncludeFailed = false ; // fallbackVersion satisfies, so include
248
+ }
249
+ }
250
+
251
+ if ( versionIncludeFailed ) {
252
+ shouldProvide = false ;
253
+ }
254
+ }
255
+
256
+ if ( testCase . config . exclude && shouldProvide ) {
257
+ let versionExcludeMatches = false ;
258
+ if (
259
+ typeof testCase . config . exclude . version === 'string' &&
260
+ typeof testCase . actualVersion === 'string' &&
261
+ testCase . actualVersion
262
+ ) {
263
+ if (
264
+ satisfy ( testCase . actualVersion , testCase . config . exclude . version )
265
+ ) {
266
+ versionExcludeMatches = true ;
267
+ }
268
+ }
269
+
270
+ // Check fallback version for exclude
271
+ if (
272
+ ! versionExcludeMatches &&
273
+ testCase . config . exclude &&
274
+ typeof testCase . config . exclude . fallbackVersion === 'string' &&
275
+ testCase . config . exclude . fallbackVersion
276
+ ) {
277
+ if (
278
+ satisfy (
279
+ testCase . config . exclude . fallbackVersion ,
280
+ testCase . config . exclude . version ,
281
+ )
282
+ ) {
283
+ versionExcludeMatches = true ; // fallbackVersion satisfies, so exclude
284
+ }
285
+ }
286
+
287
+ if ( versionExcludeMatches ) {
288
+ shouldProvide = false ;
289
+ }
290
+ }
291
+
292
+ expect ( shouldProvide ) . toBe ( testCase . expected ) ;
293
+ } ) ;
294
+ } ) ;
295
+ } ) ;
296
+
297
+ describe ( 'Complex Scenarios' , ( ) => {
298
+ it ( 'should handle multiple filter combinations with fallbackVersion' , ( ) => {
299
+ const scenarios = [
300
+ {
301
+ description : 'Both include and exclude with fallbackVersion' ,
302
+ actualVersion : '2.5.0' ,
303
+ include : { version : '^3.0.0' , fallbackVersion : '3.1.0' } ,
304
+ exclude : { version : '^2.0.0' , fallbackVersion : '1.0.0' } ,
305
+ expectedResult : true , // Include fallback satisfies, exclude fallback doesn't
306
+ } ,
307
+ {
308
+ description :
309
+ 'Include passes but exclude also matches with fallbackVersion' ,
310
+ actualVersion : '1.0.0' ,
311
+ include : { version : '^2.0.0' , fallbackVersion : '2.1.0' } ,
312
+ exclude : { version : '^2.0.0' , fallbackVersion : '2.2.0' } ,
313
+ expectedResult : false , // Both match, but exclude takes precedence
314
+ } ,
315
+ ] ;
316
+
317
+ scenarios . forEach ( ( scenario ) => {
318
+ // Test the logic for each scenario
319
+ let shouldInclude = true ;
320
+
321
+ // Include check
322
+ if ( scenario . include ) {
323
+ let includeFailsWithActual = ! satisfy (
324
+ scenario . actualVersion ,
325
+ scenario . include . version ,
326
+ ) ;
327
+ if ( includeFailsWithActual && scenario . include . fallbackVersion ) {
328
+ includeFailsWithActual = ! satisfy (
329
+ scenario . include . fallbackVersion ,
330
+ scenario . include . version ,
331
+ ) ;
332
+ }
333
+ if ( includeFailsWithActual ) {
334
+ shouldInclude = false ;
335
+ }
336
+ }
337
+
338
+ // Exclude check
339
+ if ( scenario . exclude && shouldInclude ) {
340
+ let excludeMatchesActual = satisfy (
341
+ scenario . actualVersion ,
342
+ scenario . exclude . version ,
343
+ ) ;
344
+ if ( ! excludeMatchesActual && scenario . exclude . fallbackVersion ) {
345
+ excludeMatchesActual = satisfy (
346
+ scenario . exclude . fallbackVersion ,
347
+ scenario . exclude . version ,
348
+ ) ;
349
+ }
350
+ if ( excludeMatchesActual ) {
351
+ shouldInclude = false ;
352
+ }
353
+ }
354
+
355
+ expect ( shouldInclude ) . toBe ( scenario . expectedResult ) ;
356
+ } ) ;
357
+ } ) ;
358
+
359
+ it ( 'should handle edge cases with empty and invalid versions' , ( ) => {
360
+ const edgeCases = [
361
+ {
362
+ description : 'Empty actualVersion with valid fallbackVersion' ,
363
+ actualVersion : '' ,
364
+ include : { version : '^1.0.0' , fallbackVersion : '1.2.0' } ,
365
+ expectedResult : true ,
366
+ } ,
367
+ {
368
+ description : 'Invalid actualVersion with valid fallbackVersion' ,
369
+ actualVersion : 'not-a-version' ,
370
+ include : { version : '^1.0.0' , fallbackVersion : '1.2.0' } ,
371
+ expectedResult : true ,
372
+ } ,
373
+ {
374
+ description : 'Valid actualVersion with invalid fallbackVersion' ,
375
+ actualVersion : '1.2.0' ,
376
+ include : { version : '^2.0.0' , fallbackVersion : 'invalid' } ,
377
+ expectedResult : false , // Actual doesn't satisfy, fallback is invalid
378
+ } ,
379
+ ] ;
380
+
381
+ edgeCases . forEach ( ( edgeCase ) => {
382
+ let shouldInclude = true ;
383
+
384
+ if ( edgeCase . include ) {
385
+ let includeFailsWithActual = false ;
386
+
387
+ // Check if actual version satisfies
388
+ if (
389
+ ! edgeCase . actualVersion ||
390
+ ! satisfy ( edgeCase . actualVersion , edgeCase . include . version )
391
+ ) {
392
+ includeFailsWithActual = true ;
393
+ }
394
+
395
+ // If actual version fails, try fallback
396
+ if ( includeFailsWithActual && edgeCase . include . fallbackVersion ) {
397
+ if (
398
+ satisfy (
399
+ edgeCase . include . fallbackVersion ,
400
+ edgeCase . include . version ,
401
+ )
402
+ ) {
403
+ includeFailsWithActual = false ;
404
+ }
405
+ }
406
+
407
+ if ( includeFailsWithActual ) {
408
+ shouldInclude = false ;
409
+ }
410
+ }
411
+
412
+ expect ( shouldInclude ) . toBe ( edgeCase . expectedResult ) ;
413
+ } ) ;
414
+ } ) ;
160
415
} ) ;
161
416
} ) ;
0 commit comments