Skip to content

Commit 105aef7

Browse files
committed
feat(ConcurrentFileReadsExperiment): improve logic for enabling/disabling and add tests
1 parent da63d1e commit 105aef7

File tree

2 files changed

+152
-8
lines changed

2 files changed

+152
-8
lines changed

webview-ui/src/components/settings/ConcurrentFileReadsExperiment.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,16 @@ export const ConcurrentFileReadsExperiment = ({
1818
const { t } = useAppTranslation()
1919

2020
const handleChange = (value: boolean) => {
21-
// Set to 1 if disabling to reset the setting
22-
if (!value) onMaxConcurrentFileReadsChange(1)
2321
onEnabledChange(value)
22+
// Set to 1 if disabling to reset the setting
23+
if (!value) {
24+
onMaxConcurrentFileReadsChange(1)
25+
} else {
26+
// When enabling, ensure we have a valid value > 1
27+
if (!maxConcurrentFileReads || maxConcurrentFileReads <= 1) {
28+
onMaxConcurrentFileReadsChange(15)
29+
}
30+
}
2431
}
2532

2633
return (
@@ -48,15 +55,11 @@ export const ConcurrentFileReadsExperiment = ({
4855
min={2}
4956
max={100}
5057
step={1}
51-
value={[
52-
maxConcurrentFileReads && maxConcurrentFileReads > 1 ? maxConcurrentFileReads : 15,
53-
]}
58+
value={[maxConcurrentFileReads]}
5459
onValueChange={([value]) => onMaxConcurrentFileReadsChange(value)}
5560
data-testid="max-concurrent-file-reads-slider"
5661
/>
57-
<span className="w-10 text-sm">
58-
{maxConcurrentFileReads && maxConcurrentFileReads > 1 ? maxConcurrentFileReads : 15}
59-
</span>
62+
<span className="w-10 text-sm">{maxConcurrentFileReads}</span>
6063
</div>
6164
</div>
6265
</div>
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
import { render, screen, fireEvent } from "@testing-library/react"
2+
import { ConcurrentFileReadsExperiment } from "../ConcurrentFileReadsExperiment"
3+
4+
// Mock the translation hook
5+
jest.mock("@/i18n/TranslationContext", () => ({
6+
useAppTranslation: () => ({
7+
t: (key: string) => key,
8+
}),
9+
}))
10+
11+
// Mock ResizeObserver which is used by the Slider component
12+
global.ResizeObserver = jest.fn().mockImplementation(() => ({
13+
observe: jest.fn(),
14+
unobserve: jest.fn(),
15+
disconnect: jest.fn(),
16+
}))
17+
18+
describe("ConcurrentFileReadsExperiment", () => {
19+
const mockOnEnabledChange = jest.fn()
20+
const mockOnMaxConcurrentFileReadsChange = jest.fn()
21+
22+
beforeEach(() => {
23+
jest.clearAllMocks()
24+
})
25+
26+
it("should render with disabled state", () => {
27+
render(
28+
<ConcurrentFileReadsExperiment
29+
enabled={false}
30+
onEnabledChange={mockOnEnabledChange}
31+
maxConcurrentFileReads={1}
32+
onMaxConcurrentFileReadsChange={mockOnMaxConcurrentFileReadsChange}
33+
/>,
34+
)
35+
36+
const checkbox = screen.getByTestId("concurrent-file-reads-checkbox")
37+
expect(checkbox).not.toBeChecked()
38+
39+
// Slider should not be visible when disabled
40+
expect(screen.queryByTestId("max-concurrent-file-reads-slider")).not.toBeInTheDocument()
41+
})
42+
43+
it("should render with enabled state", () => {
44+
render(
45+
<ConcurrentFileReadsExperiment
46+
enabled={true}
47+
onEnabledChange={mockOnEnabledChange}
48+
maxConcurrentFileReads={20}
49+
onMaxConcurrentFileReadsChange={mockOnMaxConcurrentFileReadsChange}
50+
/>,
51+
)
52+
53+
const checkbox = screen.getByTestId("concurrent-file-reads-checkbox")
54+
expect(checkbox).toBeChecked()
55+
56+
// Slider should be visible when enabled
57+
expect(screen.getByTestId("max-concurrent-file-reads-slider")).toBeInTheDocument()
58+
expect(screen.getByText("20")).toBeInTheDocument()
59+
})
60+
61+
it("should set maxConcurrentFileReads to 15 when enabling from disabled state", () => {
62+
render(
63+
<ConcurrentFileReadsExperiment
64+
enabled={false}
65+
onEnabledChange={mockOnEnabledChange}
66+
maxConcurrentFileReads={1}
67+
onMaxConcurrentFileReadsChange={mockOnMaxConcurrentFileReadsChange}
68+
/>,
69+
)
70+
71+
const checkbox = screen.getByTestId("concurrent-file-reads-checkbox")
72+
fireEvent.click(checkbox)
73+
74+
expect(mockOnEnabledChange).toHaveBeenCalledWith(true)
75+
expect(mockOnMaxConcurrentFileReadsChange).toHaveBeenCalledWith(15)
76+
})
77+
78+
it("should set maxConcurrentFileReads to 1 when disabling", () => {
79+
render(
80+
<ConcurrentFileReadsExperiment
81+
enabled={true}
82+
onEnabledChange={mockOnEnabledChange}
83+
maxConcurrentFileReads={25}
84+
onMaxConcurrentFileReadsChange={mockOnMaxConcurrentFileReadsChange}
85+
/>,
86+
)
87+
88+
const checkbox = screen.getByTestId("concurrent-file-reads-checkbox")
89+
fireEvent.click(checkbox)
90+
91+
expect(mockOnEnabledChange).toHaveBeenCalledWith(false)
92+
expect(mockOnMaxConcurrentFileReadsChange).toHaveBeenCalledWith(1)
93+
})
94+
95+
it("should not change maxConcurrentFileReads when enabling if already > 1", () => {
96+
render(
97+
<ConcurrentFileReadsExperiment
98+
enabled={false}
99+
onEnabledChange={mockOnEnabledChange}
100+
maxConcurrentFileReads={30}
101+
onMaxConcurrentFileReadsChange={mockOnMaxConcurrentFileReadsChange}
102+
/>,
103+
)
104+
105+
const checkbox = screen.getByTestId("concurrent-file-reads-checkbox")
106+
fireEvent.click(checkbox)
107+
108+
expect(mockOnEnabledChange).toHaveBeenCalledWith(true)
109+
// Should not call onMaxConcurrentFileReadsChange since value is already > 1
110+
expect(mockOnMaxConcurrentFileReadsChange).not.toHaveBeenCalled()
111+
})
112+
113+
it("should update value when slider changes", () => {
114+
// Since the Slider component doesn't render a standard input,
115+
// we'll test the component's interaction through its props
116+
const { rerender } = render(
117+
<ConcurrentFileReadsExperiment
118+
enabled={true}
119+
onEnabledChange={mockOnEnabledChange}
120+
maxConcurrentFileReads={15}
121+
onMaxConcurrentFileReadsChange={mockOnMaxConcurrentFileReadsChange}
122+
/>,
123+
)
124+
125+
// Verify initial value is displayed
126+
expect(screen.getByText("15")).toBeInTheDocument()
127+
128+
// Simulate the slider change by re-rendering with new value
129+
rerender(
130+
<ConcurrentFileReadsExperiment
131+
enabled={true}
132+
onEnabledChange={mockOnEnabledChange}
133+
maxConcurrentFileReads={50}
134+
onMaxConcurrentFileReadsChange={mockOnMaxConcurrentFileReadsChange}
135+
/>,
136+
)
137+
138+
// Verify new value is displayed
139+
expect(screen.getByText("50")).toBeInTheDocument()
140+
})
141+
})

0 commit comments

Comments
 (0)