Skip to content

Commit

Permalink
Add a test for IpaTextInput component
Browse files Browse the repository at this point in the history
The `IpaTextInput` component must have a test
to check its functionality.

Signed-off-by: Carla Martinez <[email protected]>
  • Loading branch information
carma12 committed Jan 13, 2025
1 parent 7c21d82 commit 455687b
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 2 deletions.
122 changes: 122 additions & 0 deletions src/components/Form/IpaTextInput/IpaTextInput.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import React from "react";
import { render, screen, fireEvent, act } from "@testing-library/react";
import "@testing-library/jest-dom";
// Component
import IpaTextInput from "./IpaTextInput";
// Utils
import { IPAParamDefinition } from "src/utils/ipaObjectUtils";

describe("IpaTextInput Component", () => {
const mockOnChange = jest.fn();

const mockMetadata = {
objects: {
user: {
name: "user",
takes_params: [
{
alwaysask: false,
attribute: true,
autofill: false,
class: "String",
cli_metavar: "CUSTOMIPATEXTINPUT",
cli_name: "customipatextinput",
confirm: false,
deprecated_cli_aliases: [],
deprecated: false,
doc: "Custom IpaTextInput.",
flags: [],
label: "Custom IpaTextInput",
maxlength: 255,
multivalue: false,
name: "customipatextinput",
no_convert: false,
noextrawhitespace: true,
pattern_errmsg: "",
pattern: "",
primary_key: false,
query: false,
required: false,
sortorder: 1,
type: "string",
},
],
},
},
};

const mockIpaObject = {
attributelevelrights: {},
default_attributes: [],
cn: "customipatextinput",
customipatextinput: "Initial value",
dn: "",
gidnumber: "1234",
ipantsecurityidentifier: [],
ipauniqueid: [],
member: [],
member_external: [],
member_group: [],
member_idoverrideuser: [],
member_service: [],
member_user: [],
memberindirect_group: [],
memberindirect_idoverrideuser: [],
memberindirect_service: [],
memberindirect_user: [],
membermanager_group: [],
membermanager_user: [],
memberof_group: [],
memberof_hbacrule: [],
memberof_netgroup: [],
memberof_role: [],
memberof_subid: [],
memberof_sudorule: [],
memberofindirect_group: [],
memberofindirect_hbacrule: [],
memberofindirect_netgroup: [],
memberofindirect_role: [],
memberofindirect_subid: [],
memberofindirect_sudorule: [],
objectclass: [],
};

const defaultProps: IPAParamDefinition = {
name: "customipatextinput",
ariaLabel: "Custom IpaTextInput",
ipaObject: mockIpaObject,
objectName: "user",
onChange: mockOnChange,
required: false,
readOnly: false,
metadata: mockMetadata,
};

afterEach(() => {
jest.clearAllMocks();
});

it("renders IpaTextInput with default props", () => {
render(<IpaTextInput {...defaultProps} />);
expect(screen.getByLabelText("Custom IpaTextInput")).toBeInTheDocument();
});

it("calls onChange when input value changes", async () => {
render(<IpaTextInput {...defaultProps} />);
const textInput = screen.getByLabelText("Custom IpaTextInput");

act(() => {
fireEvent.change(textInput, { target: { value: "new value" } });
});

expect(mockOnChange).toHaveBeenCalledTimes(1);
expect(textInput).toHaveValue("new value");
});

it("renders disabled input", () => {
render(<IpaTextInput {...defaultProps} readOnly={true} />);
expect(screen.getByLabelText("Custom IpaTextInput")).toHaveAttribute(
"readonly"
);
});
});
15 changes: 13 additions & 2 deletions src/components/Form/IpaTextInput/IpaTextInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,23 @@ import {
const IpaTextInput = (props: IPAParamDefinition) => {
const { required, readOnly, value, onChange } = getParamProperties(props);

const [textInputValue, setTextInputValue] = React.useState<string>(
convertToString(value)
);

React.useEffect(() => {
setTextInputValue(convertToString(value));
}, [value]);

return (
<TextInput
id={props.name}
name={props.name}
value={convertToString(value)}
onChange={(_event, value) => onChange(value)}
value={textInputValue}
onChange={(_event, value) => {
setTextInputValue(value);
onChange(value);
}}
type="text"
aria-label={props.ariaLabel !== undefined ? props.ariaLabel : props.name}
isRequired={required}
Expand Down

0 comments on commit 455687b

Please sign in to comment.