diff --git a/frontend/src/container/PipelinePage/tests/PipelineListsView.test.tsx b/frontend/src/container/PipelinePage/tests/PipelineListsView.test.tsx
new file mode 100644
index 00000000000..74f1f125e00
--- /dev/null
+++ b/frontend/src/container/PipelinePage/tests/PipelineListsView.test.tsx
@@ -0,0 +1,265 @@
+/* eslint-disable sonarjs/no-duplicate-string */
+import { findByText, render, waitFor } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import { I18nextProvider } from 'react-i18next';
+import { QueryClient, QueryClientProvider } from 'react-query';
+import { Provider } from 'react-redux';
+import { MemoryRouter } from 'react-router-dom';
+import i18n from 'ReactI18';
+import store from 'store';
+
+import { pipelineApiResponseMockData } from '../mocks/pipeline';
+import PipelineListsView from '../PipelineListsView';
+
+const samplePipelinePreviewResponse = {
+ isLoading: false,
+ logs: [
+ {
+ attributes_bool: {},
+ attributes_float64: {},
+ attributes_int64: {},
+ attributes_string: {
+ container_id: 'debian',
+ container_name: 'hotrod',
+ },
+ body:
+ '2024-05-01T05:50:57.527Z\tINFO\tfrontend/best_eta.go:106\tDispatch successful\t{"service": "frontend", "trace_id": "5e491e5f00fb4e4f", "span_id": "5e491e5f00fb4e4f", "driver": "T789737C", "eta": "2m0s"}',
+ id: '2ffhWqb7Jrb961dX07XWL7aOKtK',
+ resources_string: {},
+ severity_number: 0,
+ severity_text: '',
+ span_id: '',
+ trace_flags: 0,
+ trace_id: '',
+ timestamp: '2024-05-01T05:50:57Z',
+ },
+ ],
+ isError: false,
+};
+
+jest.mock(
+ 'container/PipelinePage/PipelineListsView/Preview/hooks/useSampleLogs',
+ () => ({
+ __esModule: true,
+ default: jest.fn().mockImplementation(() => ({
+ logs: samplePipelinePreviewResponse.logs,
+ isLoading: samplePipelinePreviewResponse.isLoading,
+ isError: samplePipelinePreviewResponse.isError,
+ })),
+ }),
+);
+const queryClient = new QueryClient();
+
+describe('PipelinePage container test', () => {
+ it('should render PipelineListsView section', () => {
+ const { getByText, container } = render(
+
+
+
+
+
+
+ ,
+ );
+
+ // table headers assertions
+ [
+ 'Pipeline Name',
+ 'Filters',
+ 'Last Edited',
+ 'Edited By',
+ 'Actions',
+ ].forEach((text) => expect(getByText(text)).toBeInTheDocument());
+
+ // content assertion
+ expect(container.querySelectorAll('.ant-table-row').length).toBe(2);
+
+ expect(getByText('Apache common parser')).toBeInTheDocument();
+ expect(getByText('source = nginx')).toBeInTheDocument();
+
+ expect(getByText('Moving pipeline new')).toBeInTheDocument();
+ expect(getByText('method = POST')).toBeInTheDocument();
+ });
+
+ it('should render expanded content and edit mode correctly', async () => {
+ const { getByText } = render(
+
+
+
+
+
+
+ ,
+ );
+
+ // content assertion
+ expect(document.querySelectorAll('[data-icon="edit"]').length).toBe(2);
+ expect(getByText('add_new_pipeline')).toBeInTheDocument();
+
+ // expand action
+ const expandIcon = document.querySelectorAll(
+ '.ant-table-row-expand-icon-cell > span[class*="anticon-right"]',
+ );
+ expect(expandIcon.length).toBe(2);
+
+ await userEvent.click(expandIcon[0]);
+
+ // assert expanded view
+ expect(document.querySelector('.anticon-down')).toBeInTheDocument();
+ expect(getByText('add_new_processor')).toBeInTheDocument();
+ expect(getByText('grok use common asd')).toBeInTheDocument();
+ expect(getByText('rename auth')).toBeInTheDocument();
+ });
+
+ it('should be able to perform actions and edit on expanded view content', async () => {
+ render(
+
+
+
+
+
+
+ ,
+ );
+
+ // content assertion
+ expect(document.querySelectorAll('[data-icon="edit"]').length).toBe(2);
+
+ // expand action
+ const expandIcon = document.querySelectorAll(
+ '.ant-table-row-expand-icon-cell > span[class*="anticon-right"]',
+ );
+ expect(expandIcon.length).toBe(2);
+ await userEvent.click(expandIcon[0]);
+
+ const switchToggle = document.querySelector(
+ '.ant-table-expanded-row .ant-switch',
+ );
+
+ expect(switchToggle).toBeChecked();
+ await userEvent.click(switchToggle as HTMLElement);
+ expect(switchToggle).not.toBeChecked();
+
+ const deleteBtns = document.querySelectorAll(
+ '.ant-table-expanded-row [data-icon="delete"]',
+ );
+
+ expect(deleteBtns.length).toBe(2);
+
+ // delete pipeline
+ await userEvent.click(deleteBtns[0] as HTMLElement);
+
+ let deleteConfirmationModal;
+
+ await waitFor(async () => {
+ deleteConfirmationModal = document.querySelector('.ant-modal-wrap');
+ expect(deleteConfirmationModal).toBeInTheDocument();
+ });
+
+ await userEvent.click(
+ ((deleteConfirmationModal as unknown) as HTMLElement)?.querySelector(
+ '.ant-modal-confirm-btns .ant-btn-primary',
+ ) as HTMLElement,
+ );
+
+ expect(
+ document.querySelectorAll('.ant-table-expanded-row [data-icon="delete"]')
+ .length,
+ ).toBe(1);
+ });
+
+ it('should be able to toggle and delete pipeline', async () => {
+ const { getByText } = render(
+
+
+
+
+
+
+
+
+ ,
+ ,
+ );
+
+ const addNewPipelineBtn = getByText('add_new_pipeline');
+ expect(addNewPipelineBtn).toBeInTheDocument();
+
+ const switchToggle = document.querySelectorAll('.ant-switch');
+
+ expect(switchToggle[0]).not.toBeChecked();
+ await userEvent.click(switchToggle[0] as HTMLElement);
+ expect(switchToggle[0]).toBeChecked();
+
+ // view pipeline
+ const viewBtn = document.querySelectorAll('[data-icon="eye"]');
+ await userEvent.click(viewBtn[0] as HTMLElement);
+
+ const viewPipelineModal = document.querySelector('.ant-modal-wrap');
+ expect(viewPipelineModal).toBeInTheDocument();
+
+ expect(
+ await findByText(
+ (viewPipelineModal as unknown) as HTMLElement,
+ 'Simulate Processing',
+ ),
+ ).toBeInTheDocument();
+
+ await userEvent.click(
+ viewPipelineModal?.querySelector(
+ 'button[class*="ant-modal-close"]',
+ ) as HTMLElement,
+ );
+
+ const deleteBtns = document.querySelectorAll('[data-icon="delete"]');
+
+ // delete pipeline
+ await userEvent.click(deleteBtns[0] as HTMLElement);
+ let deleteConfirmationModal;
+
+ await waitFor(async () => {
+ deleteConfirmationModal = document.querySelector('.ant-modal-wrap');
+ expect(deleteConfirmationModal).toBeInTheDocument();
+ });
+
+ await userEvent.click(
+ ((deleteConfirmationModal as unknown) as HTMLElement)?.querySelector(
+ '.ant-modal-confirm-btns .ant-btn-primary',
+ ) as HTMLElement,
+ );
+
+ expect(document.querySelectorAll('[data-icon="delete"]').length).toBe(2);
+
+ const saveBtn = getByText('save_configuration');
+ expect(saveBtn).toBeInTheDocument();
+ await userEvent.click(saveBtn);
+ });
+});