Skip to content

Commit

Permalink
fix: run presets should be geared towards string output (#352)
Browse files Browse the repository at this point in the history
Co-authored-by: Maciej Urbańczyk <[email protected]>
  • Loading branch information
jonaslagoni and magicmatatjahu authored Sep 8, 2021
1 parent a3cec1b commit fca15fb
Show file tree
Hide file tree
Showing 2 changed files with 151 additions and 6 deletions.
13 changes: 9 additions & 4 deletions src/generators/AbstractRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,21 +56,26 @@ export abstract class AbstractRenderer<
return this.runPreset('additionalContent');
}

async runPreset<RT = string>(
async runPreset(
functionName: string,
params: Record<string, unknown> = {},
): Promise<RT> {
let content;
): Promise<string> {
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,
options,
model: this.model,
inputModel: this.inputModel
});
if (typeof presetRenderedContent === 'string') {
content = presetRenderedContent;
} else {
content = '';
}
}
}
return content;
Expand Down
144 changes: 142 additions & 2 deletions test/generators/AbstractRenderer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<RenderOutput> {
return Promise.resolve(RenderOutput.toRenderOutput({result: ''}));
Expand Down Expand Up @@ -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('');
});
});
});

0 comments on commit fca15fb

Please sign in to comment.