Skip to content

Commit fca15fb

Browse files
fix: run presets should be geared towards string output (#352)
Co-authored-by: Maciej Urbańczyk <urbanczyk.maciej.95@gmail.com>
1 parent a3cec1b commit fca15fb

File tree

2 files changed

+151
-6
lines changed

2 files changed

+151
-6
lines changed

src/generators/AbstractRenderer.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,26 @@ export abstract class AbstractRenderer<
5656
return this.runPreset('additionalContent');
5757
}
5858

59-
async runPreset<RT = string>(
59+
async runPreset(
6060
functionName: string,
6161
params: Record<string, unknown> = {},
62-
): Promise<RT> {
63-
let content;
62+
): Promise<string> {
63+
let content = '';
6464
for (const [preset, options] of this.presets) {
6565
if (typeof preset[String(functionName)] === 'function') {
66-
content = await preset[String(functionName)]({
66+
const presetRenderedContent: any = await preset[String(functionName)]({
6767
...params,
6868
renderer: this,
6969
content,
7070
options,
7171
model: this.model,
7272
inputModel: this.inputModel
7373
});
74+
if (typeof presetRenderedContent === 'string') {
75+
content = presetRenderedContent;
76+
} else {
77+
content = '';
78+
}
7479
}
7580
}
7681
return content;

test/generators/AbstractRenderer.spec.ts

Lines changed: 142 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { testOptions, TestGenerator } from './AbstractGenerator.spec';
55

66
describe('AbstractRenderer', () => {
77
class TestRenderer extends AbstractRenderer {
8-
constructor() {
9-
super(testOptions, new TestGenerator(), [], new CommonModel(), new CommonInputModel());
8+
constructor(presets = []) {
9+
super(testOptions, new TestGenerator(), presets, new CommonModel(), new CommonInputModel());
1010
}
1111
render(): Promise<RenderOutput> {
1212
return Promise.resolve(RenderOutput.toRenderOutput({result: ''}));
@@ -58,4 +58,144 @@ describe('AbstractRenderer', () => {
5858
expect(content).toEqual(' Test');
5959
});
6060
});
61+
62+
describe('runSelfPreset()', () => {
63+
test('should call correct preset', async () => {
64+
const presetCallback = jest.fn();
65+
const tempRenderer = new TestRenderer([
66+
[{
67+
self: presetCallback as never
68+
} as never, {} as never] as never
69+
]);
70+
await tempRenderer.runSelfPreset();
71+
expect(presetCallback).toHaveBeenCalled();
72+
});
73+
test('should not call incorrect preset', async () => {
74+
const presetCallback = jest.fn();
75+
76+
const tempRenderer = new TestRenderer([
77+
[{
78+
none_self: presetCallback as never
79+
} as never, {} as never] as never
80+
]);
81+
await tempRenderer.runSelfPreset();
82+
expect(presetCallback).not.toHaveBeenCalled();
83+
});
84+
});
85+
describe('runAdditionalContentPreset()', () => {
86+
test('should call correct preset', async () => {
87+
const presetCallback = jest.fn();
88+
const tempRenderer = new TestRenderer([
89+
[{
90+
additionalContent: presetCallback as never
91+
} as never, {} as never] as never
92+
]);
93+
await tempRenderer.runAdditionalContentPreset();
94+
expect(presetCallback).toHaveBeenCalled();
95+
});
96+
test('should not call incorrect preset', async () => {
97+
const presetCallback = jest.fn();
98+
99+
const tempRenderer = new TestRenderer([
100+
[{
101+
none_additionalContent: presetCallback as never
102+
} as never, {} as never] as never
103+
]);
104+
await tempRenderer.runAdditionalContentPreset();
105+
expect(presetCallback).not.toHaveBeenCalled();
106+
});
107+
});
108+
describe('runPreset()', () => {
109+
test('should use string', async () => {
110+
const preset1Callback = jest.fn();
111+
const tempRenderer = new TestRenderer([
112+
[{
113+
test: preset1Callback.mockReturnValue('value') as never
114+
} as never, {} as never] as never,
115+
]);
116+
const content = await tempRenderer.runPreset('test');
117+
expect(content).toEqual('value');
118+
expect(preset1Callback).toHaveBeenCalled();
119+
});
120+
test('should not render non-string values', async () => {
121+
const preset1Callback = jest.fn();
122+
const tempRenderer = new TestRenderer([
123+
[{
124+
test: preset1Callback.mockReturnValue(213) as never
125+
} as never, {} as never] as never,
126+
]);
127+
const content = await tempRenderer.runPreset('test');
128+
expect(content).toEqual('');
129+
expect(preset1Callback).toHaveBeenCalled();
130+
});
131+
test('should overwrite previous preset', async () => {
132+
const preset1Callback = jest.fn();
133+
const preset2Callback = jest.fn();
134+
const tempRenderer = new TestRenderer([
135+
[{
136+
test: preset1Callback.mockReturnValue('value') as never
137+
} as never, {} as never] as never,
138+
[{
139+
test: preset2Callback.mockReturnValue('value2') as never
140+
} as never, {} as never] as never,
141+
]);
142+
const content = await tempRenderer.runPreset('test');
143+
expect(content).toEqual('value2');
144+
expect(preset1Callback).toHaveBeenCalled();
145+
expect(preset2Callback).toHaveBeenCalled();
146+
});
147+
test('should not use previous preset if undefined returned', async () => {
148+
const preset1Callback = jest.fn();
149+
const preset2Callback = jest.fn();
150+
const tempRenderer = new TestRenderer([
151+
[{
152+
test: preset1Callback.mockReturnValue('value') as never
153+
} as never, {} as never] as never,
154+
[{
155+
test: preset2Callback.mockReturnValue(undefined) as never
156+
} as never, {} as never] as never
157+
]);
158+
const content = await tempRenderer.runPreset('test');
159+
expect(content).toEqual('');
160+
expect(preset1Callback).toHaveBeenCalled();
161+
expect(preset2Callback).toHaveBeenCalled();
162+
});
163+
test('should not use previous preset if null returned', async () => {
164+
const preset1Callback = jest.fn();
165+
const preset2Callback = jest.fn();
166+
const tempRenderer = new TestRenderer([
167+
[{
168+
test: preset1Callback.mockReturnValue('value') as never
169+
} as never, {} as never] as never,
170+
[{
171+
test: preset2Callback.mockReturnValue(null) as never
172+
} as never, {} as never] as never
173+
]);
174+
const content = await tempRenderer.runPreset('test');
175+
expect(content).toEqual('');
176+
expect(preset1Callback).toHaveBeenCalled();
177+
expect(preset2Callback).toHaveBeenCalled();
178+
});
179+
test('should not use previous preset if empty string returned', async () => {
180+
const preset1Callback = jest.fn();
181+
const preset2Callback = jest.fn();
182+
const tempRenderer = new TestRenderer([
183+
[{
184+
test: preset1Callback.mockReturnValue('value') as never
185+
} as never, {} as never] as never,
186+
[{
187+
test: preset2Callback.mockReturnValue('') as never
188+
} as never, {} as never] as never
189+
]);
190+
const content = await tempRenderer.runPreset('test');
191+
expect(content).toEqual('');
192+
expect(preset1Callback).toHaveBeenCalled();
193+
expect(preset2Callback).toHaveBeenCalled();
194+
});
195+
test('should default to empty string with no presets', async () => {
196+
const tempRenderer = new TestRenderer([]);
197+
const content = await tempRenderer.runPreset('test');
198+
expect(content).toEqual('');
199+
});
200+
});
61201
});

0 commit comments

Comments
 (0)