@@ -24,9 +24,18 @@ jest.mock('../../../../../../commands/gen2-migration/generate/_infra/ts', () =>
2424
2525const mockMkdir = jest . fn ( ) . mockResolvedValue ( undefined ) ;
2626const mockWriteFile = jest . fn ( ) . mockResolvedValue ( undefined ) ;
27+ const mockCopyFile = jest . fn ( ) . mockResolvedValue ( undefined ) ;
2728jest . mock ( 'node:fs/promises' , ( ) => ( {
2829 mkdir : ( ...args : unknown [ ] ) => mockMkdir ( ...args ) ,
2930 writeFile : ( ...args : unknown [ ] ) => mockWriteFile ( ...args ) ,
31+ copyFile : ( ...args : unknown [ ] ) => mockCopyFile ( ...args ) ,
32+ } ) ) ;
33+
34+ const mockExistsSync = jest . fn ( ) . mockReturnValue ( false ) ;
35+ const mockReaddirSync = jest . fn ( ) . mockReturnValue ( [ ] ) ;
36+ jest . mock ( 'node:fs' , ( ) => ( {
37+ existsSync : ( ...args : unknown [ ] ) => mockExistsSync ( ...args ) ,
38+ readdirSync : ( ...args : unknown [ ] ) => mockReaddirSync ( ...args ) ,
3039} ) ) ;
3140
3241function createMockGen1App ( overrides ?: Record < string , unknown > ) : Gen1App {
@@ -324,5 +333,123 @@ describe('DataGenerator', () => {
324333
325334 expect ( addStatementSpy ) . not . toHaveBeenCalled ( ) ;
326335 } ) ;
336+
337+ describe ( 'resolver overrides' , ( ) => {
338+ it ( 'does not add resolver operations when no resolvers directory exists' , async ( ) => {
339+ mockExistsSync . mockReturnValue ( false ) ;
340+
341+ const generator = new DataGenerator ( gen1App , backendGenerator , outputDir , {
342+ category : 'api' ,
343+ resourceName : 'testApi' ,
344+ service : 'AppSync' ,
345+ key : 'api:AppSync' ,
346+ } ) ;
347+ const ops = await generator . plan ( ) ;
348+
349+ expect ( ops ) . toHaveLength ( 1 ) ;
350+ const addStatementSpy = jest . spyOn ( backendGenerator , 'addStatement' ) ;
351+ await ops [ 0 ] . execute ( ) ;
352+ expect ( addStatementSpy ) . not . toHaveBeenCalled ( ) ;
353+ } ) ;
354+
355+ it ( 'does not add resolver operations when resolvers directory has no vtl files' , async ( ) => {
356+ mockExistsSync . mockReturnValue ( true ) ;
357+ mockReaddirSync . mockReturnValue ( [ 'readme.txt' , 'notes.md' ] ) ;
358+
359+ const generator = new DataGenerator ( gen1App , backendGenerator , outputDir , {
360+ category : 'api' ,
361+ resourceName : 'testApi' ,
362+ service : 'AppSync' ,
363+ key : 'api:AppSync' ,
364+ } ) ;
365+ const ops = await generator . plan ( ) ;
366+
367+ expect ( ops ) . toHaveLength ( 1 ) ;
368+ } ) ;
369+
370+ it ( 'adds a copy operation when vtl files exist' , async ( ) => {
371+ mockExistsSync . mockReturnValue ( true ) ;
372+ mockReaddirSync . mockReturnValue ( [ 'Query.listProducts.res.vtl' ] ) ;
373+
374+ const generator = new DataGenerator ( gen1App , backendGenerator , outputDir , {
375+ category : 'api' ,
376+ resourceName : 'testApi' ,
377+ service : 'AppSync' ,
378+ key : 'api:AppSync' ,
379+ } ) ;
380+ const ops = await generator . plan ( ) ;
381+
382+ expect ( ops ) . toHaveLength ( 2 ) ;
383+ const descriptions = await ops [ 1 ] . describe ( ) ;
384+ expect ( descriptions [ 0 ] ) . toContain ( '1 VTL resolver file(s)' ) ;
385+ } ) ;
386+
387+ it ( 'copies vtl files to amplify/data/resolvers/' , async ( ) => {
388+ mockExistsSync . mockReturnValue ( true ) ;
389+ mockReaddirSync . mockReturnValue ( [ 'Query.listProducts.res.vtl' , 'Mutation.createProduct.req.vtl' ] ) ;
390+
391+ const generator = new DataGenerator ( gen1App , backendGenerator , outputDir , {
392+ category : 'api' ,
393+ resourceName : 'testApi' ,
394+ service : 'AppSync' ,
395+ key : 'api:AppSync' ,
396+ } ) ;
397+ const ops = await generator . plan ( ) ;
398+ await ops [ 1 ] . execute ( ) ;
399+
400+ expect ( mockMkdir ) . toHaveBeenCalledWith ( expect . stringContaining ( 'resolvers' ) , { recursive : true } ) ;
401+ expect ( mockCopyFile ) . toHaveBeenCalledTimes ( 2 ) ;
402+ expect ( mockCopyFile ) . toHaveBeenCalledWith (
403+ expect . stringContaining ( 'Query.listProducts.res.vtl' ) ,
404+ expect . stringContaining ( 'Query.listProducts.res.vtl' ) ,
405+ ) ;
406+ expect ( mockCopyFile ) . toHaveBeenCalledWith (
407+ expect . stringContaining ( 'Mutation.createProduct.req.vtl' ) ,
408+ expect . stringContaining ( 'Mutation.createProduct.req.vtl' ) ,
409+ ) ;
410+ } ) ;
411+
412+ it ( 'contributes resolver override imports and statements to backendGenerator' , async ( ) => {
413+ mockExistsSync . mockReturnValue ( true ) ;
414+ mockReaddirSync . mockReturnValue ( [ 'Query.listProducts.res.vtl' ] ) ;
415+
416+ const addImportSpy = jest . spyOn ( backendGenerator , 'addImport' ) ;
417+ const addStatementSpy = jest . spyOn ( backendGenerator , 'addStatement' ) ;
418+
419+ const generator = new DataGenerator ( gen1App , backendGenerator , outputDir , {
420+ category : 'api' ,
421+ resourceName : 'testApi' ,
422+ service : 'AppSync' ,
423+ key : 'api:AppSync' ,
424+ } ) ;
425+ const ops = await generator . plan ( ) ;
426+ await ops [ 0 ] . execute ( ) ;
427+
428+ // Resolver imports: fs, path, url
429+ expect ( addImportSpy ) . toHaveBeenCalledWith ( 'fs' , [ 'readFileSync' , 'readdirSync' ] ) ;
430+ expect ( addImportSpy ) . toHaveBeenCalledWith ( 'path' , [ 'join' , 'dirname' ] ) ;
431+ expect ( addImportSpy ) . toHaveBeenCalledWith ( 'url' , [ 'fileURLToPath' ] ) ;
432+
433+ // 4 statements: __dirname, resolversDir, resolverFiles, for-of loop
434+ expect ( addStatementSpy ) . toHaveBeenCalledTimes ( 4 ) ;
435+ } ) ;
436+
437+ it ( 'handles multiple vtl files of both req and res types' , async ( ) => {
438+ mockExistsSync . mockReturnValue ( true ) ;
439+ mockReaddirSync . mockReturnValue ( [ 'Query.listProducts.res.vtl' , 'Query.listProducts.req.vtl' , 'Mutation.createProduct.res.vtl' ] ) ;
440+
441+ const generator = new DataGenerator ( gen1App , backendGenerator , outputDir , {
442+ category : 'api' ,
443+ resourceName : 'testApi' ,
444+ service : 'AppSync' ,
445+ key : 'api:AppSync' ,
446+ } ) ;
447+ const ops = await generator . plan ( ) ;
448+
449+ expect ( ops ) . toHaveLength ( 2 ) ;
450+ const descriptions = await ops [ 1 ] . describe ( ) ;
451+ expect ( descriptions [ 0 ] ) . toContain ( '3 VTL resolver file(s)' ) ;
452+ } ) ;
453+ } ) ;
327454 } ) ;
328455} ) ;
0 commit comments