Skip to content

Commit d0cc07c

Browse files
committed
test(ui): added tests for the onboarding screen
re #RI-7432
1 parent 7754a09 commit d0cc07c

File tree

3 files changed

+144
-32
lines changed

3 files changed

+144
-32
lines changed

redisinsight/ui/src/pages/vector-search/components/onboarding/VectorSearchOnboarding.spec.tsx

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,47 @@ import React from 'react'
22
import { render, screen } from 'uiSrc/utils/test-utils'
33
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
44
import { VectorSearchOnboarding } from './VectorSearchOnboarding'
5-
import useVectorSearchOnboarding from '../../create-index/hooks/useVectorSearchOnboarding'
65
import { INSTANCE_ID_MOCK } from 'uiSrc/mocks/handlers/instances/instancesHandlers'
7-
8-
jest.mock('../../create-index/hooks/useVectorSearchOnboarding')
6+
import {
7+
VectorSearchOnboardingContext,
8+
VectorSearchOnboardingContextType,
9+
} from '../../context/VectorSearchOnboardingContext'
910

1011
// Mock the telemetry module, so we don't send actual telemetry data during tests
1112
jest.mock('uiSrc/telemetry', () => ({
1213
...jest.requireActual('uiSrc/telemetry'),
1314
sendEventTelemetry: jest.fn(),
1415
}))
1516

16-
const renderVectorSearchOnboardingComponent = () =>
17-
render(<VectorSearchOnboarding />)
17+
const renderVectorSearchOnboardingComponent = (
18+
contextValue?: Partial<VectorSearchOnboardingContextType>,
19+
) => {
20+
const defaultContextValue: VectorSearchOnboardingContextType = {
21+
showOnboarding: false,
22+
setOnboardingSeen: jest.fn(),
23+
setOnboardingSeenSilent: jest.fn(),
24+
...contextValue,
25+
}
1826

19-
describe('VectorSearchOnboarding', () => {
20-
const mockMarkOnboardingAsSeen = jest.fn()
21-
const mockUseVectorSearchOnboarding = useVectorSearchOnboarding as jest.Mock
27+
return render(
28+
<VectorSearchOnboardingContext.Provider value={defaultContextValue}>
29+
<VectorSearchOnboarding />
30+
</VectorSearchOnboardingContext.Provider>,
31+
)
32+
}
2233

34+
describe('VectorSearchOnboarding', () => {
2335
beforeEach(() => {
2436
jest.clearAllMocks()
25-
26-
mockUseVectorSearchOnboarding.mockReturnValue({
27-
showOnboarding: true,
28-
markOnboardingAsSeen: mockMarkOnboardingAsSeen,
29-
})
3037
})
3138

3239
it('should render onboarding content', () => {
33-
renderVectorSearchOnboardingComponent()
40+
const mockMarkOnboardingAsSeenSilent = jest.fn()
41+
42+
renderVectorSearchOnboardingComponent({
43+
showOnboarding: true,
44+
setOnboardingSeenSilent: mockMarkOnboardingAsSeenSilent,
45+
})
3446

3547
const container = screen.getByTestId('vector-search-onboarding')
3648
expect(container).toBeInTheDocument()
@@ -49,12 +61,30 @@ describe('VectorSearchOnboarding', () => {
4961
expect(footer).toBeInTheDocument()
5062

5163
// Verify the onboarding was marked as seen
52-
expect(mockMarkOnboardingAsSeen).toHaveBeenCalledTimes(1)
64+
expect(mockMarkOnboardingAsSeenSilent).toHaveBeenCalledTimes(1)
5365

5466
// Verify telemetry event was sent
5567
expect(sendEventTelemetry).toHaveBeenCalledWith({
5668
event: TelemetryEvent.VECTOR_SEARCH_INITIAL_MESSAGE_DISPLAYED,
5769
eventData: { databaseId: INSTANCE_ID_MOCK },
5870
})
5971
})
72+
73+
it('should dismiss the onboarding when the "X" button is clicked', () => {
74+
const mockSetOnboardingSeen = jest.fn()
75+
76+
renderVectorSearchOnboardingComponent({
77+
showOnboarding: true,
78+
setOnboardingSeen: mockSetOnboardingSeen,
79+
})
80+
81+
const dismissButton = screen.getByTestId(
82+
'vector-search-onboarding--dismiss-button',
83+
)
84+
expect(dismissButton).toBeInTheDocument()
85+
86+
// Simulate button click and verify the function is called
87+
dismissButton.click()
88+
expect(mockSetOnboardingSeen).toHaveBeenCalled()
89+
})
6090
})
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import React from 'react'
2+
3+
import { fireEvent, render, screen } from 'uiSrc/utils/test-utils'
4+
import {
5+
VectorSearchOnboardingContext,
6+
VectorSearchOnboardingContextType,
7+
} from 'uiSrc/pages/vector-search/context/VectorSearchOnboardingContext'
8+
import Actions from './Actions'
9+
import useStartWizard from 'uiSrc/pages/vector-search/hooks/useStartWizard'
10+
11+
jest.mock('uiSrc/pages/vector-search/hooks/useStartWizard', () => jest.fn())
12+
13+
const renderActionsComponent = (
14+
contextValue?: Partial<VectorSearchOnboardingContextType>,
15+
) => {
16+
const defaultContextValue: VectorSearchOnboardingContextType = {
17+
showOnboarding: false,
18+
setOnboardingSeen: jest.fn(),
19+
setOnboardingSeenSilent: jest.fn(),
20+
...contextValue,
21+
}
22+
23+
return render(
24+
<VectorSearchOnboardingContext.Provider value={defaultContextValue}>
25+
<Actions />
26+
</VectorSearchOnboardingContext.Provider>,
27+
)
28+
}
29+
30+
describe('Actions', () => {
31+
const mockUseStartWizard = useStartWizard as jest.Mock
32+
33+
beforeEach(() => {
34+
jest.clearAllMocks()
35+
})
36+
37+
it('should render', () => {
38+
renderActionsComponent()
39+
40+
const container = screen.getByTestId('vector-search-onboarding--actions')
41+
expect(container).toBeInTheDocument()
42+
43+
// Verify buttons are rendered
44+
const exploreButton = screen.getByText(/Explore vector search/i)
45+
const skipButton = screen.getByText(/Skip for now/i)
46+
47+
expect(exploreButton).toBeInTheDocument()
48+
expect(skipButton).toBeInTheDocument()
49+
})
50+
51+
it('should call setOnboardingSeen when "Skip for now" button is clicked', () => {
52+
const mockSetOnboardingSeen = jest.fn()
53+
54+
renderActionsComponent({ setOnboardingSeen: mockSetOnboardingSeen })
55+
56+
const skipButton = screen.getByText(/Skip for now/i)
57+
expect(skipButton).toBeInTheDocument()
58+
59+
// Simulate button click and verify the function is called
60+
fireEvent.click(skipButton)
61+
expect(mockSetOnboardingSeen).toHaveBeenCalled()
62+
})
63+
64+
it('should call startOnboardingWizard when "Explore vector search" is clicked', () => {
65+
const mockStartOnboardingWizard = jest.fn()
66+
mockUseStartWizard.mockReturnValue(mockStartOnboardingWizard)
67+
68+
renderActionsComponent()
69+
70+
const exploreButton = screen.getByText(/Explore vector search/i)
71+
expect(exploreButton).toBeInTheDocument()
72+
73+
// Simulate button click and verify the function is called
74+
fireEvent.click(exploreButton)
75+
expect(mockStartOnboardingWizard).toHaveBeenCalled()
76+
})
77+
})

redisinsight/ui/src/pages/vector-search/pages/VectorSearchPage.spec.tsx

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ import {
99
} from 'uiSrc/mocks/handlers/instances/instancesHandlers'
1010
import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
1111
import { redisearchListSelector } from 'uiSrc/slices/browser/redisearch'
12-
import VectorSearchPage from './VectorSearchPage'
12+
import { VectorSearch } from './VectorSearchPage'
1313
import useRedisInstanceCompatibility from '../create-index/hooks/useRedisInstanceCompatibility'
14-
import useVectorSearchOnboarding from '../create-index/hooks/useVectorSearchOnboarding'
14+
import {
15+
VectorSearchOnboardingContext,
16+
VectorSearchOnboardingContextType,
17+
} from '../context/VectorSearchOnboardingContext'
1518

1619
// Mock the telemetry module, so we don't send actual telemetry data during tests
1720
jest.mock('uiSrc/telemetry', () => ({
@@ -23,14 +26,26 @@ jest.mock('../create-index/hooks/useRedisInstanceCompatibility', () =>
2326
jest.fn(),
2427
)
2528

26-
jest.mock('../create-index/hooks/useVectorSearchOnboarding', () => jest.fn())
27-
28-
const renderVectorSearchPageComponent = () => render(<VectorSearchPage />)
29+
const renderVectorSearchPageComponent = (
30+
contextValue?: Partial<VectorSearchOnboardingContextType>,
31+
) => {
32+
const defaultContextValue: VectorSearchOnboardingContextType = {
33+
showOnboarding: false,
34+
setOnboardingSeen: jest.fn(),
35+
setOnboardingSeenSilent: jest.fn(),
36+
...contextValue,
37+
}
38+
39+
return render(
40+
<VectorSearchOnboardingContext.Provider value={defaultContextValue}>
41+
<VectorSearch />
42+
</VectorSearchOnboardingContext.Provider>,
43+
)
44+
}
2945

3046
describe('VectorSearchPage', () => {
3147
const mockUseRedisInstanceCompatibility =
3248
useRedisInstanceCompatibility as jest.Mock
33-
const mockUseVectorSearchOnboarding = useVectorSearchOnboarding as jest.Mock
3449

3550
beforeEach(() => {
3651
cleanup()
@@ -40,11 +55,6 @@ describe('VectorSearchPage', () => {
4055
hasRedisearch: true,
4156
hasSupportedVersion: true,
4257
})
43-
44-
mockUseVectorSearchOnboarding.mockReturnValue({
45-
showOnboarding: false,
46-
markOnboardingAsSeen: jest.fn(),
47-
})
4858
})
4959

5060
afterEach(() => {
@@ -87,12 +97,7 @@ describe('VectorSearchPage', () => {
8797
})
8898

8999
it('should render onboarding screen when opening the page for the first time', () => {
90-
mockUseVectorSearchOnboarding.mockReturnValue({
91-
showOnboarding: true,
92-
markOnboardingAsSeen: jest.fn(),
93-
})
94-
95-
renderVectorSearchPageComponent()
100+
renderVectorSearchPageComponent({ showOnboarding: true })
96101

97102
const onboarding = screen.getByTestId('vector-search-onboarding')
98103
expect(onboarding).toBeInTheDocument()

0 commit comments

Comments
 (0)