Skip to content

Commit 3159d00

Browse files
feat: New components for Workflow History V2 (#1082)
* Add new Workflow History V2 root component, which (for now) renders only a placeholder header component and placeholder tables. * Implement Workflow History Header with basic UI and sticky functionality * Add logic in WorkflowHistoryWrapper to render V2 UI based on feature flag Signed-off-by: Adhitya Mamallan <[email protected]>
1 parent 2f7713a commit 3159d00

File tree

10 files changed

+848
-1
lines changed

10 files changed

+848
-1
lines changed
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
import React from 'react';
2+
3+
import { render, screen, userEvent } from '@/test-utils/rtl';
4+
5+
import * as usePageFiltersModule from '@/components/page-filters/hooks/use-page-filters';
6+
import { type WorkflowPageParams } from '@/views/workflow-page/workflow-page.types';
7+
8+
import { WorkflowHistoryContext } from '../../workflow-history/workflow-history-context-provider/workflow-history-context-provider';
9+
import WorkflowHistoryV2 from '../workflow-history-v2';
10+
11+
jest.mock('@/components/page-filters/hooks/use-page-filters', () =>
12+
jest.fn().mockReturnValue({})
13+
);
14+
15+
jest.mock('../workflow-history-header/workflow-history-header', () =>
16+
jest.fn(({ isUngroupedHistoryViewEnabled, onClickGroupModeToggle }) => (
17+
<div data-testid="workflow-history-header">
18+
<div data-testid="is-ungrouped-enabled">
19+
{String(isUngroupedHistoryViewEnabled)}
20+
</div>
21+
<button data-testid="toggle-group-mode" onClick={onClickGroupModeToggle}>
22+
Toggle Group Mode
23+
</button>
24+
</div>
25+
))
26+
);
27+
28+
jest.mock(
29+
'../workflow-history-grouped-table/workflow-history-grouped-table',
30+
() =>
31+
jest.fn(() => (
32+
<div data-testid="workflow-history-grouped-table">Grouped Table</div>
33+
))
34+
);
35+
36+
jest.mock('@/utils/decode-url-params', () => jest.fn((params) => params));
37+
38+
const mockSetQueryParams = jest.fn();
39+
const mockResetAllFilters = jest.fn();
40+
const mockSetUngroupedViewUserPreference = jest.fn();
41+
42+
describe(WorkflowHistoryV2.name, () => {
43+
beforeEach(() => {
44+
jest.clearAllMocks();
45+
});
46+
47+
it('should render WorkflowHistoryHeader', () => {
48+
setup();
49+
expect(screen.getByTestId('workflow-history-header')).toBeInTheDocument();
50+
});
51+
52+
it('should render grouped table by default when ungroupedHistoryViewEnabled is not set and user preference is false', () => {
53+
setup({ ungroupedViewUserPreference: false });
54+
expect(
55+
screen.getByTestId('workflow-history-grouped-table')
56+
).toBeInTheDocument();
57+
expect(screen.queryByText('WIP: ungrouped table')).not.toBeInTheDocument();
58+
});
59+
60+
it('should render grouped table by default when ungroupedHistoryViewEnabled is not set and user preference is null', () => {
61+
setup({ ungroupedViewUserPreference: null });
62+
expect(
63+
screen.getByTestId('workflow-history-grouped-table')
64+
).toBeInTheDocument();
65+
expect(screen.queryByText('WIP: ungrouped table')).not.toBeInTheDocument();
66+
});
67+
68+
it('should render ungrouped table when ungroupedHistoryViewEnabled query param is true', () => {
69+
setup({
70+
queryParams: {
71+
ungroupedHistoryViewEnabled: true,
72+
},
73+
});
74+
expect(screen.getByText('WIP: ungrouped table')).toBeInTheDocument();
75+
expect(
76+
screen.queryByTestId('workflow-history-grouped-table')
77+
).not.toBeInTheDocument();
78+
});
79+
80+
it('should render grouped table when ungroupedHistoryViewEnabled query param is false', () => {
81+
setup({
82+
queryParams: {
83+
ungroupedHistoryViewEnabled: false,
84+
},
85+
});
86+
expect(
87+
screen.getByTestId('workflow-history-grouped-table')
88+
).toBeInTheDocument();
89+
expect(screen.queryByText('WIP: ungrouped table')).not.toBeInTheDocument();
90+
});
91+
92+
it('should render ungrouped table when user preference is true and query param is not set', () => {
93+
setup({ ungroupedViewUserPreference: true });
94+
expect(screen.getByText('WIP: ungrouped table')).toBeInTheDocument();
95+
expect(
96+
screen.queryByTestId('workflow-history-grouped-table')
97+
).not.toBeInTheDocument();
98+
});
99+
100+
it('should call setUngroupedViewUserPreference and setQueryParams when toggle is clicked from grouped to ungrouped', async () => {
101+
const { user } = setup({
102+
queryParams: {
103+
ungroupedHistoryViewEnabled: false,
104+
},
105+
});
106+
107+
const toggleButton = screen.getByTestId('toggle-group-mode');
108+
await user.click(toggleButton);
109+
110+
expect(mockSetUngroupedViewUserPreference).toHaveBeenCalledWith(true);
111+
expect(mockSetQueryParams).toHaveBeenCalledWith({
112+
ungroupedHistoryViewEnabled: 'true',
113+
});
114+
});
115+
116+
it('should call setUngroupedViewUserPreference and setQueryParams when toggle is clicked from ungrouped to grouped', async () => {
117+
const { user } = setup({
118+
queryParams: {
119+
ungroupedHistoryViewEnabled: true,
120+
},
121+
});
122+
123+
const toggleButton = screen.getByTestId('toggle-group-mode');
124+
await user.click(toggleButton);
125+
126+
expect(mockSetUngroupedViewUserPreference).toHaveBeenCalledWith(false);
127+
expect(mockSetQueryParams).toHaveBeenCalledWith({
128+
ungroupedHistoryViewEnabled: 'false',
129+
});
130+
});
131+
});
132+
133+
function setup({
134+
params = {
135+
cluster: 'test-cluster',
136+
domain: 'test-domain',
137+
workflowId: 'test-workflow-id',
138+
runId: 'test-run-id',
139+
},
140+
queryParams = {
141+
historyEventTypes: undefined,
142+
historyEventStatuses: undefined,
143+
historySelectedEventId: undefined,
144+
ungroupedHistoryViewEnabled: undefined,
145+
},
146+
ungroupedViewUserPreference = false,
147+
}: {
148+
params?: WorkflowPageParams;
149+
queryParams?: {
150+
historyEventTypes?: unknown;
151+
historyEventStatuses?: unknown;
152+
historySelectedEventId?: unknown;
153+
ungroupedHistoryViewEnabled?: boolean;
154+
activeFiltersCount?: number;
155+
};
156+
ungroupedViewUserPreference?: boolean | null;
157+
} = {}) {
158+
const user = userEvent.setup();
159+
160+
jest.spyOn(usePageFiltersModule, 'default').mockReturnValue({
161+
resetAllFilters: mockResetAllFilters,
162+
activeFiltersCount: queryParams.activeFiltersCount ?? 0,
163+
queryParams: {
164+
historyEventTypes: queryParams.historyEventTypes,
165+
historyEventStatuses: queryParams.historyEventStatuses,
166+
historySelectedEventId: queryParams.historySelectedEventId,
167+
ungroupedHistoryViewEnabled: queryParams.ungroupedHistoryViewEnabled,
168+
},
169+
setQueryParams: mockSetQueryParams,
170+
});
171+
172+
const mockContextValue = {
173+
ungroupedViewUserPreference,
174+
setUngroupedViewUserPreference: mockSetUngroupedViewUserPreference,
175+
};
176+
177+
const renderResult = render(
178+
<WorkflowHistoryContext.Provider value={mockContextValue}>
179+
<WorkflowHistoryV2
180+
params={{
181+
...params,
182+
workflowTab: 'history',
183+
}}
184+
/>
185+
</WorkflowHistoryContext.Provider>
186+
);
187+
188+
return {
189+
user,
190+
...renderResult,
191+
};
192+
}

0 commit comments

Comments
 (0)