import type { ApplyPropsAction, HideActionsMenuAction, ShowActionsMenuAction, UpdateRowDimensionsAction, } from '../actions' import type { GridViewState } from './view' import reducerConfig, { selectActionsMenuDetails, selectActionsMenuEnabled, selectNumberOfRowsInView, selectRowHeight, selectAggregationEnabled, selectColumnMenuDetails, selectColumnMenuEnabled, selectLoading, } from './view' const { reducer: viewReducer } = reducerConfig const getStateMock = (state: Partial = {}): GridViewState => ({ ...reducerConfig.initialState, ...state, }) describe('viewReducer', () => { describe('unknown action', () => { it('should not modify the state', () => { const state = getStateMock() const newState = viewReducer(state, { type: 'nope' } as any) expect(state).toBe(newState) }) }) describe('applyProps', () => { it('should set menuEnabled to true when actionsMenuPresent is true', () => { const state = getStateMock() const newState = viewReducer(state, { type: 'applyProps', payload: { actionsMenuPresent: true, }, } as ApplyPropsAction) expect(selectActionsMenuEnabled(newState)).toBe(true) }) it('should set loading when provided', () => { const state = getStateMock() const newState = viewReducer(state, { type: 'applyProps', payload: { loading: 25, }, } as ApplyPropsAction) expect(selectLoading(newState)).toBe(25) }) it('should clear loading when omitted', () => { const state = getStateMock({ loading: 25 }) const newState = viewReducer(state, { type: 'applyProps', payload: {}, } as ApplyPropsAction) expect(selectLoading(newState)).toBe(false) }) }) describe('showActionsMenu', () => { it('should store details and make menu visible', () => { const state = getStateMock() const newState = viewReducer(state, { type: 'showActionsMenu', payload: { rowId: '123', coordinates: { top: 2, left: 20 }, }, } as ShowActionsMenuAction) expect(selectActionsMenuDetails(newState)).toEqual({ visible: true, rowId: '123', coordinates: { top: 2, left: 20 }, }) }) }) describe('hideActionsMenu', () => { it('should store details and make menu visible', () => { const state = viewReducer(getStateMock(), { type: 'showActionsMenu', payload: { rowId: '123', coordinates: { top: 2, left: 20 }, }, } as ShowActionsMenuAction) const newState = viewReducer(state, { type: 'hideActionsMenu', } as HideActionsMenuAction) expect(selectActionsMenuDetails(newState)).toEqual({ visible: false, rowId: null, coordinates: null, }) }) }) describe('updateRowDimensions', () => { it('should update row dimensions', () => { const state = getStateMock() const newState = viewReducer(state, { type: 'updateRowDimensions', payload: { rowHeight: 36, numberOfRowsInView: 15 }, } as UpdateRowDimensionsAction) expect(selectNumberOfRowsInView(newState)).toBe(15) expect(selectRowHeight(newState)).toBe(36) }) it('should not update row dimensions if values are the same', () => { const state = getStateMock({ rowHeight: 36, numberOfRowsInView: 15, }) const newState = viewReducer(state, { type: 'updateRowDimensions', payload: { rowHeight: 36, numberOfRowsInView: 15 }, } as UpdateRowDimensionsAction) expect(state).toBe(newState) }) }) describe('selectAggregationEnabled', () => { it('should return false', () => { const state = viewReducer(getStateMock(), { type: 'applyProps', payload: { footerEnabled: false, }, }) expect(selectAggregationEnabled(state)).toBe(false) }) it('should return true', () => { const state = viewReducer(getStateMock(), { type: 'applyProps', payload: { footerEnabled: true, }, }) expect(selectAggregationEnabled(state)).toBe(true) }) }) describe('selectColumnMenuDetails', () => { it('should return column menu details', () => { const state = viewReducer(getStateMock(), { type: 'showColumnMenu', payload: { coordinates: { top: 2, left: 20 }, }, }) expect(selectColumnMenuDetails(state)).toEqual({ visible: true, coordinates: { top: 2, left: 20 }, }) }) it('should return not column menu details', () => { const state = viewReducer(getStateMock(), { type: 'hideColumnMenu', payload: {}, }) expect(selectColumnMenuDetails(state)).toEqual({ visible: false, coordinates: null, }) }) }) describe('selectColumnMenuEnabled', () => { it('should return false', () => { const state = viewReducer(getStateMock(), { type: 'applyProps', payload: { enableColumnVisibilityMenu: false, }, }) expect(selectColumnMenuEnabled(state)).toBe(false) }) it('should return true', () => { const state = viewReducer(getStateMock(), { type: 'applyProps', payload: { enableColumnVisibilityMenu: true, }, }) expect(selectColumnMenuEnabled(state)).toBe(true) }) }) })