Skip to content

Commit 5aa7be6

Browse files
authored
RI-7218 Add telemetry collection for Vector Search page (#4811)
* feat(ui): collect telemetry on vector search page when running a query * feat(ui): collect telemetry on vector search page when copy a query * feat(ui): collect telemetry on vector search page when copy a query * feat(ui): collect telemetry on vector search page when re-run a query * feat(ui): collect telemetry on vector search page when toggle full-screen for a query result * feat(ui): collect telemetry on vector search page when collapse/uncollapse a query result * feat(ui): collect telemetry on vector search page when clearing a query result * feat(ui): collect telemetry on vector search page when clearing all query results * feat(ui): collect telemetry on vector search page when clearing query re #RI-7218
1 parent 0cfce38 commit 5aa7be6

File tree

21 files changed

+1170
-273
lines changed

21 files changed

+1170
-273
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React from 'react'
2+
import { render, screen } from '@testing-library/react'
3+
4+
import {
5+
useViewModeContext,
6+
ViewMode,
7+
ViewModeContextProvider,
8+
} from './view-mode.context'
9+
10+
// Test component to consume the context
11+
const TestComponent: React.FC = () => {
12+
const { viewMode } = useViewModeContext()
13+
14+
return (
15+
<div>
16+
<p data-testid="view-mode">Current View Mode: {viewMode}</p>
17+
</div>
18+
)
19+
}
20+
21+
describe('ViewModeContext', () => {
22+
it('provides the default view mode', () => {
23+
render(
24+
<ViewModeContextProvider>
25+
<TestComponent />
26+
</ViewModeContextProvider>,
27+
)
28+
29+
expect(screen.getByTestId('view-mode')).toHaveTextContent(
30+
`Current View Mode: ${ViewMode.Workbench}`,
31+
)
32+
})
33+
34+
it('uses the initial view mode if provided', () => {
35+
render(
36+
<ViewModeContextProvider viewMode={ViewMode.VectorSearch}>
37+
<TestComponent />
38+
</ViewModeContextProvider>,
39+
)
40+
41+
expect(screen.getByTestId('view-mode')).toHaveTextContent(
42+
`Current View Mode: ${ViewMode.VectorSearch}`,
43+
)
44+
})
45+
})
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React, { createContext, ReactNode, useContext } from 'react'
2+
3+
export enum ViewMode {
4+
Workbench = 'workbench',
5+
VectorSearch = 'vector-search',
6+
}
7+
8+
interface ViewModeContextType {
9+
viewMode: ViewMode
10+
}
11+
12+
const ViewModeContext = createContext<ViewModeContextType>({
13+
viewMode: ViewMode.Workbench,
14+
})
15+
16+
// Props for the provider
17+
interface ViewModeContextProviderProps {
18+
children: ReactNode
19+
viewMode?: ViewMode
20+
}
21+
22+
export const ViewModeContextProvider: React.FC<
23+
ViewModeContextProviderProps
24+
> = ({ children, viewMode = ViewMode.Workbench }) => {
25+
return (
26+
<ViewModeContext.Provider value={{ viewMode }}>
27+
{children}
28+
</ViewModeContext.Provider>
29+
)
30+
}
31+
32+
export const useViewModeContext = (): ViewModeContextType =>
33+
useContext(ViewModeContext)

redisinsight/ui/src/components/query/query-card/QueryCard.spec.tsx

Lines changed: 74 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
} from 'uiSrc/utils/test-utils'
1313
import { CommandExecutionStatus } from 'uiSrc/slices/interfaces/cli'
1414
import QueryCard, { Props, getSummaryText } from './QueryCard'
15+
import { ViewMode, ViewModeContextProvider } from '../context/view-mode.context'
1516

1617
const mockedProps = mock<Props>()
1718

@@ -44,15 +45,27 @@ jest.mock('uiSrc/slices/app/plugins', () => ({
4445
}),
4546
}))
4647

48+
const renderQueryCardComponent = (props: Partial<Props> = {}) => {
49+
return render(
50+
<ViewModeContextProvider viewMode={ViewMode.Workbench}>
51+
<QueryCard {...instance(mockedProps)} {...props} />
52+
</ViewModeContextProvider>,
53+
{
54+
store,
55+
},
56+
)
57+
}
58+
4759
describe('QueryCard', () => {
4860
it('should render', () => {
49-
expect(render(<QueryCard {...instance(mockedProps)} />)).toBeTruthy()
61+
const { container } = renderQueryCardComponent()
62+
expect(container).toBeTruthy()
5063
})
5164

5265
it('Cli result should not in the document before Expand', () => {
5366
const cliResultTestId = 'query-cli-result'
5467

55-
const { queryByTestId } = render(<QueryCard {...instance(mockedProps)} />)
68+
const { queryByTestId } = renderQueryCardComponent()
5669

5770
const cliResultEl = queryByTestId(cliResultTestId)
5871
expect(cliResultEl).not.toBeInTheDocument()
@@ -61,9 +74,10 @@ describe('QueryCard', () => {
6174
it('Cli result should in the document when "isOpen = true"', () => {
6275
const cliResultTestId = 'query-cli-result'
6376

64-
const { queryByTestId } = render(
65-
<QueryCard {...instance(mockedProps)} isOpen result={mockResult} />,
66-
)
77+
const { queryByTestId } = renderQueryCardComponent({
78+
isOpen: true,
79+
result: mockResult,
80+
})
6781

6882
const cliResultEl = queryByTestId(cliResultTestId)
6983

@@ -73,13 +87,10 @@ describe('QueryCard', () => {
7387
it('Cli result should not in the document when "isOpen = false"', () => {
7488
const cliResultTestId = 'query-cli-result'
7589

76-
const { queryByTestId } = render(
77-
<QueryCard
78-
{...instance(mockedProps)}
79-
isOpen={false}
80-
result={mockResult}
81-
/>,
82-
)
90+
const { queryByTestId } = renderQueryCardComponent({
91+
isOpen: false,
92+
result: mockResult,
93+
})
8394

8495
const cliResultEl = queryByTestId(cliResultTestId)
8596

@@ -89,14 +100,11 @@ describe('QueryCard', () => {
89100
it('Should be in the document when resultsMode === ResultsMode.GroupMode', () => {
90101
const cliResultTestId = 'query-cli-result'
91102

92-
const { queryByTestId } = render(
93-
<QueryCard
94-
{...instance(mockedProps)}
95-
isOpen={false}
96-
result={mockResult}
97-
resultsMode={ResultsMode.GroupMode}
98-
/>,
99-
)
103+
const { queryByTestId } = renderQueryCardComponent({
104+
isOpen: false,
105+
result: mockResult,
106+
resultsMode: ResultsMode.GroupMode,
107+
})
100108

101109
const cliResultEl = queryByTestId(cliResultTestId)
102110

@@ -107,9 +115,10 @@ describe('QueryCard', () => {
107115
const cardHeaderTestId = 'query-card-open'
108116
const mockId = '123'
109117

110-
const { queryByTestId } = render(
111-
<QueryCard {...instance(mockedProps)} id={mockId} result={mockResult} />,
112-
)
118+
const { queryByTestId } = renderQueryCardComponent({
119+
id: mockId,
120+
result: mockResult,
121+
})
113122

114123
const cardHeaderTestEl = queryByTestId(cardHeaderTestId)
115124

@@ -131,15 +140,13 @@ describe('QueryCard', () => {
131140
})
132141

133142
it('should render QueryCardCliResultWrapper when command is null', () => {
134-
const { queryByTestId } = render(
135-
<QueryCard
136-
{...instance(mockedProps)}
137-
resultsMode={ResultsMode.GroupMode}
138-
result={null}
139-
isOpen
140-
command={null}
141-
/>,
142-
)
143+
const { queryByTestId } = renderQueryCardComponent({
144+
resultsMode: ResultsMode.GroupMode,
145+
result: null,
146+
isOpen: true,
147+
command: null,
148+
})
149+
143150
const queryCommonResultEl = queryByTestId('query-common-result-wrapper')
144151
const queryCliResultEl = queryByTestId('query-cli-result-wrapper')
145152

@@ -148,62 +155,53 @@ describe('QueryCard', () => {
148155
})
149156

150157
it('should render QueryCardCliResult when result reached response size threshold', () => {
151-
const { queryByTestId } = render(
152-
<QueryCard
153-
{...instance(mockedProps)}
154-
resultsMode={ResultsMode.GroupMode}
155-
result={[
156-
{
157-
status: CommandExecutionStatus.Success,
158-
response: 'Any message about size limit threshold exceeded',
159-
sizeLimitExceeded: true,
160-
},
161-
]}
162-
isOpen
163-
command={null}
164-
/>,
165-
)
158+
const { queryByTestId } = renderQueryCardComponent({
159+
resultsMode: ResultsMode.GroupMode,
160+
result: [
161+
{
162+
status: CommandExecutionStatus.Success,
163+
response: 'Any message about size limit threshold exceeded',
164+
sizeLimitExceeded: true,
165+
},
166+
],
167+
isOpen: true,
168+
command: null,
169+
})
166170
const queryCliResultEl = queryByTestId('query-cli-result')
167171

168172
expect(queryCliResultEl).toBeInTheDocument()
169173
})
170174

171175
it('should render properly result when it has pure number', () => {
172-
const { getByTestId } = render(
173-
<QueryCard
174-
{...instance(mockedProps)}
175-
resultsMode={ResultsMode.GroupMode}
176-
result={[
177-
{
178-
status: CommandExecutionStatus.Success,
179-
response: 1,
180-
},
181-
]}
182-
isOpen
183-
command="del key"
184-
/>,
185-
)
176+
const { getByTestId } = renderQueryCardComponent({
177+
resultsMode: ResultsMode.GroupMode,
178+
result: [
179+
{
180+
status: CommandExecutionStatus.Success,
181+
response: 1,
182+
},
183+
],
184+
isOpen: true,
185+
command: 'del key',
186+
})
186187
const queryCliResultEl = getByTestId('query-cli-result')
187188

188189
expect(queryCliResultEl.textContent).toBe('(integer) 1')
189190
})
190191

191192
it('should render QueryCardCliResult when result reached response size threshold even w/o flag', () => {
192-
const { queryByTestId } = render(
193-
<QueryCard
194-
{...instance(mockedProps)}
195-
resultsMode={ResultsMode.GroupMode}
196-
result={[
197-
{
198-
status: CommandExecutionStatus.Success,
199-
response:
200-
'Results have been deleted since they exceed 1 MB. Re-run the command to see new results.',
201-
},
202-
]}
203-
isOpen
204-
command={null}
205-
/>,
206-
)
193+
const { queryByTestId } = renderQueryCardComponent({
194+
resultsMode: ResultsMode.GroupMode,
195+
result: [
196+
{
197+
status: CommandExecutionStatus.Success,
198+
response:
199+
'Results have been deleted since they exceed 1 MB. Re-run the command to see new results.',
200+
},
201+
],
202+
isOpen: true,
203+
command: null,
204+
})
207205
const queryCliResultEl = queryByTestId('query-cli-result')
208206

209207
expect(queryCliResultEl).toBeInTheDocument()

0 commit comments

Comments
 (0)