UNPKG

@v4fire/client

Version:

V4Fire client core library

203 lines (173 loc) • 5.72 kB
/*! * V4Fire Client Core * https://github.com/V4Fire/Client * * Released under the MIT license * https://github.com/V4Fire/Client/blob/master/LICENSE */ /** * @file This test file contains scenarios for checking the functionality of calling the last render in the lifecycle. */ import test from 'tests/config/unit/test'; import { createTestHelpers, filterEmitterResults } from 'base/b-virtual-scroll-new/test/api/helpers'; import type { VirtualScrollTestHelpers } from 'base/b-virtual-scroll-new/test/api/helpers/interface'; import type { ComponentItem, VirtualScrollState } from 'base/b-virtual-scroll-new/interface'; const j = (...str: string[]) => str.join(', '); test.describe('<b-virtual-scroll-new>', () => { let component: VirtualScrollTestHelpers['component'], provider: VirtualScrollTestHelpers['provider'], state: VirtualScrollTestHelpers['state']; const observerInitialStateFields = { remainingItems: undefined, remainingChildren: undefined, maxViewedChild: undefined, maxViewedItem: undefined }; const observerLoadedStateFields = { maxViewedChild: undefined, maxViewedItem: undefined }; test.beforeEach(async ({demoPage, page}) => { await demoPage.goto(); ({component, provider, state} = await createTestHelpers(page)); await provider.start(); }); test.describe(j( 'chunkSize set to 10', 'provider responds with 10 elements for the first time', 'next time provider responds with 0 elements', 'client says that the requests have completed' ), () => { test('should fire render events 2 times with correct state', async () => { const chunkSize = 10, providerChunkSize = 10; const states = [ state.compile(observerInitialStateFields), ( // 1 state.data.addData(providerChunkSize), state.set({loadPage: 1}).compile(observerInitialStateFields) ), ( // 2 state.data.addItems(chunkSize), state.set({renderPage: 1, isInitialRender: false}).compile(observerLoadedStateFields) ), ( // 3 state.compile() ), ( // 4 state.data.addData(0), state.set({ loadPage: 2, areRequestsStopped: true, isLastEmpty: true, isInitialLoading: false }).compile() ), ( // 5 state.set({isLastRender: true}).compile() ), ( // 6 state.set({isLifecycleDone: true}).compile() ) ]; provider .responseOnce(200, {data: state.data.getDataChunk(0)}) .responseOnce(200, {data: state.data.getDataChunk(1)}); await component .withDefaultPaginationProviderProps() .withProps({ chunkSize, shouldStopRequestingData: (state: VirtualScrollState): boolean => state.lastLoadedData.length === 0, '@componentHook:beforeDataCreate': (ctx) => { const original = ctx.emit; ctx.emit = jestMock.mock((...args) => { original(...args); return [args[0], Object.fastClone(ctx.getVirtualScrollState())]; }); } }) .build(); await component.waitForChildCountEqualsTo(chunkSize); await component.scrollToBottom(); await component.waitForLifecycleDone(); const spy = await component.getSpy((ctx) => ctx.emit), results = filterEmitterResults(await spy.results, true, ['initLoadStart', 'initLoad']); test.expect(results).toEqual([ ['initLoadStart', {...states[0], isLoadingInProgress: true}], ['dataLoadStart', {...states[0], isLoadingInProgress: true}], ['convertDataToDB', {...states[0], lastLoadedRawData: states[1].lastLoadedRawData}], ['initLoad', {...states[0], lastLoadedRawData: states[1].lastLoadedRawData}], ['dataLoadSuccess', states[1]], ['renderStart', states[1]], ['renderEngineStart', states[1]], ['renderEngineDone', states[1]], ['domInsertStart', states[2]], ['domInsertDone', states[2]], ['renderDone', states[2]], ['dataLoadStart', {...states[3], isLoadingInProgress: true}], ['convertDataToDB', {...states[3], lastLoadedRawData: states[4].lastLoadedRawData}], ['dataLoadSuccess', states[4]], ['renderStart', states[5]], ['renderDone', states[5]], ['lifecycleDone', states[6]] ]); }); }); test.describe(j( 'itemsFactory creates a component for each data element and always adds another separator to this array', 'the provider returned 10 elements on the first load', 'in the second load the provider returned 0 elements' ), () => { test('12 elements should be rendered', async () => { const chunkSize = 10; provider .responseOnce(200, {data: state.data.addData(chunkSize)}) .response(200, {data: state.data.addData(0)}); const separator: ComponentItem = { item: 'button', key: Object.cast(undefined), children: [], props: {}, type: 'separator' }; const itemsFactory = await component.mockFn((state, ctx, separator) => { const data = state.lastLoadedData; const result: ComponentItem[] = data.map((item) => ({ item: 'section', key: Object.cast(undefined), type: 'item', children: [], props: { 'data-index': item.i } })); result.push(separator); return result; }, separator); await component .withDefaultPaginationProviderProps({chunkSize}) .withProps({ itemsFactory, shouldPerformDataRender: () => true, chunkSize }) .build(); await component.waitForDataIndexChild(1); await component.scrollToBottom(); await component.waitForLifecycleDone(); await test.expect(component.container.locator('section')).toHaveCount(10); await test.expect(component.container.locator('button')).toHaveCount(2); await test.expect(component.childList).toHaveCount(12); }); }); });