diff --git a/src/generators/AbstractRenderer.ts b/src/generators/AbstractRenderer.ts index 81eac3cccb..7d14936ff8 100644 --- a/src/generators/AbstractRenderer.ts +++ b/src/generators/AbstractRenderer.ts @@ -56,14 +56,14 @@ export abstract class AbstractRenderer< return this.runPreset('additionalContent'); } - async runPreset( + async runPreset( functionName: string, params: Record = {}, - ): Promise { - let content; + ): Promise { + let content = ''; for (const [preset, options] of this.presets) { if (typeof preset[String(functionName)] === 'function') { - content = await preset[String(functionName)]({ + const presetRenderedContent: any = await preset[String(functionName)]({ ...params, renderer: this, content, @@ -71,6 +71,11 @@ export abstract class AbstractRenderer< model: this.model, inputModel: this.inputModel }); + if (typeof presetRenderedContent === 'string') { + content = presetRenderedContent; + } else { + content = ''; + } } } return content; diff --git a/test/generators/AbstractRenderer.spec.ts b/test/generators/AbstractRenderer.spec.ts index 9398cd6a74..2cf03f2052 100644 --- a/test/generators/AbstractRenderer.spec.ts +++ b/test/generators/AbstractRenderer.spec.ts @@ -5,8 +5,8 @@ import { testOptions, TestGenerator } from './AbstractGenerator.spec'; describe('AbstractRenderer', () => { class TestRenderer extends AbstractRenderer { - constructor() { - super(testOptions, new TestGenerator(), [], new CommonModel(), new CommonInputModel()); + constructor(presets = []) { + super(testOptions, new TestGenerator(), presets, new CommonModel(), new CommonInputModel()); } render(): Promise { return Promise.resolve(RenderOutput.toRenderOutput({result: ''})); @@ -58,4 +58,144 @@ describe('AbstractRenderer', () => { expect(content).toEqual(' Test'); }); }); + + describe('runSelfPreset()', () => { + test('should call correct preset', async () => { + const presetCallback = jest.fn(); + const tempRenderer = new TestRenderer([ + [{ + self: presetCallback as never + } as never, {} as never] as never + ]); + await tempRenderer.runSelfPreset(); + expect(presetCallback).toHaveBeenCalled(); + }); + test('should not call incorrect preset', async () => { + const presetCallback = jest.fn(); + + const tempRenderer = new TestRenderer([ + [{ + none_self: presetCallback as never + } as never, {} as never] as never + ]); + await tempRenderer.runSelfPreset(); + expect(presetCallback).not.toHaveBeenCalled(); + }); + }); + describe('runAdditionalContentPreset()', () => { + test('should call correct preset', async () => { + const presetCallback = jest.fn(); + const tempRenderer = new TestRenderer([ + [{ + additionalContent: presetCallback as never + } as never, {} as never] as never + ]); + await tempRenderer.runAdditionalContentPreset(); + expect(presetCallback).toHaveBeenCalled(); + }); + test('should not call incorrect preset', async () => { + const presetCallback = jest.fn(); + + const tempRenderer = new TestRenderer([ + [{ + none_additionalContent: presetCallback as never + } as never, {} as never] as never + ]); + await tempRenderer.runAdditionalContentPreset(); + expect(presetCallback).not.toHaveBeenCalled(); + }); + }); + describe('runPreset()', () => { + test('should use string', async () => { + const preset1Callback = jest.fn(); + const tempRenderer = new TestRenderer([ + [{ + test: preset1Callback.mockReturnValue('value') as never + } as never, {} as never] as never, + ]); + const content = await tempRenderer.runPreset('test'); + expect(content).toEqual('value'); + expect(preset1Callback).toHaveBeenCalled(); + }); + test('should not render non-string values', async () => { + const preset1Callback = jest.fn(); + const tempRenderer = new TestRenderer([ + [{ + test: preset1Callback.mockReturnValue(213) as never + } as never, {} as never] as never, + ]); + const content = await tempRenderer.runPreset('test'); + expect(content).toEqual(''); + expect(preset1Callback).toHaveBeenCalled(); + }); + test('should overwrite previous preset', async () => { + const preset1Callback = jest.fn(); + const preset2Callback = jest.fn(); + const tempRenderer = new TestRenderer([ + [{ + test: preset1Callback.mockReturnValue('value') as never + } as never, {} as never] as never, + [{ + test: preset2Callback.mockReturnValue('value2') as never + } as never, {} as never] as never, + ]); + const content = await tempRenderer.runPreset('test'); + expect(content).toEqual('value2'); + expect(preset1Callback).toHaveBeenCalled(); + expect(preset2Callback).toHaveBeenCalled(); + }); + test('should not use previous preset if undefined returned', async () => { + const preset1Callback = jest.fn(); + const preset2Callback = jest.fn(); + const tempRenderer = new TestRenderer([ + [{ + test: preset1Callback.mockReturnValue('value') as never + } as never, {} as never] as never, + [{ + test: preset2Callback.mockReturnValue(undefined) as never + } as never, {} as never] as never + ]); + const content = await tempRenderer.runPreset('test'); + expect(content).toEqual(''); + expect(preset1Callback).toHaveBeenCalled(); + expect(preset2Callback).toHaveBeenCalled(); + }); + test('should not use previous preset if null returned', async () => { + const preset1Callback = jest.fn(); + const preset2Callback = jest.fn(); + const tempRenderer = new TestRenderer([ + [{ + test: preset1Callback.mockReturnValue('value') as never + } as never, {} as never] as never, + [{ + test: preset2Callback.mockReturnValue(null) as never + } as never, {} as never] as never + ]); + const content = await tempRenderer.runPreset('test'); + expect(content).toEqual(''); + expect(preset1Callback).toHaveBeenCalled(); + expect(preset2Callback).toHaveBeenCalled(); + }); + test('should not use previous preset if empty string returned', async () => { + const preset1Callback = jest.fn(); + const preset2Callback = jest.fn(); + const tempRenderer = new TestRenderer([ + [{ + test: preset1Callback.mockReturnValue('value') as never + } as never, {} as never] as never, + [{ + test: preset2Callback.mockReturnValue('') as never + } as never, {} as never] as never + ]); + const content = await tempRenderer.runPreset('test'); + expect(content).toEqual(''); + expect(preset1Callback).toHaveBeenCalled(); + expect(preset2Callback).toHaveBeenCalled(); + }); + test('should default to empty string with no presets', async () => { + const tempRenderer = new TestRenderer([]); + const content = await tempRenderer.runPreset('test'); + expect(content).toEqual(''); + }); + }); });