From 0d9784b03a30e57e175f5b8120bd08ce0226fca0 Mon Sep 17 00:00:00 2001
From: hamed <15238-genius.ha@users.noreply.drupalcode.org>
Date: Sun, 19 Jul 2026 12:43:18 +0330
Subject: [PATCH] feat: add QA driver for ClinicPro to automate testing and
reporting
---
.claude/skills/qa-clinicpro/SKILL.md | 300 ++++++++++++++++++
.claude/skills/qa-clinicpro/driver.mjs | 421 +++++++++++++++++++++++++
2 files changed, 721 insertions(+)
create mode 100644 .claude/skills/qa-clinicpro/SKILL.md
create mode 100644 .claude/skills/qa-clinicpro/driver.mjs
diff --git a/.claude/skills/qa-clinicpro/SKILL.md b/.claude/skills/qa-clinicpro/SKILL.md
new file mode 100644
index 00000000..50054ab1
--- /dev/null
+++ b/.claude/skills/qa-clinicpro/SKILL.md
@@ -0,0 +1,300 @@
+---
+name: qa-clinicpro
+description: تست QA اپلیکیشن ClinicPro مثل یک کاربر واقعی — اجرای اپ، ورود با هر نقش، پیمایش صفحات پنل ادمین، اسکرینشات، کشف خطاهای کنسول و شبکه، تست UI/UX و RTL، تست دسترسی نقشها (authz)، تست قرارداد API و اندازهگیری کارایی، و تولید Bug Report. Use when asked to QA, test, smoke-test, find bugs in, screenshot, or verify ClinicPro's admin panel or API — «تست کن»، «باگ پیدا کن»، «QA کن»، «این صفحه را بررسی کن».
+---
+
+# QA ClinicPro
+
+ClinicPro = بکاند Symfony 7.4 + یک **SPA کلاینتساید React 19** که از `/admin/*` سرو میشود.
+یعنی `curl` و فلگ `--screenshot` کروم به درد نمیخورند — هر دو روی فرم لاگین مینشینند،
+چون JWT در `localStorage['clinicpro-auth']` است.
+
+درایور این skill آن کار را انجام میدهد: با API لاگین میکند، `localStorage` را seed
+میکند، بعد ناوبری میکند و **خطاهای کنسول، درخواستهای شکستخورده، مسیری که واقعاً روی آن
+فرود آمده، و اسکرینشات** را گزارش میدهد — با CDP روی `WebSocket` نیتیو Node 22،
+**بدون هیچ وابستگی npm** (نه playwright، نه puppeteer).
+
+مسیرها نسبت به `clinicpro/` هستند.
+
+## پیشنیازها
+
+هیچ نصبی لازم نیست. فقط این دو:
+
+```bash
+ddev describe | head -3 # باید بالا باشد: https://clinic-pro.ddev.site
+ls "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
+```
+
+کروم جای دیگری است؟ `CHROME_BIN` را ست کن. بکاند جای دیگری است؟ `CLINICPRO_BASE`.
+
+## کاربران تست
+
+⚠ **`TEST_USERS.md` منسوخ است** — هیچکدام از کاربرانش (`09100000001`, `09100100000`, …)
+در دیتابیس وجود ندارند و همه `ERR_AUTH_005` میگیرند. اسکریپتهای `create_test_users.php`
+و `seed_realistic_data.php` هم که آن فایل ارجاع میدهد در ریپو نیستند.
+
+نقشهای واقعیِ کارکننده در `ROLES` داخل درایور هاردکد شدهاند:
+
+| نقش | موبایل | پسورد |
+|---|---|---|
+| `admin` | `09120671756` | `QaTest@1234` |
+| `clinic` | `09127000000` | `QaTest@1234` |
+| `secretary` | `09123456778` | `QaTest@1234` |
+| `doctor` | `09390039833` | `09390039833` |
+| `representation` | `09124000001` | `09124000001` |
+
+سه تای اول پسوردشان عمداً برای QA ست شده. اگر DB ریست شد، دوباره ست کن:
+
+```bash
+ddev exec php bin/console security:hash-password 'QaTest@1234'
+# هش خروجی را در این کوئری بگذار:
+ddev mysql -e "UPDATE users SET password_hash='<هش>' \
+ WHERE mobile_number IN ('09120671756','09127000000','09123456778');"
+```
+
+اعتبارسنجی همه نقشها:
+
+```bash
+node .claude/skills/qa-clinicpro/driver.mjs roles
+```
+
+خروجی واقعی:
+
+```
+admin 09120671756 ROLE_USER,ROLE_ADMIN token 15min
+clinic 09127000000 ROLE_USER,ROLE_CLINIC token 15min
+secretary 09123456778 ROLE_USER,ROLE_SECRETARY token 15min
+doctor 09390039833 ROLE_USER,ROLE_DOCTOR token 15min
+representation 09124000001 ROLE_USER,ROLE_REPRESENTATION token 15min
+```
+
+میتوانی بهجای نام نقش، `--as "0912xxxxxxx:password"` هم بدهی.
+
+---
+
+## مسیر اجرا (agent path)
+
+### ۱. بازدید از صفحه — اسکرینشات + خطاها
+
+```bash
+node .claude/skills/qa-clinicpro/driver.mjs visit \
+ "https://clinic-pro.ddev.site/admin/dashboard" --as admin --out /tmp/qa-dash.png
+```
+
+```
+✓ screenshot /tmp/qa-dash.png (1440x900, as admin)
+
+LANDING
+ (none)
+
+CONSOLE ERRORS
+ (none)
+
+NETWORK FAILURES
+ (none)
+```
+
+**بعد حتماً تصویر را با ابزار Read باز کن و نگاه کن.** نیمی از باگهای UI فقط دیدنیاند،
+نه لاگشدنی — همان یک اسکرینشات داشبورد دو باگ i18n لو داد (پایین را ببین).
+
+فلگها: `--w 1440 --h 900` (ویوپورت)، `--wait 4000` (ms صبر برای رندر)، `--full` (کل صفحه).
+
+**موبایل را جدا تست کن** — پنل RTL و پرجدول است و بیشتر مشکلات آنجاست:
+
+```bash
+node .claude/skills/qa-clinicpro/driver.mjs visit \
+ "https://clinic-pro.ddev.site/admin/dashboard" --as admin --w 390 --h 844 --out /tmp/qa-m.png
+```
+
+بخش `LANDING` دو حالتی را میگیرد که اسکرینشات پنهان میکند:
+
+```
+⚠ WRONG PAGE: asked /admin/users, landed /admin/dashboard — role likely lacks access (RoleRoute in App.tsx)
+```
+
+### ۲. آدیت UI/UX و RTL
+
+```bash
+node .claude/skills/qa-clinicpro/driver.mjs ux \
+ "https://clinic-pro.ddev.site/admin/dashboard" --as admin --w 390 --h 844
+```
+
+```
+UX FINDINGS (390x844, as admin)
+ 5 tap target(s) under 36px on a mobile viewport
+```
+
+چکها: RTL نبودن ریشه، `lang` غلط، سرریز افقی، رقم لاتین داخل متن فارسی، تارگت لمسی
+زیر ۳۶px، `
` بدون alt، فیلد بدون label، `id` تکراری، جدول خالی بدون empty-state،
+و `