Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ describe('DatabaseAnalytics', () => {
expect(sendEventSpy).toHaveBeenCalledWith(
TelemetryEvents.RedisInstanceEditedByUser,
{
port: cur.port,
databaseId: cur.id,
connectionType: cur.connectionType,
provider: HostingProvider.RE_CLUSTER,
Expand All @@ -200,6 +201,7 @@ describe('DatabaseAnalytics', () => {
useSSH: 'disabled',
timeout: mockDatabaseWithTlsAuth.timeout / 1_000, // milliseconds to seconds
previousValues: {
port: prev.port,
connectionType: prev.connectionType,
provider: prev.provider,
useTLS: 'enabled',
Expand All @@ -225,6 +227,7 @@ describe('DatabaseAnalytics', () => {
expect(sendEventSpy).toHaveBeenCalledWith(
TelemetryEvents.RedisInstanceEditedByUser,
{
port: cur.port,
databaseId: cur.id,
connectionType: cur.connectionType,
provider: HostingProvider.RE_CLUSTER,
Expand All @@ -235,6 +238,7 @@ describe('DatabaseAnalytics', () => {
useSSH: 'disabled',
timeout: mockDatabaseWithTlsAuth.timeout / 1_000, // milliseconds to seconds
previousValues: {
port: prev.port,
connectionType: prev.connectionType,
provider: prev.provider,
useTLS: 'disabled',
Expand Down
2 changes: 2 additions & 0 deletions redisinsight/api/src/modules/database/database.analytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ export class DatabaseAnalytics extends TelemetryBaseService {
this.sendEvent(
TelemetryEvents.RedisInstanceEditedByUser,
{
port: cur.port,
databaseId: cur.id,
connectionType: cur.connectionType,
provider: cur.provider,
Expand All @@ -100,6 +101,7 @@ export class DatabaseAnalytics extends TelemetryBaseService {
useSSH: cur?.ssh ? 'enabled' : 'disabled',
timeout: cur?.timeout / 1_000, // milliseconds to seconds
previousValues: {
port: prev.port,
connectionType: prev.connectionType,
provider: prev.provider,
useTLS: prev.tls ? 'enabled' : 'disabled',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,14 +131,15 @@ describe('DatabaseService', () => {
it('should update existing database and send analytics event', async () => {
expect(await service.update(
mockDatabase.id,
{ password: 'password' } as UpdateDatabaseDto,
{ password: 'password', port: 6380 } as UpdateDatabaseDto,
true,
)).toEqual(mockDatabase);
expect(analytics.sendInstanceEditedEvent).toHaveBeenCalledWith(
mockDatabase,
{
...mockDatabase,
password: 'password',
port: 6380,
},
true,
);
Expand Down
3 changes: 2 additions & 1 deletion redisinsight/api/src/modules/database/database.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,8 @@ export class DatabaseService {
): Promise<Database> {
this.logger.log(`Updating database: ${id}`);
const oldDatabase = await this.get(id, true);
let database = merge(oldDatabase, dto);

let database = merge({}, oldDatabase, dto);

try {
database = await this.databaseFactory.createDatabaseModel(database);
Expand Down
20 changes: 16 additions & 4 deletions redisinsight/ui/src/pages/home/HomePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import {
import { optimizeLSInstances, setTitle } from 'uiSrc/utils'
import { PageHeader } from 'uiSrc/components'
import { BrowserStorageItem } from 'uiSrc/constants'
import { resetKeys } from 'uiSrc/slices/browser/keys'
import { resetCliHelperSettings, resetCliSettingsAction } from 'uiSrc/slices/cli/cli-settings'
import { resetRedisearchKeysData } from 'uiSrc/slices/browser/redisearch'
import { appContextSelector, setAppContextInitialState } from 'uiSrc/slices/app/context'
import { Instance } from 'uiSrc/slices/interfaces'
import { cloudSelector, resetSubscriptionsRedisCloud } from 'uiSrc/slices/instances/cloud'
import { editedInstanceSelector, fetchEditedInstanceAction, fetchInstancesAction, instancesSelector, setEditedInstance } from 'uiSrc/slices/instances/instances'
Expand Down Expand Up @@ -55,6 +59,8 @@ const HomePage = () => {

const { identified: analyticsIdentified } = useSelector(appAnalyticsInfoSelector)

const { contextInstanceId } = useSelector(appContextSelector)

!welcomeIsShow && setTitle('My Redis databases')

useEffect(() => {
Expand Down Expand Up @@ -127,7 +133,15 @@ const HomePage = () => {
}
}, [instances])

const onInstanceChanged = () => ({})
const onDbEdited = () => {
if (contextInstanceId && contextInstanceId === editedInstance?.id) {
dispatch(resetKeys())
dispatch(resetRedisearchKeysData())
dispatch(resetCliSettingsAction())
dispatch(resetCliHelperSettings())
dispatch(setAppContextInitialState())
}
}

const closeEditDialog = () => {
dispatch(setEditedInstance(null))
Expand Down Expand Up @@ -245,7 +259,7 @@ const HomePage = () => {
isResizablePanel
editedInstance={editedInstance}
onClose={closeEditDialog}
onDbAdded={onInstanceChanged}
onDbEdited={onDbEdited}
/>
)}

Expand All @@ -256,7 +270,6 @@ const HomePage = () => {
isResizablePanel
editedInstance={sentinelInstance ?? null}
onClose={handleClose}
onDbAdded={onInstanceChanged}
isFullWidth={!instances.length}
/>
)}
Expand Down Expand Up @@ -285,7 +298,6 @@ const HomePage = () => {
isResizablePanel
editedInstance={sentinelInstance ?? null}
onClose={handleClose}
onDbAdded={onInstanceChanged}
isFullWidth={!instances.length}
/>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ export interface Props {
editMode: boolean;
editedInstance: Nullable<Instance>;
onClose?: () => void;
onDbAdded: () => void;
onDbEdited?: () => void;
onAliasEdited?: (value: string) => void;
isFullWidth?: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,39 @@ describe('InstanceForm', () => {
)
})

it('should change port input properly', async () => {
const handleSubmit = jest.fn()
render(
<div id="footerDatabaseForm">
<InstanceForm
{...instance(mockedProps)}
isEditMode
formFields={{
...formFields,
connectionType: ConnectionType.Standalone,
}}
onSubmit={handleSubmit}
/>
</div>
)

await act(() => {
fireEvent.change(screen.getByTestId('port'), {
target: { value: '123' },
})
})

const submitBtn = screen.getByTestId(BTN_SUBMIT)
await act(() => {
fireEvent.click(submitBtn)
})
expect(handleSubmit).toBeCalledWith(
expect.objectContaining({
port: '123',
})
)
})

it('should change tls checkbox', async () => {
const handleSubmit = jest.fn()
const handleTestConnection = jest.fn()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React, { ChangeEvent } from 'react'
import { useSelector } from 'react-redux'
import { FormikProps } from 'formik'

import {
Expand All @@ -10,6 +11,8 @@ import {
EuiFormRow, EuiIcon,
EuiToolTip
} from '@elastic/eui'
import { BuildType } from 'uiSrc/constants/env'
import { appInfoSelector } from 'uiSrc/slices/app/info'
import { handlePasteHostName, MAX_PORT_NUMBER, MAX_TIMEOUT_NUMBER, selectOnFocus, validateField, validatePortNumber, validateTimeoutNumber } from 'uiSrc/utils'
import { ConnectionType, InstanceType } from 'uiSrc/slices/interfaces'
import { DbConnectionInfo } from '../interfaces'
Expand Down Expand Up @@ -37,6 +40,8 @@ const DatabaseForm = (props: Props) => {
connectionType
} = props

const { server } = useSelector(appInfoSelector)

const AppendHostName = () => (
<EuiToolTip
title={(
Expand Down Expand Up @@ -75,8 +80,8 @@ const DatabaseForm = (props: Props) => {

return (
<>
{(!isEditMode || isCloneMode) && (
<EuiFlexGroup className={flexGroupClassName}>
<EuiFlexGroup className={flexGroupClassName}>
{(!isEditMode || isCloneMode) && (
<EuiFlexItem className={flexItemClassName}>
<EuiFormRow label="Host*">
<EuiFieldText
Expand All @@ -100,7 +105,8 @@ const DatabaseForm = (props: Props) => {
/>
</EuiFormRow>
</EuiFlexItem>

)}
{server?.buildType !== BuildType.RedisStack && (
<EuiFlexItem className={flexItemClassName}>
<EuiFormRow label="Port*" helpText="Should not exceed 65535.">
<EuiFieldNumber
Expand All @@ -124,8 +130,8 @@ const DatabaseForm = (props: Props) => {
/>
</EuiFormRow>
</EuiFlexItem>
</EuiFlexGroup>
)}
)}
</EuiFlexGroup>

{(
(!isEditMode || isCloneMode)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import React from 'react'
import { useSelector } from 'react-redux'
import { EuiIcon, EuiListGroup, EuiListGroupItem, EuiText, EuiTextColor, EuiToolTip } from '@elastic/eui'
import { capitalize } from 'lodash'
import cx from 'classnames'
import { DatabaseListModules } from 'uiSrc/components'
import { BuildType } from 'uiSrc/constants/env'
import { appInfoSelector } from 'uiSrc/slices/app/info'
import { ConnectionType } from 'uiSrc/slices/interfaces'
import { Nullable } from 'uiSrc/utils'
import { Endpoint } from 'apiSrc/common/models'
Expand All @@ -22,6 +25,9 @@ export interface Props {

const DbInfo = (props: Props) => {
const { connectionType, nameFromProvider, nodes = null, host, port, db, modules } = props

const { server } = useSelector(appInfoSelector)

const AppendEndpoints = () => (
<EuiToolTip
title="Host:port"
Expand Down Expand Up @@ -76,7 +82,6 @@ const DbInfo = (props: Props) => {
)}
/>
)}

<EuiListGroupItem
label={(
<>
Expand All @@ -90,17 +95,18 @@ const DbInfo = (props: Props) => {
</>
)}
/>

<EuiListGroupItem
label={(
<EuiText color="subdued" size="s">
Port:
<EuiTextColor color="default" className={styles.dbInfoListValue}>
{port}
</EuiTextColor>
</EuiText>
)}
/>
{server?.buildType === BuildType.RedisStack && (
<EuiListGroupItem
label={(
<EuiText color="subdued" size="s">
Port:
<EuiTextColor color="default" className={styles.dbInfoListValue}>
{port}
</EuiTextColor>
</EuiText>
)}
/>
)}

{!!db && (
<EuiListGroupItem
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,19 +145,6 @@ describe('InstanceFormWrapper', () => {
expect(onClose).toBeCalled()
})

it('should submit', () => {
const onSubmit = jest.fn()
render(
<InstanceFormWrapper
{...instance(mockedProps)}
editedInstance={mockedEditedInstance}
onDbAdded={onSubmit}
/>
)
fireEvent.click(screen.getByTestId('submit-form-btn'))
expect(onSubmit).toBeCalled()
})

it('should submit with editMode', () => {
const component = render(
<InstanceFormWrapper
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export interface Props {
instanceType: InstanceType
editMode: boolean
editedInstance: Nullable<Instance>
onDbAdded: () => void
onClose?: () => void
onDbEdited?: () => void
onAliasEdited?: (value: string) => void
Expand Down Expand Up @@ -81,7 +80,6 @@ const InstanceFormWrapper = (props: Props) => {
instanceType,
isResizablePanel = false,
onClose,
onDbAdded,
onDbEdited,
onAliasEdited,
editedInstance,
Expand Down Expand Up @@ -446,7 +444,6 @@ const InstanceFormWrapper = (props: Props) => {
BrowserStorageItem.instancesCount,
databasesCount + 1
)
onDbAdded()
}

const handleConnectionFormSubmit = (values: DbConnectionInfo) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ const EditConnection = () => {
editMode
width={600}
editedInstance={state.data}
onDbAdded={() => {}}
onDbEdited={onInstanceChanged}
onAliasEdited={onAliasChanged}
onClose={onClose}
Expand Down
Loading