8000 chore: test improvements · coder/coder@575b0f0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 575b0f0

Browse files
committed
chore: test improvements
1 parent 8f0fb68 commit 575b0f0

File tree

1 file changed

+122
-20
lines changed

1 file changed

+122
-20
lines changed

site/src/modules/workspaces/DynamicParameter/DynamicParameter.test.tsx

Lines changed: 122 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,54 @@ const mockParameterWithIcon = createMockParameter({
235235
icon: "/test-icon.png",
236236
});
237237

238+
const mockNumberInputParameter = createMockParameter({
239+
name: "number_input_param",
240+
display_name: "Number Input Parameter",
241+
description: "A numeric input parameter with min/max validations",
242+
type: "number",
243+
form_type: "input",
244+
default_value: { value: "5", valid: true },
245+
validations: [
246+
{
247+
validation_min: 1,
248+
validation_max: 10,
249+
validation_error: "Value must be between 1 and 10",
250+
validation_regex: null,
251+
validation_monotonic: null,
252+
},
253+
],
254+
});
255+
256+
// Mock for a masked input parameter (e.g. secrets)
257+
const mockMaskedInputParameter = createMockParameter({
258+
name: "masked_input_param",
10000 259+
display_name: "Masked Input Parameter",
260+
type: "string",
261+
form_type: "input",
262+
styling: {
263+
placeholder: "********",
264+
disabled: false,
265+
label: "",
266+
mask_input: true,
267+
},
268+
});
269+
270+
// Mock parameter that contains a warning diagnostic
271+
const mockWarningParameter = createMockParameter({
272+
name: "warning_param",
273+
display_name: "Warning Parameter",
274+
description: "Parameter with a warning diagnostic",
275+
form_type: "input",
276+
diagnostics: [
277+
{
278+
severity: "warning",
279+
summary: "This is a warning",
280+
detail: "Something might be wrong",
281+
extra: { code: "warning" },
282+
},
283+
],
284+
});
285+
238286
describe("DynamicParameter", () => {
239287
const mockOnChange = jest.fn();
240288

@@ -421,7 +469,6 @@ describe("DynamicParameter", () => {
421469
await userEvent.click(select);
422470
});
423471

424-
// Option 2 has an icon
425472
const icons = screen.getAllByRole("img");
426473
expect(
427474
icons.some((icon) => icon.getAttribute("src") === "/icon2.png"),
@@ -532,23 +579,6 @@ describe("DynamicParameter", () => {
532579
expect(slider).toHaveAttribute("aria-valuenow", "50");
533580
});
534581

535-
it("handles slider value changes", async () => {
536-
render(
537-
<DynamicParameter
538-
parameter={mockSliderParameter}
539-
value="50"
540-
onChange={mockOnChange}
541-
/>,
542-
);
543-
544-
const slider = screen.getByRole("slider");
545-
546-
fireEvent.keyDown(slider, { key: "ArrowRight" });
547-
548-
expect(slider).toHaveAttribute("tabindex", "0");
549-
expect(slider).not.toHaveAttribute("aria-disabled");
550-
});
551-
552582
it("respects min/max constraints from validation_condition", () => {
553583
render(
554584
<DynamicParameter
@@ -762,7 +792,6 @@ describe("DynamicParameter", () => {
762792
);
763793

764794
const input = screen.getByRole("textbox");
765-
const label = screen.getByText("String Parameter");
766795

767796
expect(input).toHaveAccessibleName("String Parameter");
768797
});
@@ -872,7 +901,6 @@ describe("DynamicParameter", () => {
872901
/>,
873902
);
874903

875-
// Should not crash and should render the component
876904
expect(screen.getByText("Tags Parameter")).toBeInTheDocument();
877905
});
878906

@@ -911,4 +939,78 @@ describe("DynamicParameter", () => {
911939
).toBeInTheDocument();
912940
});
913941
});
942+
943+
describe("Number Input Parameter", () => {
944+
it("renders number input with correct min/max attributes", () => {
945+
render(
946+
<DynamicParameter
947+
parameter={mockNumberInputParameter}
948+
value="5"
949+
onChange={mockOnChange}
950+
/>,
951+
);
952+
953+
const input = screen.getByRole("spinbutton");
954+
expect(input).toHaveAttribute("min", "1");
955+
expect(input).toHaveAttribute("max", "10");
956+
});
957+
958+
it("calls onChange when numeric value changes (debounced)", () => {
959+
jest.useFakeTimers();
960+
render(
961+
<DynamicParameter
962+
parameter={mockNumberInputParameter}
963+
value="5"
964+
onChange={mockOnChange}
965+
/>,
966+
);
967+
968+
const input = screen.getByRole("spinbutton");
969+
fireEvent.change(input, { target: { value: "7" } });
970+
971+
act(() => {
972+
jest.runAllTimers();
973+
});
974+
975+
expect(mockOnChange).toHaveBeenCalledWith("7");
976+
jest.useRealTimers();
977+
});
978+
});
979+
980+
describe("Masked Input Parameter", () => {
981+
it("renders a password field by default and toggles visibility on mouse events", async () => {
982+
render(
983+
<DynamicParameter
984+
parameter={mockMaskedInputParameter}
985+
value="secret123"
986+
onChange={mockOnChange}
987+
/>,
988+
);
989+
990+
const input = screen.getByLabelText("Masked Input Parameter");
991+
expect(input).toHaveAttribute("type", "password");
992+
993+
const toggleButton = screen.getByRole("button");
994+
fireEvent.mouseDown(toggleButton);
995+
expect(input).toHaveAttribute("type", "text");
996+
997+
fireEvent.mouseUp(toggleButton);
998+
expect(input).toHaveAttribute("type", "password");
999+
});
1000+
});
1001+
1002+
describe("Parameter Diagnostics", () => {
1003+
it("renders warning diagnostics for non-error parameters", () => {
1004+
render(
1005+
<DynamicParameter
1006+
parameter={mockWarningParameter}
1007+
value=""
1008+
onChange={mockOnChange}
1009+
/>,
1010+
);
1011+
1012+
expect(screen.getByText("This is a warning")).toBeInTheDocument();
1013+
expect(screen.getByText("Something might be wrong")).toBeInTheDocument();
1014+
});
1015+
});
9141016
});

0 commit comments

Comments
 (0)
0