Skip to content

Commit

Permalink
feat(async-ssr-manager): rename rerenderAfter to scheduleRerender
Browse files Browse the repository at this point in the history
Furthermore, the promise is now optional.
  • Loading branch information
unstubbable committed Feb 5, 2019
1 parent f6094e2 commit 5604721
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 33 deletions.
87 changes: 56 additions & 31 deletions packages/async-ssr-manager/src/__tests__/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,22 +62,6 @@ describe('asyncSsrManagerDefinition', () => {
});

describe('rendering', () => {
const createAsyncSsrManagerConsumer = (consumerUid: string) => {
const asyncSsrManager = asyncSsrManagerBinder(consumerUid)
.featureService;

let firstRender = true;

const render = () => {
if (firstRender) {
firstRender = false;
asyncSsrManager.scheduleRerender(Promise.resolve());
}
};

return {render};
};

describe('with an integrator as the only consumer', () => {
it('resolves with the result of the given render function after the first render pass', async () => {
const asyncSsrManager = asyncSsrManagerBinder('test').featureService;
Expand All @@ -89,27 +73,62 @@ describe('asyncSsrManagerDefinition', () => {
});
});

describe('with an integrator, and a consumer that schedules a rerender', () => {
describe('with an integrator, and a consumer that schedules a rerender with a custom promise', () => {
it('resolves with an html string after the second render pass', async () => {
const asyncSsrManagerIntegrator = asyncSsrManagerBinder(
'test:integrator'
).featureService;

const asyncSsrManagerConsumer = createAsyncSsrManagerConsumer(
'test:consumer'
const asyncSsrManagerConsumer = asyncSsrManagerBinder('test:consumer')
.featureService;

let renderPass = 0;

const mockRender = jest.fn(() => {
renderPass += 1;

if (renderPass === 1) {
asyncSsrManagerConsumer.scheduleRerender(Promise.resolve());
}

return `render pass ${renderPass}`;
});

const html = await asyncSsrManagerIntegrator.renderUntilCompleted(
mockRender
);

expect(html).toEqual('render pass 2');
expect(mockRender).toHaveBeenCalledTimes(2);
});
});

describe('with an integrator, and a consumer that schedules a rerender without a custom promise', () => {
it('resolves with an html string after the second render pass', async () => {
const asyncSsrManagerIntegrator = asyncSsrManagerBinder(
'test:integrator'
).featureService;

const asyncSsrManagerConsumer = asyncSsrManagerBinder('test:consumer')
.featureService;

let renderPass = 0;

const mockRender = jest.fn(() => {
asyncSsrManagerConsumer.render();
renderPass += 1;

return 'testHtml';
if (renderPass === 1) {
asyncSsrManagerConsumer.scheduleRerender();
}

return `render pass ${renderPass}`;
});

const html = await asyncSsrManagerIntegrator.renderUntilCompleted(
mockRender
);

expect(html).toEqual('testHtml');
expect(html).toEqual('render pass 2');
expect(mockRender).toHaveBeenCalledTimes(2);
});
});
Expand All @@ -120,26 +139,32 @@ describe('asyncSsrManagerDefinition', () => {
'test:integrator'
).featureService;

const asyncSsrManagerConsumer1 = createAsyncSsrManagerConsumer(
const asyncSsrManagerConsumer1 = asyncSsrManagerBinder(
'test:consumer:1'
);
).featureService;

const asyncSsrManagerConsumer2 = createAsyncSsrManagerConsumer(
const asyncSsrManagerConsumer2 = asyncSsrManagerBinder(
'test:consumer:2'
);
).featureService;

let renderPass = 0;

const mockRender = jest.fn(() => {
asyncSsrManagerConsumer1.render();
asyncSsrManagerConsumer2.render();
renderPass += 1;

return 'testHtml';
if (renderPass === 1) {
asyncSsrManagerConsumer1.scheduleRerender();
asyncSsrManagerConsumer2.scheduleRerender();
}

return `render pass ${renderPass}`;
});

const html = await asyncSsrManagerIntegrator.renderUntilCompleted(
mockRender
);

expect(html).toEqual('testHtml');
expect(html).toEqual('render pass 2');
expect(mockRender).toHaveBeenCalledTimes(2);
});
});
Expand All @@ -164,7 +189,7 @@ describe('asyncSsrManagerDefinition', () => {
const asyncSsrManager = asyncSsrManagerBinder('test').featureService;
const mockRender = jest.fn(() => {
asyncSsrManager.scheduleRerender(
new Promise<void>(() => undefined)
new Promise<never>(() => undefined)
);

return 'testHtml';
Expand Down
2 changes: 1 addition & 1 deletion packages/async-ssr-manager/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export interface AsyncSsrManagerV0 {
*
* @param promise When this promise resolves, a rerender should be triggered.
*/
scheduleRerender(promise: Promise<unknown>): void;
scheduleRerender(promise?: Promise<unknown>): void;
}

export interface SharedAsyncSsrManager extends SharedFeatureService {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export class AsyncSsrManager implements AsyncSsrManagerV0 {
return Promise.race([renderPromise, renderingTimeout(this.timeout)]);
}

public scheduleRerender(promise: Promise<unknown>): void {
public scheduleRerender(promise: Promise<unknown> = Promise.resolve()): void {
this.rerenderPromises.add(promise);
}

Expand Down

0 comments on commit 5604721

Please sign in to comment.