# آزمون و تضمین کیفیت

## ۱. آزمون‌های بحرانی بک‌اند

مسیر: `backend/tests/critical.test.ts`
اجرا: `npm test` (در ریشه) یا `PGLITE_MEMORY=1 npx tsx --test backend/tests/critical.test.ts`

آزمون‌ها روی یک پایگاه داده‌ی **درون‌حافظه‌ای** با همان مهاجرت‌های واقعی اجرا می‌شوند،
نه با Mock. یعنی محدودیت‌های پایگاه داده هم واقعاً سنجیده می‌شوند.

### وضعیت فعلی: ۲۲ آزمون در ۶ مجموعه — همه سبز

| مجموعه | آنچه سنجیده می‌شود |
|---|---|
| نرمال‌سازی فارسی | یکسان‌سازی ی/ک، ارقام، اعراب، نیم‌فاصله؛ توکن‌سازی؛ تحمل غلط تایپی |
| قانون ۱۰ روزه | ویرایش داخل پنجره مجاز است؛ خارج از آن `423`؛ حذف خبر منتشرشده مسدود؛ اصلاحیه بدون دلیل `422`؛ اصلاحیه‌ی معتبر نسخه می‌سازد |
| گردش کار خبر | گذارهای مجاز؛ رد گذار غیرمجاز؛ ثبت رویداد گردش کار |
| چرخه پرونده و SLA | ثبت گزارش، تصمیم ناظر، مسیریابی، محاسبه مهلت، پاسخ رسمی، گذار غیرمجاز |
| کنترل دسترسی | جداسازی چند-مستاجری؛ نبود دسترسی به پرونده سازمان دیگر؛ دسترسی گزارش‌دهنده به پرونده خودش |
| احراز هویت | رد گذرواژه نادرست؛ ساخت نشست معتبر با هش توکن |

## ۲. آزمون یکپارچه‌ی دستی (اجراشده)

سناریوی «قانون ۱۰ روزه از مرورگر تا پایگاه داده»، از طریق پراکسی Next:

```bash
POST /api/auth/login   (chief@shahrnama.local)            → 200
GET  /api/auth/me                                          → 200 authenticated
GET  /api/editorial/articles                               → 200، ۱۲ مورد
PATCH /api/editorial/articles/<locked>                     → 423 CONTENT_LOCKED
DELETE /api/editorial/articles/<locked>                    → 423 CONTENT_LOCKED
POST /api/editorial/articles/<locked>/corrections          → 200 (نسخه جدید)
```

این سناریو اثبات می‌کند کوکی نشست، CSRF و قاعده‌ی دامنه در مسیر کامل کار می‌کنند.

## ۳. بررسی نوع و ساخت

```bash
npx tsc --noEmit          # در frontend — بدون خطا
npx next build            # ۳۳ مسیر با موفقیت ساخته می‌شوند
```

## ۴. سیاهه‌ی آزمون دستی رابط کاربر

| صفحه | نکته‌ی کلیدی |
|---|---|
| `/` | اسپات‌لایت، نوار فوری، ۱۶ بخش، همه از `/api/home` |
| `/news`, `/news/[slug]` | اصلاحیه بالای متن، تاریخچه نسخه، وضعیت قفل |
| `/search` | حالت پیشرفته، شمارنده نوع، حفظ وضعیت در URL |
| `/reports/new` | چهار مرحله، آپلود واقعی، کد رهگیری واقعی از سرور |
| `/reports/[caseCode]` | نوار چرخه عمر، SLA، پاسخ رسمی، سیر رسیدگی |
| `/organizations/[slug]` | کارنامه فقط در صورت وجود داده |
| `/statistics/[slug]` | نمودار + جدول متنی معادل + برگه روش‌شناسی + CSV |
| `/explore/*` | کشیدن صحنه، حرکت با کلید، ورود به لایه بعد |
| `/studio/[id]` | فرم ویرایش در حالت قفل غیرفعال و فرم اصلاحیه فعال |
| `/admin` | بخش‌های خارج از مجوز کاربر پنهان می‌شوند (و در سرور هم رد می‌شوند) |

## ۵. دسترس‌پذیری

- همه‌ی کامپوننت‌های تعاملی معادل متنی/جدولی دارند (نمودار → جدول، نقشه → فهرست،
  خط زمانی → فهرست تاریخ‌دار).
- `useReducedMotion` در همه‌ی انیمیشن‌ها رعایت شده است.
- ناوبری با صفحه‌کلید در خط زمانی، صحنه‌ی کاوش و Command Palette پشتیبانی می‌شود.
- برچسب `alt` برای کاور خبر در ویرایشگر **الزامی** علامت‌گذاری شده است.
- `lang="fa"` و `dir="rtl"` در ریشه‌ی سند.

## ۶. آنچه هنوز آزمون خودکار ندارد

صادقانه: پوشش آزمون فعلی روی **قواعد دامنه** متمرکز است، نه روی رابط کاربر.
گام‌های بعدی پیشنهادی:

- آزمون سرتاسری با Playwright (در این محیط قابل نصب نبود؛ دانلود مرورگر مسدود است)
- آزمون بار روی جست‌وجو با داده‌ی حجیم
- آزمون رگرسیون بصری برای حالت تیره
