diff --git a/redisinsight/api/src/modules/rdi/client/api.rdi.client.spec.ts b/redisinsight/api/src/modules/rdi/client/api.rdi.client.spec.ts index fe1418a0d7..b0f55f42dc 100644 --- a/redisinsight/api/src/modules/rdi/client/api.rdi.client.spec.ts +++ b/redisinsight/api/src/modules/rdi/client/api.rdi.client.spec.ts @@ -607,6 +607,24 @@ describe('ApiRdiClient', () => { ); }); + it('should set dummy authorization headers in dev mode when login is disabled', async () => { + mockedAxios.post.mockRejectedValueOnce({ + status: 404, + }); + + await client.connect(); + + expect(mockedAxios.post).toHaveBeenCalledWith(RdiUrl.Login, { + username: mockRdi.username, + password: mockRdi.password, + }); + + expect(client['auth']['jwt']).toEqual(expect.any(String)); + expect(mockedAxios.defaults.headers.common['Authorization']).toEqual( + `Bearer ${client['auth']['jwt']}`, + ); + }); + it('should throw an error if login fails', async () => { mockedAxios.post.mockRejectedValueOnce(mockRdiUnauthorizedError); diff --git a/redisinsight/api/src/modules/rdi/client/api.rdi.client.ts b/redisinsight/api/src/modules/rdi/client/api.rdi.client.ts index 8da2967e47..eecb440213 100644 --- a/redisinsight/api/src/modules/rdi/client/api.rdi.client.ts +++ b/redisinsight/api/src/modules/rdi/client/api.rdi.client.ts @@ -1,6 +1,7 @@ -import axios, { AxiosInstance } from 'axios'; +import { sign } from 'jsonwebtoken'; +import axios, { AxiosError, AxiosInstance } from 'axios'; import { plainToInstance } from 'class-transformer'; -import { Logger } from '@nestjs/common'; +import { HttpStatus, Logger } from '@nestjs/common'; import { RdiClient } from 'src/modules/rdi/client/rdi.client'; import { @@ -68,6 +69,28 @@ export class ApiRdiClient extends RdiClient { }); } + private async loginDev(): Promise { + return sign({}, 'dev', { expiresIn: '1h' }); + } + + private async login(): Promise { + try { + const response = await this.client.post(RdiUrl.Login, { + username: this.rdi.username, + password: this.rdi.password, + }); + + return response.data.access_token; + } catch (e) { + // If /login endpoint is not found we assume that RDI is in dev mode + if (e.status === HttpStatus.NOT_FOUND) { + return this.loginDev(); + } + + throw e; + } + } + async getSchema(): Promise { try { const [config, jobs] = await Promise.all([ @@ -261,16 +284,16 @@ export class ApiRdiClient extends RdiClient { async connect(): Promise { try { - const response = await this.client.post(RdiUrl.Login, { - username: this.rdi.username, - password: this.rdi.password, - }); - const accessToken = response.data.access_token; + const accessToken = await this.login(); + const { exp } = JSON.parse( Buffer.from(accessToken.split('.')[1], 'base64').toString(), ); - this.auth = { jwt: accessToken, exp }; + this.auth = { + jwt: accessToken, + exp, + }; this.client.defaults.headers.common['Authorization'] = `Bearer ${accessToken}`; } catch (e) { diff --git a/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.real.spec.tsx b/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.real.spec.tsx new file mode 100644 index 0000000000..dfcd7a1e93 --- /dev/null +++ b/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.real.spec.tsx @@ -0,0 +1,100 @@ +import React from 'react' +import { cloneDeep } from 'lodash' +import { + act, + cleanup, + fireEvent, + mockedStore, + render, + screen, +} from 'uiSrc/utils/test-utils' + +import { instancesSelector } from 'uiSrc/slices/rdi/instances' +import { RdiInstance } from 'uiSrc/slices/interfaces' +import RdiInstancesListWrapper from './RdiInstancesListWrapper' + +jest.mock('uiSrc/slices/rdi/instances', () => ({ + ...jest.requireActual('uiSrc/slices/rdi/instances'), + instancesSelector: jest.fn(), +})) + +const mockInstances: RdiInstance[] = [ + { + id: '1', + name: 'My first integration', + url: 'redis-12345.c253.us-central1-1.gce.cloud.redislabs.com:12345', + lastConnection: new Date(), + version: '1.2', + error: '', + loading: false, + }, + { + id: '2', + name: 'My second integration', + url: 'redis-67890.c253.us-central1-1.gce.cloud.redislabs.com:67890', + lastConnection: new Date(), + version: '1.3', + error: '', + loading: false, + }, +] + +const mockSelectorData = { + loading: false, + error: '', + data: mockInstances, + connectedInstance: { + id: '', + name: '', + url: '', + lastConnection: null, + version: '', + error: '', + loading: false, + }, + loadingChanging: false, + errorChanging: '', + changedSuccessfully: false, + isPipelineLoaded: false, +} + +let store: typeof mockedStore + +describe('RdiInstancesListWrapper', () => { + beforeEach(() => { + cleanup() + store = cloneDeep(mockedStore) + store.clearActions() + ;(instancesSelector as jest.Mock).mockReturnValue({ + ...mockSelectorData, + }) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('should show confirmation popover when click on delete', async () => { + const mockProps = { + width: 1200, + editedInstance: null, + onEditInstance: jest.fn(), + onDeleteInstances: jest.fn(), + } + + render(, { store }) + + // Find and click the delete button for the first instance + const deleteButton = screen.getByTestId('delete-instance-1-icon') + + await act(async () => { + fireEvent.click(deleteButton) + }) + + // Check that the popover is visible with the confirmation content + expect(screen.getByText('will be removed from RedisInsight.')).toBeInTheDocument() + // Check that the instance name appears in the popover (there should be multiple instances, but we just need one) + expect(screen.getAllByText('My first integration').length).toBeGreaterThan(0) + expect(screen.getByTestId('delete-instance-1')).toBeInTheDocument() + }) +}) diff --git a/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.tsx b/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.tsx index a90c9fa19a..6360ee6555 100644 --- a/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.tsx +++ b/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.tsx @@ -47,18 +47,15 @@ const RdiInstancesListWrapper = ({ const { search } = useLocation() const instances = useSelector(instancesSelector) - const [, forceRerender] = useState({}) - const deleting = { id: '' } + const [deletingId, setDeletingId] = useState('') const isLoadingRef = useRef(false) const closePopover = () => { - deleting.id = '' - forceRerender({}) + setDeletingId('') } const showPopover = (id: string) => { - deleting.id = `${id + suffix}` - forceRerender({}) + setDeletingId(`${id + suffix}`) } useEffect(() => { @@ -76,7 +73,6 @@ const RdiInstancesListWrapper = ({ } isLoadingRef.current = instances.loading - forceRerender({}) }, [instances.loading, search]) useEffect(() => { @@ -232,7 +228,7 @@ const RdiInstancesListWrapper = ({ text="will be removed from RedisInsight." item={instance.id} suffix={suffix} - deleting={deleting.id} + deleting={deletingId} closePopover={closePopover} updateLoading={false} showPopover={showPopover} diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.spec.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.spec.tsx index 1d1796bd5b..b91809ba89 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.spec.tsx @@ -12,6 +12,7 @@ import { } from 'uiSrc/slices/app/context' import { PageNames, Pages } from 'uiSrc/constants' import { MOCK_RDI_PIPELINE_DATA } from 'uiSrc/mocks/data/rdi' +import { getPipeline } from 'uiSrc/slices/rdi/pipeline' import PipelineManagementPage, { Props } from './PipelineManagementPage' const mockedProps = mock() @@ -99,6 +100,7 @@ describe('PipelineManagementPage', () => { unmount() const expectedActions = [ + getPipeline(), setLastPageContext(PageNames.rdiPipelineManagement), setLastPipelineManagementPage(Pages.rdiPipelineConfig('rdiInstanceId')), ] diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.tsx index 52d8839577..bb408c87f4 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.tsx @@ -5,6 +5,7 @@ import { useDispatch, useSelector } from 'react-redux' import { IRoute, PageNames, Pages } from 'uiSrc/constants' import { connectedInstanceSelector } from 'uiSrc/slices/rdi/instances' import { + fetchRdiPipeline, fetchRdiPipelineJobFunctions, fetchRdiPipelineSchema, } from 'uiSrc/slices/rdi/pipeline' @@ -43,6 +44,7 @@ const PipelineManagementPage = ({ routes = [] }: Props) => { setTitle(`${rdiInstanceName} - Pipeline Management`) useEffect(() => { + dispatch(fetchRdiPipeline(rdiInstanceId)) dispatch(fetchRdiPipelineSchema(rdiInstanceId)) dispatch(fetchRdiPipelineJobFunctions(rdiInstanceId)) }, []) diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.spec.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.spec.tsx index 9be8dafab4..e4a7df2119 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.spec.tsx @@ -1,7 +1,17 @@ import React from 'react' import reactRouterDom from 'react-router-dom' -import { render, screen, fireEvent } from 'uiSrc/utils/test-utils' +import { cloneDeep } from 'lodash' +import { + render, + screen, + fireEvent, + mockedStore, + cleanup, + initialStateDefault, +} from 'uiSrc/utils/test-utils' +import { rdiPipelineSelector } from 'uiSrc/slices/rdi/pipeline' +import { RdiPipelineTabs } from 'uiSrc/slices/interfaces' import Navigation from './Navigation' jest.mock('uiSrc/telemetry', () => ({ @@ -29,12 +39,53 @@ jest.mock('formik', () => ({ }), })) +jest.mock('uiSrc/slices/rdi/pipeline', () => ({ + ...jest.requireActual('uiSrc/slices/rdi/pipeline'), + rdiPipelineSelector: jest.fn(), +})) + +let store: typeof mockedStore +beforeEach(() => { + cleanup() + store = cloneDeep(mockedStore) + store.clearActions() + ;(rdiPipelineSelector as jest.Mock).mockReturnValue( + initialStateDefault.rdi.pipeline, + ) +}) + describe('Navigation', () => { it('should render', () => { expect(render()).toBeTruthy() }) + it('should not show nav when pipeline is loading', () => { + render() + + expect( + screen.queryByTestId(`rdi-nav-btn-${RdiPipelineTabs.Config}`), + ).not.toBeInTheDocument() + }) + + it('should show nav when pipeline is not loading', () => { + ;(rdiPipelineSelector as jest.Mock).mockReturnValue({ + ...initialStateDefault.rdi.pipeline, + loading: false, + }) + + render() + + expect( + screen.queryByTestId(`rdi-nav-btn-${RdiPipelineTabs.Config}`), + ).toBeInTheDocument() + }) + it('should call proper history push after click on tabs', () => { + ;(rdiPipelineSelector as jest.Mock).mockReturnValue({ + ...initialStateDefault.rdi.pipeline, + loading: false, + }) + const pushMock = jest.fn() reactRouterDom.useHistory = jest.fn().mockReturnValue({ push: pushMock }) diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.tsx index 386084f8a4..43db7ffe7e 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.tsx @@ -109,7 +109,7 @@ const Navigation = () => { Pipeline Management
- {renderTabs()} + {!loading && renderTabs()}
) diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx index b7252d6bff..3dbdd2570e 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx @@ -6,17 +6,20 @@ import { render, fireEvent, screen, + initialStateDefault, } from 'uiSrc/utils/test-utils' import { getPipeline, + rdiPipelineSelector, setChangedFile, - setPipeline, } from 'uiSrc/slices/rdi/pipeline' -import { setPipelineDialogState } from 'uiSrc/slices/app/context' +import { + appContextPipelineManagement, + setPipelineDialogState, +} from 'uiSrc/slices/app/context' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { FileChangeType } from 'uiSrc/slices/interfaces' import SourcePipelineDialog, { - EMPTY_PIPELINE, PipelineSourceOptions, } from './SourcePipelineModal' @@ -35,80 +38,160 @@ jest.mock('uiSrc/telemetry', () => ({ sendEventTelemetry: jest.fn(), })) +jest.mock('uiSrc/slices/rdi/pipeline', () => ({ + ...jest.requireActual('uiSrc/slices/rdi/pipeline'), + rdiPipelineSelector: jest.fn(), +})) + +jest.mock('uiSrc/slices/app/context', () => ({ + ...jest.requireActual('uiSrc/slices/app/context'), + appContextPipelineManagement: jest.fn(), +})) + let store: typeof mockedStore beforeEach(() => { cleanup() store = cloneDeep(mockedStore) store.clearActions() + ;(rdiPipelineSelector as jest.Mock).mockReturnValue({ + ...initialStateDefault.rdi.pipeline, + }) + ;(appContextPipelineManagement as jest.Mock).mockReturnValue({ + ...initialStateDefault.app.context.pipelineManagement, + }) }) describe('SourcePipelineDialog', () => { - it('should render', () => { - expect(render()).toBeTruthy() + it('should not show dialog by default and not set isOpenDialog to true', () => { + render() + + expect( + screen.queryByTestId('file-source-pipeline-dialog'), + ).not.toBeInTheDocument() + + expect(store.getActions()).toEqual([]) }) - it('should call proper actions after select fetch from server option', () => { - const sendEventTelemetryMock = jest.fn() - ;(sendEventTelemetry as jest.Mock).mockImplementation( - () => sendEventTelemetryMock, - ) + it('should show dialog when isOpenDialog flag is true', () => { + ;(appContextPipelineManagement as jest.Mock).mockReturnValue({ + ...initialStateDefault.app.context.pipelineManagement, + isOpenDialog: true, + }) render() - fireEvent.click(screen.getByTestId('server-source-pipeline-dialog')) - - const expectedActions = [getPipeline(), setPipelineDialogState(false)] + expect( + screen.queryByTestId('file-source-pipeline-dialog'), + ).toBeInTheDocument() + }) - expect(store.getActions()).toEqual(expectedActions) - expect(sendEventTelemetry).toBeCalledWith({ - event: TelemetryEvent.RDI_START_OPTION_SELECTED, - eventData: { - id: 'rdiInstanceId', - option: PipelineSourceOptions.SERVER, - }, + it('should not show dialog when there is deployed pipeline on a server', () => { + ;(rdiPipelineSelector as jest.Mock).mockReturnValue({ + ...initialStateDefault.rdi.pipeline, + loading: false, + data: { config: 'some config' }, }) + + render() + + expect(store.getActions()).toEqual([]) }) - it('should call proper actions after select empty pipeline option', () => { - const sendEventTelemetryMock = jest.fn() - ;(sendEventTelemetry as jest.Mock).mockImplementation( - () => sendEventTelemetryMock, - ) + it('should not show dialog when config is fetching', () => { + ;(rdiPipelineSelector as jest.Mock).mockReturnValue({ + ...initialStateDefault.rdi.pipeline, + loading: true, + data: null, + }) + render() - fireEvent.click(screen.getByTestId('empty-source-pipeline-dialog')) - - const expectedActions = [ - setPipeline(EMPTY_PIPELINE), - setChangedFile({ name: 'config', status: FileChangeType.Added }), - setPipelineDialogState(false), - ] - - expect(store.getActions()).toEqual(expectedActions) - expect(sendEventTelemetry).toBeCalledWith({ - event: TelemetryEvent.RDI_START_OPTION_SELECTED, - eventData: { - id: 'rdiInstanceId', - option: PipelineSourceOptions.NEW, - }, + expect(store.getActions()).toEqual([]) + }) + + it('should show dialog when there is no pipeline on a server', () => { + ;(rdiPipelineSelector as jest.Mock).mockReturnValue({ + ...initialStateDefault.rdi.pipeline, + loading: false, + data: { config: '' }, }) + + render() + + expect(store.getActions()).toEqual([setPipelineDialogState(true)]) }) - it('should call proper telemetry event after select empty pipeline option', () => { + describe('Telemetry events', () => { const sendEventTelemetryMock = jest.fn() - ;(sendEventTelemetry as jest.Mock).mockImplementation( - () => sendEventTelemetryMock, - ) - render() - fireEvent.click(screen.getByTestId('file-source-pipeline-dialog')) + beforeEach(() => { + ;(sendEventTelemetry as jest.Mock).mockImplementation( + () => sendEventTelemetryMock, + ) + ;(appContextPipelineManagement as jest.Mock).mockReturnValue({ + ...initialStateDefault.app.context.pipelineManagement, + isOpenDialog: true, + }) + }) + + it('should call proper actions after select fetch from server option', () => { + render() + + fireEvent.click(screen.getByTestId('server-source-pipeline-dialog')) + + const expectedActions = [getPipeline(), setPipelineDialogState(false)] + + expect(store.getActions()).toEqual(expectedActions) + expect(sendEventTelemetry).toBeCalledWith({ + event: TelemetryEvent.RDI_START_OPTION_SELECTED, + eventData: { + id: 'rdiInstanceId', + option: PipelineSourceOptions.SERVER, + }, + }) + }) + + it('should call proper actions after select empty pipeline option', () => { + render() + + fireEvent.click(screen.getByTestId('empty-source-pipeline-dialog')) + + const expectedActions = [ + setChangedFile({ name: 'config', status: FileChangeType.Added }), + setPipelineDialogState(false), + ] + + expect(store.getActions()).toEqual(expectedActions) + expect(sendEventTelemetry).toBeCalledWith({ + event: TelemetryEvent.RDI_START_OPTION_SELECTED, + eventData: { + id: 'rdiInstanceId', + option: PipelineSourceOptions.NEW, + }, + }) + }) - expect(sendEventTelemetry).toBeCalledWith({ - event: TelemetryEvent.RDI_START_OPTION_SELECTED, - eventData: { - id: 'rdiInstanceId', - option: PipelineSourceOptions.FILE, - }, + it('should call proper telemetry event after select empty pipeline option', () => { + const sendEventTelemetryMock = jest.fn() + ;(sendEventTelemetry as jest.Mock).mockImplementation( + () => sendEventTelemetryMock, + ) + ;(appContextPipelineManagement as jest.Mock).mockReturnValue({ + ...initialStateDefault.app.context.pipelineManagement, + isOpenDialog: true, + }) + + render() + + fireEvent.click(screen.getByTestId('file-source-pipeline-dialog')) + + expect(sendEventTelemetry).toBeCalledWith({ + event: TelemetryEvent.RDI_START_OPTION_SELECTED, + eventData: { + id: 'rdiInstanceId', + option: PipelineSourceOptions.FILE, + }, + }) }) }) }) diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.tsx index c8c45521d1..73cb326b69 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { EuiIcon, EuiModal, @@ -13,8 +13,8 @@ import { useParams } from 'react-router-dom' import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry' import { fetchRdiPipeline, + rdiPipelineSelector, setChangedFile, - setPipeline, } from 'uiSrc/slices/rdi/pipeline' import { appContextPipelineManagement, @@ -39,10 +39,21 @@ export enum PipelineSourceOptions { const SourcePipelineDialog = () => { const [isShowDownloadDialog, setIsShowDownloadDialog] = useState(false) + const { rdiInstanceId } = useParams<{ rdiInstanceId: string }>() const { isOpenDialog } = useSelector(appContextPipelineManagement) + // data is original response from the server converted to config and jobs yaml strings + // since by default it is null we can determine if it was fetched and it's content + const { data } = useSelector(rdiPipelineSelector) + + useEffect(() => { + if (data?.config === '') { + dispatch(setPipelineDialogState(true)) + } + }, [data]) + const dispatch = useDispatch() const onSelect = (option: PipelineSourceOptions) => { @@ -62,14 +73,12 @@ const SourcePipelineDialog = () => { } const onStartNewPipeline = () => { - dispatch(setPipeline(EMPTY_PIPELINE)) onSelect(PipelineSourceOptions.NEW) dispatch(setChangedFile({ name: 'config', status: FileChangeType.Added })) dispatch(setPipelineDialogState(false)) } const handleCloseDialog = () => { - dispatch(setPipeline(EMPTY_PIPELINE)) dispatch(setChangedFile({ name: 'config', status: FileChangeType.Added })) dispatch(setPipelineDialogState(false)) } diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/pages/config/Config.spec.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/pages/config/Config.spec.tsx index 107de9da42..cb956ee54c 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/pages/config/Config.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/pages/config/Config.spec.tsx @@ -6,6 +6,7 @@ import { setChangedFile, deleteChangedFile, setPipelineConfig, + getPipelineStrategies, } from 'uiSrc/slices/rdi/pipeline' import { rdiTestConnectionsSelector } from 'uiSrc/slices/rdi/testConnections' import { @@ -126,6 +127,7 @@ describe('Config', () => { fireEvent.change(fieldName, { target: { value: '123' } }) const expectedActions = [ + getPipelineStrategies(), setPipelineConfig('123'), deleteChangedFile('config'), ] @@ -149,6 +151,7 @@ describe('Config', () => { fireEvent.change(fieldName, { target: { value: '123' } }) const expectedActions = [ + getPipelineStrategies(), setPipelineConfig('123'), setChangedFile({ name: 'config', status: FileChangeType.Modified }), ] diff --git a/redisinsight/ui/src/slices/app/context.ts b/redisinsight/ui/src/slices/app/context.ts index 31adeca9c5..e7e416de27 100644 --- a/redisinsight/ui/src/slices/app/context.ts +++ b/redisinsight/ui/src/slices/app/context.ts @@ -123,7 +123,7 @@ export const initialState: StateAppContext = { }, pipelineManagement: { lastViewedPage: '', - isOpenDialog: true, + isOpenDialog: false, }, } @@ -351,7 +351,7 @@ const appContextSlice = createSlice({ }, resetPipelineManagement: (state) => { state.pipelineManagement.lastViewedPage = '' - state.pipelineManagement.isOpenDialog = true + state.pipelineManagement.isOpenDialog = false }, }, }) diff --git a/redisinsight/ui/src/slices/rdi/pipeline.ts b/redisinsight/ui/src/slices/rdi/pipeline.ts index 8a26b551a6..f09768d45d 100644 --- a/redisinsight/ui/src/slices/rdi/pipeline.ts +++ b/redisinsight/ui/src/slices/rdi/pipeline.ts @@ -34,7 +34,7 @@ import successMessages from 'uiSrc/components/notifications/success-messages' import { AppDispatch, RootState } from '../store' export const initialState: IStateRdiPipeline = { - loading: false, + loading: true, error: '', data: null, config: '', @@ -72,9 +72,6 @@ const rdiPipelineSlice = createSlice({ resetPipelineChecked: (state, { payload }: PayloadAction) => { state.resetChecked = payload }, - setPipeline: (state, { payload }: PayloadAction) => { - state.data = payload - }, getPipeline: (state) => { state.loading = true }, @@ -227,7 +224,6 @@ export const { getPipelineStrategies, getPipelineStrategiesSuccess, getPipelineStrategiesFailure, - setPipeline, setPipelineConfig, setPipelineJobs, setPipelineInitialState, diff --git a/redisinsight/ui/src/slices/tests/app/context.spec.ts b/redisinsight/ui/src/slices/tests/app/context.spec.ts index dfa4f773fb..4446eaa7b0 100644 --- a/redisinsight/ui/src/slices/tests/app/context.spec.ts +++ b/redisinsight/ui/src/slices/tests/app/context.spec.ts @@ -748,7 +748,7 @@ describe('slices', () => { } const state = { lastViewedPage: '', - isOpenDialog: true, + isOpenDialog: false, } // Act diff --git a/redisinsight/ui/src/slices/tests/rdi/pipeline.spec.ts b/redisinsight/ui/src/slices/tests/rdi/pipeline.spec.ts index 1a01cb1349..271b0b6a98 100644 --- a/redisinsight/ui/src/slices/tests/rdi/pipeline.spec.ts +++ b/redisinsight/ui/src/slices/tests/rdi/pipeline.spec.ts @@ -24,7 +24,6 @@ import reducer, { getPipelineStrategiesSuccess, getPipelineStrategiesFailure, setPipelineSchema, - setPipeline, setChangedFile, setChangedFiles, deleteChangedFile, @@ -106,30 +105,6 @@ describe('rdi pipe slice', () => { }) }) - describe('setPipeline', () => { - it('should properly set state', () => { - // Arrange - const state = { - ...initialState, - data: MOCK_RDI_PIPELINE_DATA, - } - - // Act - const nextState = reducer( - initialState, - setPipeline(MOCK_RDI_PIPELINE_DATA), - ) - - // Assert - const rootState = Object.assign(initialStateDefault, { - rdi: { - pipeline: nextState, - }, - }) - expect(rdiPipelineSelector(rootState)).toEqual(state) - }) - }) - describe('getPipelineSuccess', () => { it('should properly set state', () => { // Arrange