feat(tests, components): enhance Cypress commands and UI elements for improved testing and accessibility

- Added new Cypress commands for mocking admin-related API interactions, including list, create, update, delete, and change status functionalities.
- Introduced data-cy attributes across various components (e.g., Breadcrumbs, Forms, Tables) to improve testability and accessibility.
- Updated existing components to support new data-cy attributes for better integration with Cypress tests.
This commit is contained in:
AmirReza Jamali
2026-04-25 13:25:23 +03:30
parent 2a4f3e7e4b
commit eab516c7f3
24 changed files with 814 additions and 23 deletions
@@ -33,6 +33,7 @@ const AdminListFilters = ({
<form
className="grid !min-w-full grid-cols-1 gap-4 xl:grid-cols-2"
onSubmit={handleFilterSubmit(search)}
data-cy="admins-filter-form"
>
<Select
{...filterRegister("status")}
@@ -43,6 +44,7 @@ const AdminListFilters = ({
clearable
value={watch("status")}
onClear={() => setValue("status", undefined)}
dataCy="admins-filter-status-select"
/>
<InputGroup
{...filterRegister("search")}
@@ -50,6 +52,7 @@ const AdminListFilters = ({
label="search"
placeholder="search"
type="search"
dataCy="admins-filter-search-input"
/>
{/* <InputGroup
{...filterRegister("email")}
@@ -86,6 +89,7 @@ const AdminListFilters = ({
<div className="flex gap-4">
<button
type="submit"
data-cy="admins-filter-submit-button"
className="mt-6 flex w-fit justify-center rounded-lg bg-primary p-[13px] font-medium capitalize text-white hover:bg-opacity-90"
>
{isMutating ? (
@@ -96,6 +100,7 @@ const AdminListFilters = ({
</button>
<button
type="button"
data-cy="admins-filter-close-button"
className="mt-6 flex w-fit justify-center rounded-lg bg-error p-[13px] font-medium capitalize text-white hover:bg-opacity-90"
onClick={() => setIsFilterModalOpen(false)}
>
@@ -35,6 +35,7 @@ const ChangeStatusModalContent: FC<IProps> = ({ status, setStatus }) => {
name="status"
defaultValue={status}
placeholder="Please select new Status"
dataCy="admins-change-status-select"
/>
</form>
);
+21 -10
View File
@@ -51,16 +51,21 @@ const AdminsTable = () => {
} = useAdminsPresenter();
return (
<ListWrapper>
<ListWrapper data-cy="admins-page">
<ListHeader
onFilter={() => setIsFilterModalOpen(true)}
createButtonText="Create Admin"
dataCyPrefix="admins"
/>
<Table>
<Table data-cy="admins-table">
<TableHeader>
<TableRow className="border-none uppercase [&>th]:text-start">
{columns.map((column) => (
<TableHead key={column} colSpan={100}>
{columns.map((column, index) => (
<TableHead
key={column}
colSpan={100}
data-cy={`admins-table-header-${index}`}
>
{column}
</TableHead>
))}
@@ -77,31 +82,33 @@ const AdminsTable = () => {
<TableRow
key={item?.id || index}
className="odd:bg-gray-2 dark:odd:bg-gray-7"
data-cy={`admins-table-row-${item?.id ?? index}`}
>
<TableCell className="text-start" colSpan={100}>
<TableCell className="text-start" colSpan={100} data-cy="admins-row-number">
{getPaginatedRowNumber({ index })}
</TableCell>
<TableCell className="text-start" colSpan={100}>
<TableCell className="text-start" colSpan={100} data-cy="admins-row-full-name">
{item?.full_name}
</TableCell>
<TableCell className="text-start" colSpan={100}>
<TableCell className="text-start" colSpan={100} data-cy="admins-row-email">
{item?.email}
</TableCell>
<TableCell className="text-start" colSpan={100}>
<TableCell className="text-start" colSpan={100} data-cy="admins-row-username">
{item?.username}
</TableCell>
<TableCell className="text-start" colSpan={100}>
<TableCell className="text-start" colSpan={100} data-cy="admins-row-status">
<Status status={item?.status ?? ""}>{item?.status}</Status>
</TableCell>
<TableCell className="text-start xl:pr-7.5">
<TableCell className="text-start xl:pr-7.5" data-cy="admins-row-actions">
<div className="flex items-center justify-start gap-x-3.5">
<button
data-tooltip-id="delete"
data-tooltip-content="Delete"
data-tooltip-place="top"
className="hover:text-red-500"
data-cy={`admins-row-delete-${item?.id ?? index}`}
onClick={() => {
setCurrentUser(item);
setIsModalOpen(true);
@@ -116,6 +123,7 @@ const AdminsTable = () => {
data-tooltip-content="Change status"
data-tooltip-place="top"
className="hover:text-yellow-dark"
data-cy={`admins-row-manage-status-${item?.id ?? index}`}
onClick={() => {
setCurrentUser(item);
setIsChangeStatusModalOpen(true);
@@ -132,6 +140,7 @@ const AdminsTable = () => {
data-tooltip-content="Edit"
data-tooltip-place="top"
className="hover:text-primary"
data-cy={`admins-row-edit-${item?.id ?? index}`}
onClick={() => router.push(`/admins/edit/${item.id}`)}
>
<Tooltip {..._TooltipDefaultParams({ id: "edit" })} />
@@ -151,6 +160,8 @@ const AdminsTable = () => {
onConfirm={() => {
changeStatus({ id: currentUser?.id!, credentials: { status } });
}}
confirmText="Save"
cancelText="Cancel"
>
<ChangeStatusModalContent
status={currentUser?.status as AdminStatus}