@v4fire/client
Version:
V4Fire client core library
171 lines (133 loc) • 5.64 kB
text/typescript
/*!
* V4Fire Client Core
* https://github.com/V4Fire/Client
*
* Released under the MIT license
* https://github.com/V4Fire/Client/blob/master/LICENSE
*/
/**
* @file Basic test cases for component rendering functionality.
*/
import test from 'tests/config/unit/test';
import { Scroll } from 'tests/helpers';
import type { VirtualScrollState, ShouldPerform } from 'base/b-virtual-scroll-new/interface';
import { createTestHelpers } from 'base/b-virtual-scroll-new/test/api/helpers';
import type { VirtualScrollTestHelpers } from 'base/b-virtual-scroll-new/test/api/helpers/interface';
import type bVirtualScrollNew from 'base/b-virtual-scroll-new/b-virtual-scroll-new';
test.describe('<b-virtual-scroll-new>', () => {
let
component: VirtualScrollTestHelpers['component'],
provider: VirtualScrollTestHelpers['provider'],
state: VirtualScrollTestHelpers['state'];
test.beforeEach(async ({demoPage, page}) => {
await demoPage.goto();
({component, provider, state} = await createTestHelpers(page));
await provider.start();
await page.setViewportSize({height: 640, width: 360});
});
test.describe('`chunkSize` is 12', () => {
test.describe('provider can provide 3 data chunks', () => {
test('Should render 36 items', async () => {
const
chunkSize = 12;
provider
.responseOnce(200, {data: state.data.addData(chunkSize)})
.responseOnce(200, {data: state.data.addData(chunkSize)})
.responseOnce(200, {data: state.data.addData(chunkSize)})
.response(200, {data: state.data.addData(0)});
const shouldPerformDataRender = await component.mockFn<ShouldPerform>(
({isInitialRender, remainingItems: remainingItems}) => isInitialRender || remainingItems === 0
);
await component
.withDefaultPaginationProviderProps({chunkSize})
.withProps({
shouldPerformDataRender,
chunkSize
});
await component.build();
await component.waitForChildCountEqualsTo(chunkSize);
await component.scrollToBottom();
await component.waitForChildCountEqualsTo(chunkSize * 2);
await component.scrollToBottom();
await component.waitForChildCountEqualsTo(chunkSize * 3);
await component.scrollToBottom();
await component.waitForChildCountEqualsTo(chunkSize * 3);
await test.expect(component.childList).toHaveCount(chunkSize * 3);
});
});
});
test.describe('with a different chunk size for each render cycle', () => {
test('Should render 6 components first, then 12, then 18', async () => {
const chunkSize = [6, 12, 18];
provider
.responseOnce(200, {data: state.data.addData(chunkSize[0])})
.responseOnce(200, {data: state.data.addData(chunkSize[1])})
.responseOnce(200, {data: state.data.addData(chunkSize[2])})
.response(200, {data: []});
await component
.withDefaultPaginationProviderProps()
.withProps({
chunkSize: (state: VirtualScrollState) => [6, 12, 18][state.renderPage] ?? 18
});
await component.build();
await test.step('First chunk', async () => {
const
expectedIndex = chunkSize[0];
await test.expect(component.waitForChildCountEqualsTo(expectedIndex)).resolves.toBeUndefined();
await test.expect(component.waitForDataIndexChild(expectedIndex - 1)).resolves.toBeUndefined();
});
await test.step('Second chunk', async () => {
const
expectedIndex = chunkSize[0] + chunkSize[1];
await component.scrollToBottom();
await test.expect(component.waitForChildCountEqualsTo(expectedIndex)).resolves.toBeUndefined();
await test.expect(component.waitForDataIndexChild(expectedIndex - 1)).resolves.toBeUndefined();
});
await test.step('Third chunk', async () => {
const
expectedIndex = chunkSize[0] + chunkSize[1] + chunkSize[2];
await component.scrollToBottom();
await test.expect(component.waitForChildCountEqualsTo(expectedIndex)).resolves.toBeUndefined();
await test.expect(component.waitForDataIndexChild(expectedIndex - 1)).resolves.toBeUndefined();
});
await test.step('Lifecycle is done', async () => {
await component.scrollToBottom();
await test.expect(component.waitForLifecycleDone()).resolves.toBeUndefined();
});
});
});
test.describe('`chunkSize` is 6', () => {
test.describe('provider responded once, returning 45 elements', () => {
test.describe('`shouldStopRequestingData` returns true after first request', () => {
test('should render all 45 elements within 8 rendering cycles', async () => {
const
chunkSize = 6,
providerChunkSize = 45;
provider
.responseOnce(200, {data: state.data.addData(providerChunkSize)});
const shouldPerformDataRender = await component.mockFn<ShouldPerform>(
({isInitialRender, remainingItems: remainingItems}) => isInitialRender || remainingItems === 0
);
await component
.withDefaultPaginationProviderProps({chunkSize})
.withProps({
shouldPerformDataRender,
shouldStopRequestingData: () => true,
chunkSize,
'@componentHook:beforeDataCreate': (ctx: bVirtualScrollNew) => jestMock.spy(ctx.unsafe.componentFactory, 'produceNodes')
});
await component.build();
await Scroll.scrollToBottomWhile(component.pwPage, async () => {
const
isEqual = await component.getChildCount() === providerChunkSize;
return isEqual;
});
const
spy = await component.getSpy((ctx) => ctx.unsafe.componentFactory.produceNodes);
await test.expect(spy.callsCount).resolves.toBe(8);
await test.expect(component.childList).toHaveCount(providerChunkSize);
});
});
});
});
});