/// describe("Users Admin Management", () => { beforeEach(() => { cy.login(); cy.visit("/users-admin"); cy.waitForLoading(); }); it("should display users admin list page", () => { cy.contains("مدیریت کاربران").should("be.visible"); cy.getByTestId("create-user-button").should("be.visible"); }); it("should navigate to create user page", () => { cy.getByTestId("create-user-button").click(); cy.url().should("include", "/users-admin/create"); cy.contains("ایجاد کاربر جدید").should("be.visible"); }); it("should create a new user", () => { cy.getByTestId("create-user-button").click(); // Fill basic information cy.getByTestId("first-name-input").type("محمد"); cy.getByTestId("last-name-input").type("احمدی"); cy.getByTestId("phone-number-input").type("09123456789"); cy.getByTestId("email-input").type("mohammad.ahmadi@example.com"); cy.getByTestId("national-code-input").type("1234567890"); cy.getByTestId("password-input").type("password123"); // Set verification status cy.getByTestId("verified-true-radio").check(); // Submit form cy.getByTestId("submit-button").click(); // Verify creation cy.url().should("include", "/users-admin/"); cy.url().should("not.include", "/create"); }); it("should validate required fields", () => { cy.getByTestId("create-user-button").click(); // Submit button should be disabled initially cy.getByTestId("submit-button").should("be.disabled"); // Fill only first name cy.getByTestId("first-name-input").type("محمد"); cy.getByTestId("submit-button").should("be.disabled"); // Fill all required fields cy.getByTestId("last-name-input").type("احمدی"); cy.getByTestId("phone-number-input").type("09123456789"); // Now submit button should be enabled cy.getByTestId("submit-button").should("not.be.disabled"); }); it("should validate phone number format", () => { cy.getByTestId("create-user-button").click(); // Test invalid phone number cy.getByTestId("phone-number-input").type("123456"); cy.getByTestId("first-name-input").type("محمد"); cy.getByTestId("last-name-input").type("احمدی"); cy.get(".text-red-600").should("contain", "شماره تلفن معتبر نیست"); // Fix phone number cy.getByTestId("phone-number-input").clear().type("09123456789"); cy.get(".text-red-600").should("not.contain", "شماره تلفن معتبر نیست"); }); it("should validate email format", () => { cy.getByTestId("create-user-button").click(); // Test invalid email cy.getByTestId("email-input").type("invalid-email"); cy.getByTestId("first-name-input").type("محمد"); cy.get(".text-red-600").should("contain", "ایمیل معتبر نیست"); // Fix email cy.getByTestId("email-input").clear().type("valid@example.com"); cy.get(".text-red-600").should("not.contain", "ایمیل معتبر نیست"); }); it("should search users", () => { // Search by text cy.getByTestId("search-users-input").type("محمد"); cy.getByTestId("search-button").click(); cy.wait(500); // Clear search cy.getByTestId("clear-filters-button").click(); cy.getByTestId("search-users-input").should("have.value", ""); }); it("should filter users by status", () => { // Filter by verified status cy.getByTestId("status-filter-select").select("verified"); cy.getByTestId("search-button").click(); cy.wait(500); // Filter by unverified status cy.getByTestId("status-filter-select").select("unverified"); cy.getByTestId("search-button").click(); cy.wait(500); // Reset filter cy.getByTestId("status-filter-select").select("all"); cy.getByTestId("search-button").click(); }); it("should handle user verification toggle", () => { // Mock API response for users list cy.intercept("GET", "**/users**", { statusCode: 200, body: { users: [ { id: 1, phone_number: "+989123456789", first_name: "محمد", last_name: "احمدی", email: "mohammad@example.com", verified: false, }, ], total: 1, limit: 20, offset: 0, }, }).as("getUsers"); // Mock verify API cy.intercept("POST", "**/users/1/verify", { statusCode: 200, body: { message: "User verified successfully" }, }).as("verifyUser"); cy.visit("/users-admin"); cy.wait("@getUsers"); // Click verify button cy.getByTestId("verify-user-1").click(); cy.wait("@verifyUser"); // Check for success message cy.contains("کاربر با موفقیت تأیید شد").should("be.visible"); }); it("should view user details", () => { // Mock API response cy.intercept("GET", "**/users**", { statusCode: 200, body: { users: [ { id: 1, phone_number: "+989123456789", first_name: "محمد", last_name: "احمدی", email: "mohammad@example.com", verified: true, }, ], }, }).as("getUsers"); cy.intercept("GET", "**/users/1", { statusCode: 200, body: { id: 1, phone_number: "+989123456789", first_name: "محمد", last_name: "احمدی", email: "mohammad@example.com", verified: true, }, }).as("getUser"); cy.visit("/users-admin"); cy.wait("@getUsers"); // Click view button cy.getByTestId("view-user-1").click(); cy.wait("@getUser"); cy.url().should("include", "/users-admin/1"); cy.contains("جزئیات کاربر").should("be.visible"); cy.contains("محمد احمدی").should("be.visible"); }); it("should edit user", () => { // Mock get user API cy.intercept("GET", "**/users/1", { statusCode: 200, body: { id: 1, phone_number: "+989123456789", first_name: "محمد", last_name: "احمدی", email: "mohammad@example.com", verified: true, }, }).as("getUser"); // Mock update user API cy.intercept("PUT", "**/users/1", { statusCode: 200, body: { id: 1, phone_number: "+989123456789", first_name: "محمد", last_name: "احمدی ویرایش شده", email: "mohammad.updated@example.com", verified: true, }, }).as("updateUser"); cy.visit("/users-admin/1/edit"); cy.wait("@getUser"); // Edit user information cy.getByTestId("last-name-input").clear().type("احمدی ویرایش شده"); cy.getByTestId("email-input").clear().type("mohammad.updated@example.com"); // Submit form cy.getByTestId("submit-button").click(); cy.wait("@updateUser"); // Check for success message cy.contains("کاربر با موفقیت به‌روزرسانی شد").should("be.visible"); }); it("should delete user with confirmation", () => { // Mock API responses cy.intercept("GET", "**/users**", { statusCode: 200, body: { users: [ { id: 1, phone_number: "+989123456789", first_name: "محمد", last_name: "احمدی", email: "mohammad@example.com", verified: true, }, ], }, }).as("getUsers"); cy.intercept("DELETE", "**/users/1", { statusCode: 200, body: { message: "User deleted successfully" }, }).as("deleteUser"); cy.visit("/users-admin"); cy.wait("@getUsers"); // Click delete button cy.getByTestId("delete-user-1").click(); // Confirm deletion in modal cy.contains("آیا از حذف کاربر").should("be.visible"); cy.contains("button", "حذف").click(); cy.wait("@deleteUser"); // Check for success message cy.contains("کاربر با موفقیت حذف شد").should("be.visible"); }); it("should handle form cancellation", () => { cy.getByTestId("create-user-button").click(); // Fill some data cy.getByTestId("first-name-input").type("محمد"); cy.getByTestId("last-name-input").type("احمدی"); // Click cancel cy.getByTestId("cancel-button").click(); // Should return to list page cy.url().should("include", "/users-admin"); cy.url().should("not.include", "/create"); }); it("should show empty state when no users found", () => { // Mock empty users response cy.intercept("GET", "**/users**", { statusCode: 200, body: { users: [], total: 0, limit: 20, offset: 0, }, }).as("getEmptyUsers"); cy.visit("/users-admin"); cy.wait("@getEmptyUsers"); cy.contains("هیچ کاربری یافت نشد").should("be.visible"); cy.contains("برای شروع یک کاربر ایجاد کنید").should("be.visible"); }); it("should work on mobile viewport", () => { cy.viewport("iphone-6"); cy.getByTestId("create-user-button").should("be.visible"); cy.getByTestId("create-user-button").click(); cy.contains("ایجاد کاربر جدید").should("be.visible"); // Form should be usable on mobile cy.getByTestId("first-name-input").type("محمد"); cy.getByTestId("last-name-input").type("احمدی"); cy.getByTestId("phone-number-input").type("09123456789"); cy.getByTestId("submit-button").should("be.visible"); }); it("should be accessible", () => { cy.getByTestId("create-user-button").click(); // Check for proper labels cy.get("label").should("have.length.greaterThan", 5); // Check for required field indicators cy.getByTestId("first-name-input").should( "have.attr", "aria-required", "true" ); cy.getByTestId("last-name-input").should( "have.attr", "aria-required", "true" ); // Check for proper form structure cy.get("form").should("exist"); cy.get(".bg-gradient-to-r").should("have.length.greaterThan", 1); }); });