diff --git a/jest.config.js b/jest.config.js index 52c3de148..1fe2e07a6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -21,7 +21,7 @@ module.exports = { // Module file extensions for importing moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], - testTimeout: 10000, + testTimeout: 20000, setupFiles: ["./tests/jest.setup.ts"], globals: { diff --git a/src/controllers/generator.controller.ts b/src/controllers/generator.controller.ts index 7e5cf89f5..d0a13c516 100644 --- a/src/controllers/generator.controller.ts +++ b/src/controllers/generator.controller.ts @@ -9,7 +9,7 @@ import { GeneratorService } from '../services/generator.service'; import { prepareParserConfig } from '../utils/parser'; /** - * Controller which implements the Generator functionality + * Controller which exposes the Generator functionality */ export class GeneratorController implements Controller { public path = '/generator'; @@ -18,7 +18,7 @@ export class GeneratorController implements Controller { private generatorService = new GeneratorService(); private async generate(req: Request, res: Response) { - const zip = this.archiverService.create(res); + const zip = this.archiverService.createZip(res); this.archiverService.appendHeaders(res); let tmpDir: string; diff --git a/src/services/archiver.service.ts b/src/services/archiver.service.ts index 7d8baab6e..b803e53fe 100644 --- a/src/services/archiver.service.ts +++ b/src/services/archiver.service.ts @@ -5,7 +5,7 @@ import { retrieveLangauge } from "../utils/retrieve-language"; import { createTempDirectory, removeTempDirectory } from "../utils/temp-dir"; export class ArchiverService { - public create(res?: Response) { + public createZip(res?: Response) { const zip = archiver('zip', { zlib: { level: 9 } }); res && zip.pipe(res); return zip; diff --git a/src/services/generator.service.ts b/src/services/generator.service.ts index b57562dc6..02976c546 100644 --- a/src/services/generator.service.ts +++ b/src/services/generator.service.ts @@ -5,7 +5,7 @@ import { prepareParserConfig } from "../utils/parser"; export class GeneratorService { public async generate( - asyncapi: AsyncAPIDocument, + asyncapi: AsyncAPIDocument | string, template: string, parameters: Record, destDir: string, @@ -15,6 +15,11 @@ export class GeneratorService { forceWrite: true, templateParams: parameters, }); - await generator.generate(asyncapi, parserOptions); + + if (typeof asyncapi === 'string') { + await generator.generateFromString(asyncapi, parserOptions); + } else { + await generator.generate(asyncapi, parserOptions); + } } } diff --git a/src/services/tests/generator.service.test.ts b/src/services/tests/generator.service.test.ts new file mode 100644 index 000000000..f2eaecde9 --- /dev/null +++ b/src/services/tests/generator.service.test.ts @@ -0,0 +1,43 @@ +import fs from "fs"; +import path from "path"; + +import { GeneratorService } from "../generator.service"; +import { createTempDirectory, removeTempDirectory } from '../../utils/temp-dir'; +import { prepareParserConfig } from "../../utils/parser"; + +describe('GeneratorService', () => { + const generatorService = new GeneratorService(); + + describe('.generate()', () => { + it('should generate given template to the destination dir', async () => { + const asyncapi = { + "asyncapi": "2.2.0", + "info": { + "title": "Test Service", + "version": "1.0.0", + }, + "channels": {}, + }; + const template = '@asyncapi/html-template'; + const parameters = { + version: '2.1.37', + }; + + const tmpDir = createTempDirectory(); + try { + await generatorService.generate( + JSON.stringify(asyncapi), + template, + parameters, + tmpDir, + prepareParserConfig(), + ); + + expect(fs.existsSync(path.join(tmpDir, 'template'))).toEqual(true); + expect(fs.existsSync(path.join(tmpDir, 'template/index.html'))).toEqual(true); + } catch(e: any) { + removeTempDirectory(tmpDir); + } + }); + }); +}); diff --git a/src/utils/parser.ts b/src/utils/parser.ts index 8c1a59c0b..b91896666 100644 --- a/src/utils/parser.ts +++ b/src/utils/parser.ts @@ -12,7 +12,15 @@ registerSchemaParser(openapiSchemaParser); registerSchemaParser(ramlDtParser); registerSchemaParser(avroSchemaParser); -function prepareParserConfig(req: Request) { +function prepareParserConfig(req?: Request) { + if (!req) { + return { + resolve: { + file: false, + }, + } + } + return { resolve: { file: false,