Skip to content

Commit 5bbdf05

Browse files
Merge pull request #3156 from RedisInsight/feature/RI-5531_stream-entries
Feature/ri 5531 stream entries
2 parents dd3d0bd + dc565b7 commit 5bbdf05

File tree

5 files changed

+53
-12
lines changed

5 files changed

+53
-12
lines changed

redisinsight/api/src/modules/browser/stream/services/stream.service.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { ClientMetadata } from 'src/common/models';
2929
import { DatabaseClientFactory } from 'src/modules/database/providers/database.client.factory';
3030
import { RedisClient } from 'src/modules/redis/client';
3131
import { checkIfKeyExists, checkIfKeyNotExists } from 'src/modules/browser/utils';
32+
import { convertArrayReplyToObject } from 'src/modules/redis/utils';
3233

3334
@Injectable()
3435
export class StreamService {
@@ -55,10 +56,10 @@ export class StreamService {
5556

5657
await checkIfKeyNotExists(keyName, client);
5758

58-
const info = await client.sendCommand([
59+
const info = convertArrayReplyToObject(await client.sendCommand([
5960
BrowserToolStreamCommands.XInfoStream,
6061
keyName,
61-
]);
62+
]) as string[]);
6263

6364
let entries = [];
6465
if (sortOrder && sortOrder === SortOrder.Asc) {
@@ -71,10 +72,10 @@ export class StreamService {
7172

7273
return plainToClass(GetStreamEntriesResponse, {
7374
keyName,
74-
total: info[1],
75-
lastGeneratedId: info[7].toString(),
76-
firstEntry: StreamService.formatArrayToDto(info[11]),
77-
lastEntry: StreamService.formatArrayToDto(info[13]),
75+
total: info['length'],
76+
lastGeneratedId: info['last-generated-id'].toString(),
77+
firstEntry: StreamService.formatArrayToDto(info['first-entry']),
78+
lastEntry: StreamService.formatArrayToDto(info['last-entry']),
7879
entries,
7980
});
8081
} catch (error) {

redisinsight/api/src/modules/redis/utils/reply.util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const convertArrayReplyToObject = (input: string[]): { [key: string]: any
2626
2,
2727
).reduce((prev: any, current: string[]) => {
2828
const [key, value] = current;
29-
return { ...prev, [key.toLowerCase()]: value };
29+
return { ...prev, [key.toString().toLowerCase()]: value };
3030
}, {});
3131

3232
/**
Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,53 @@
11
import React from 'react'
22
import { mock } from 'ts-mockito'
3-
import { render, screen } from 'uiSrc/utils/test-utils'
3+
import { render, screen, act, fireEvent } from 'uiSrc/utils/test-utils'
44

5+
import { streamDataSelector } from 'uiSrc/slices/browser/stream'
56
import AddStreamEntries, { Props } from './AddStreamEntries'
67

78
const mockedProps = mock<Props>()
89

10+
jest.mock('uiSrc/slices/browser/stream', () => ({
11+
...jest.requireActual('uiSrc/slices/browser/stream'),
12+
streamDataSelector: jest.fn().mockReturnValue({})
13+
}))
14+
915
describe('AddStreamEntries', () => {
1016
it('should render', () => {
1117
expect(render(<AddStreamEntries {...mockedProps} />)).toBeTruthy()
1218
})
19+
20+
it('should be valid by default', () => {
21+
render(<AddStreamEntries {...mockedProps} />)
22+
23+
expect(screen.getByTestId('save-elements-btn')).not.toBeDisabled()
24+
})
25+
26+
it('should properly validate/show error', async () => {
27+
(streamDataSelector as jest.Mock).mockReturnValue({
28+
lastGeneratedId: '100-0'
29+
})
30+
render(<AddStreamEntries {...mockedProps} />)
31+
32+
await act(() => {
33+
fireEvent.change(screen.getByTestId('entryId'), { target: { value: '99-0' } })
34+
})
35+
36+
expect(screen.getByTestId('stream-entry-error')).toHaveTextContent('Must be greater than the last ID')
37+
expect(screen.getByTestId('save-elements-btn')).toBeDisabled()
38+
})
39+
40+
it('should properly validate', async () => {
41+
(streamDataSelector as jest.Mock).mockReturnValue({
42+
lastGeneratedId: '100-0'
43+
})
44+
render(<AddStreamEntries {...mockedProps} />)
45+
46+
await act(() => {
47+
fireEvent.change(screen.getByTestId('entryId'), { target: { value: '101-0' } })
48+
})
49+
50+
expect(screen.queryByTestId('stream-entry-error')).not.toBeInTheDocument()
51+
expect(screen.getByTestId('save-elements-btn')).not.toBeDisabled()
52+
})
1353
})

redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/AddStreamEntries.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface Props {
2222

2323
const AddStreamEntries = (props: Props) => {
2424
const { closePanel } = props
25-
const { lastEntry } = useSelector(streamDataSelector)
25+
const { lastGeneratedId } = useSelector(streamDataSelector)
2626
const { name: keyName = '' } = useSelector(selectedKeyDataSelector) ?? { name: undefined }
2727
const { viewType } = useSelector(keysSelector)
2828
const { id: instanceId } = useSelector(connectedInstanceSelector)
@@ -49,7 +49,7 @@ const AddStreamEntries = (props: Props) => {
4949
return
5050
}
5151

52-
if (!lastEntry?.id) {
52+
if (!lastGeneratedId) {
5353
setEntryIdError('')
5454
return
5555
}
@@ -59,7 +59,7 @@ const AddStreamEntries = (props: Props) => {
5959
return
6060
}
6161

62-
const [lastIdTimestamp, lastId] = lastEntry.id?.split('-')
62+
const [lastIdTimestamp, lastId] = lastGeneratedId.split('-')
6363
const [idTimestamp, id] = entryID?.split('-')
6464

6565
if (toNumber(idTimestamp) > toNumber(lastIdTimestamp)) {

redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/StreamEntryFields/StreamEntryFields.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ const StreamEntryFields = (props: Props) => {
142142
/>
143143
</EuiFormRow>
144144
{!showEntryError && <span className={styles.timestampText}>Timestamp - Sequence Number or *</span>}
145-
{showEntryError && <span className={styles.error}>{entryIdError}</span>}
145+
{showEntryError && <span className={styles.error} data-testid="stream-entry-error">{entryIdError}</span>}
146146
</div>
147147

148148
<div className={styles.fieldsWrapper}>

0 commit comments

Comments
 (0)