11import { getMockReq , getMockRes } from '@jest-mock/express' ;
22import { mocked } from 'ts-jest/utils' ;
3+ import { fs as inMemoryFileSystem } from 'memfs' ;
34
45import { Response , RouteProperties } from './interfaces' ;
56
@@ -12,6 +13,7 @@ import {
1213import { OverrideManager } from './overrides' ;
1314import { RouteManager } from './routes' ;
1415import { Middleware } from './types' ;
16+ import { FileStorage } from './storage' ;
1517
1618jest . mock ( '../source/prompts' ) ;
1719
@@ -222,16 +224,7 @@ describe('source/override.ts', () => {
222224 describe ( 'when selecting a method override' , ( ) => {
223225 beforeEach ( ( ) => {
224226 routeManager . setAll ( routes ) ;
225-
226- mocked ( promptRoutePath ) . mockImplementation ( async ( ) => ( {
227- url : '/dogs' ,
228- } ) ) ;
229- mocked ( promptRouteMethodType ) . mockImplementation ( async ( ) => ( {
230- type : 'GET' ,
231- } ) ) ;
232- mocked ( promptRouteMethodOverride ) . mockImplementation ( async ( ) => ( {
233- name : 'Doggernaut' ,
234- } ) ) ;
227+ mockOverridePrompts ( 'GET' , '/dogs' , 'Doggernaut' ) ;
235228 } ) ;
236229
237230 it ( 'prompts and changes a route method override' , async ( ) => {
@@ -357,5 +350,71 @@ describe('source/override.ts', () => {
357350 } ) ;
358351 } ) ;
359352 } ) ;
353+
354+ describe ( 'OverrideManager with FileStorage' , ( ) => {
355+ const override = {
356+ routePath : '/dogs' ,
357+ methodType : 'get' ,
358+ name : 'Doggernaut' ,
359+ } ;
360+
361+ function createOverrideManager ( fileStorage : FileStorage < 'overrides' > ) {
362+ const overrideManager = new OverrideManager ( routeManager , fileStorage ) ;
363+ overrideManager . applyExternalOverrides ( ) ;
364+ }
365+
366+ it ( 'loads overrides from file storage' , ( ) => {
367+ const fileStorage = createFileStorage ( ) ;
368+ fileStorage . setItem ( 'overrides' , [ override ] ) ;
369+ createOverrideManager ( fileStorage ) ;
370+ expect ( overrideManager . getAllSelected ( ) ) . toContainEqual ( override ) ;
371+ } ) ;
372+
373+ it ( 'persists an override to file storage' , async ( ) => {
374+ const fileStorage = createFileStorage ( ) ;
375+ mockOverridePrompts ( 'GET' , '/dogs' , 'Doggernaut' ) ;
376+ createOverrideManager ( fileStorage ) ;
377+ await overrideManager . choose ( ) ;
378+ expect ( fileStorage . getItem ( 'overrides' ) ) . toContainEqual ( override ) ;
379+ } ) ;
380+
381+ it ( 'properly clears and apply external (file) overrides' , async ( ) => {
382+ const fileStorage = createFileStorage ( ) ;
383+ fileStorage . setItem ( 'overrides' , [ override ] ) ;
384+ const overrideManager = new OverrideManager ( routeManager , fileStorage ) ;
385+ overrideManager . applyExternalOverrides ( ) ;
386+ expect ( fileStorage . getItem ( 'overrides' ) ) . toContainEqual ( override ) ;
387+
388+ fileStorage . clear ( ) ;
389+ expect ( fileStorage . isEmpty ( ) ) . toBeTruthy ( ) ;
390+
391+ overrideManager . applyExternalOverrides ( ) ;
392+ expect ( fileStorage . getItem ( 'overrides' ) ) . toContainEqual ( override ) ;
393+ } ) ;
394+ } ) ;
360395 } ) ;
361396} ) ;
397+
398+ function mockOverridePrompts (
399+ methodType : string ,
400+ routePath : string ,
401+ name : string
402+ ) {
403+ mocked ( promptRoutePath ) . mockImplementation ( async ( ) => ( {
404+ url : routePath ,
405+ } ) ) ;
406+ mocked ( promptRouteMethodType ) . mockImplementation ( async ( ) => ( {
407+ type : methodType ,
408+ } ) ) ;
409+ mocked ( promptRouteMethodOverride ) . mockImplementation ( async ( ) => ( {
410+ name : name ,
411+ } ) ) ;
412+ }
413+
414+ function createFileStorage ( ) {
415+ return new FileStorage < 'overrides' > ( {
416+ enabled : true ,
417+ path : '/.storage' ,
418+ fs : inMemoryFileSystem as any ,
419+ } ) ;
420+ }
0 commit comments