Skip to content

Commit 108667f

Browse files
committed
feat: added six unit tests
1 parent 32fc346 commit 108667f

1 file changed

Lines changed: 127 additions & 0 deletions

File tree

packages/amplify-cli/src/__tests__/commands/gen2-migration/generate/amplify/data/data.generator.test.ts

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,18 @@ jest.mock('../../../../../../commands/gen2-migration/generate/_infra/ts', () =>
2424

2525
const mockMkdir = jest.fn().mockResolvedValue(undefined);
2626
const mockWriteFile = jest.fn().mockResolvedValue(undefined);
27+
const mockCopyFile = jest.fn().mockResolvedValue(undefined);
2728
jest.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

3241
function 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

Comments
 (0)