from __future__ import annotations from uuid import uuid4 from playwright.sync_api import Page, expect from tests.e2e.helpers import accept_next_dialog, expect_flash, expect_path, login def _unique_suffix() -> str: return uuid4().hex[:8] def test_admin_can_create_household_and_manage_members( page: Page, base_url: str, admin_credentials: dict[str, str], ) -> None: suffix = _unique_suffix() head_name = f"自动化新户{suffix}" member_name = f"成员{suffix}" updated_member_name = f"成员更新{suffix}" login( page, base_url, username=admin_credentials["username"], password=admin_credentials["password"], expected_path="/", ) page.get_by_role("link", name="新增一户").click() expect_path(page, base_url, "/households/new") expect(page.get_by_role("heading", name="最小创建一户")).to_be_visible() page.locator("#head_name").fill(head_name) page.locator("#note").fill("E2E 创建的新户") page.get_by_role("button", name="创建并继续补充").click() expect(page.get_by_role("heading", name="编辑户信息")).to_be_visible() expect_flash(page, f"已创建户 {head_name}") expect(page.locator("#household_code")).not_to_have_value("") expect(page.locator("#head_name")).to_have_value(head_name) expect(page.locator("#note")).to_have_value("E2E 创建的新户") page.locator("summary").filter(has_text="+ 添加新成员").click() new_member_form = page.locator("#new-member-form") new_member_form.locator("#new_member_name").fill(member_name) new_member_form.locator("#new_member_relation").select_option("子女") new_member_form.locator("#new_member_gender").select_option("male") new_member_form.locator("#new_member_age_group").select_option("child") new_member_form.get_by_role("checkbox", name="是儿童").check() new_member_form.get_by_role("checkbox", name="需红包").check() new_member_form.locator("#new_member_note").fill("新增成员备注") new_member_form.get_by_role("button", name="添加成员").click() expect_flash(page, f"已添加成员 {member_name}。") member_row = page.locator("div.rounded-xl", has_text=member_name).first expect(member_row.get_by_text(member_name, exact=True)).to_be_visible() expect(member_row.get_by_text("需红包", exact=True)).to_be_visible() member_row.get_by_role("button", name="编辑").click() expect(page.locator("#edit-member-modal")).to_be_visible() page.locator("#edit_member_name").fill(updated_member_name) page.locator("#edit_member_relation").select_option("其他亲属") page.locator("#edit_member_age_group").select_option("teen") page.locator("#edit_member_is_child").uncheck() page.locator("#edit_member_needs_red_packet").uncheck() page.locator("#edit_member_actually_attended").check() page.locator("#edit_member_note").fill("编辑后的成员备注") page.locator("#edit-member-form").get_by_role("button", name="保存修改").click() expect_flash(page, f"已更新成员 {updated_member_name} 的信息。") updated_member_row = page.locator("div.rounded-xl", has_text=updated_member_name).first expect(updated_member_row.get_by_text(updated_member_name, exact=True)).to_be_visible() expect(updated_member_row.get_by_text("编辑后的成员备注")).to_be_visible() expect(updated_member_row.get_by_text("已到场")).to_be_visible() accept_next_dialog(page, expected_message_substring=updated_member_name) updated_member_row.get_by_role("button", name="删除").click() expect_flash(page, f"已删除成员 {updated_member_name}。") expect(page.locator("div.rounded-xl", has_text=updated_member_name)).to_have_count(0) expect(page.get_by_text("暂无家庭成员记录,点击下方按钮添加。")).to_be_visible()