SEO-ONLINE
กลับสู่หน้ารวมรายงาน
คู่มือทดสอบระบบ

คู่มือทดสอบระบบ (Manual Test Plan)

เอกสารเฉพาะหมวด — แยกออกจากเอกสารอื่นเพื่อให้อ่านง่าย

พร้อมใช้ตรวจรับงาน
46 test cases 13 sections Login / User / 5 modules / Settings / Security ครอบคลุม

คู่มือทดสอบระบบ — SEO-ONLINE

เอกสารฉบับนี้สำหรับลูกค้าและ QA ใช้ตรวจสอบระบบก่อนรับมอบงาน. ครอบคลุม flow หลัก ๆ ของทุก module และเงื่อนไข permission ที่ตกลงไว้.

ผู้ใช้ทดสอบ (Seeded)

UsernamePasswordRole
masterchangeme1234Master Admin
staffchangeme1234Staff Admin

> ⚡ ในโหมด dev/staging มีปุ่ม DEV QUICK LOGIN ที่หน้า login — คลิกเพื่อ auto-fill credentials เลย


1. การเข้าสู่ระบบและความปลอดภัย

TC-1.1 Login สำเร็จ

  1. เปิด URL ของระบบ → redirect ไป /login
  2. กรอก master / changeme1234 → กด "เข้าสู่ระบบ"
  3. ผล: redirect ไป /dashboard, เห็น chip ชื่อ + role ที่ก้น Sidebar
  4. TC-1.2 Login ผิด — แสดง error

    1. กรอก username ถูก, password ผิด → กดเข้าสู่ระบบ
    2. ผล: ข้อความ "ชื่อผู้ใช้งานหรือรหัสผ่านไม่ถูกต้อง"
    3. TC-1.3 Rate limit ป้องกัน brute-force

      1. กรอกรหัสผ่านผิดต่อเนื่อง 6 ครั้งภายใน 1 นาที
      2. ผล: ครั้งที่ 6 แสดง "พยายามเข้าสู่ระบบเกินจำนวนที่กำหนด ลองใหม่ในอีก N นาที"
      3. รอ 15 นาที → login ได้ตามปกติ
      4. TC-1.4 เปลี่ยนรหัสผ่าน

        1. Login → คลิก "เปลี่ยนรหัสผ่าน" ที่ก้น Sidebar
        2. กรอกรหัสปัจจุบัน + รหัสใหม่ (≥ 8 ตัว) → ยืนยัน
        3. ผล: modal ปิด, logout แล้ว login ด้วยรหัสใหม่ผ่าน
        4. Modal ลอยอยู่หน้าทุก content (ไม่หลุดข้าง Sidebar)
        5. TC-1.5 Auth gate

          1. logout → พิมพ์ /dashboard ตรง URL bar
          2. ผล: redirect ไป /login?next=/dashboard

          3. 2. User Management (Permission Matrix)

            TC-2.1 Master เห็นและจัดการ User ทุกคน (ยกเว้น Master คนอื่น)

            1. Login เป็น master → ไปหน้า /users
            2. ผล: หน้าชื่อ "User Management", เห็นรายการผู้ใช้, ปุ่ม edit/delete ของ Master คนอื่น disable
            3. กดเพิ่ม User ใหม่ → modal "เพิ่มผู้ใช้งานใหม่" → field labels "Username / Password / ประเภทผู้ใช้งาน (Role Status)" → เลือก role ได้ทั้ง Master/Staff
            4. คลิก edit row ของตัวเอง → field "Role" และ "สถานะ" ถูก disable พร้อม hint สีเหลือง
            5. TC-2.2 Staff จัดการได้แค่ตัวเอง

              1. Login เป็น staff → ไปหน้า /users
              2. ผล: เห็นรายการผู้ใช้ทั้งหมด, ปุ่ม edit/delete ของคนอื่น disable หมด
              3. เพิ่ม User ใหม่ → role dropdown เห็นแค่ "Staff Admin"
              4. TC-2.3 ป้องกันการล็อกตัวเอง

                1. Master เปิด edit row ตัวเอง
                2. ผล: ฟิลด์ Role + Status disable
                3. ปุ่ม Delete ของ row ตัวเอง disable
                4. TC-2.4 Modal ลบ User

                  1. กดถังขยะที่ row อื่น → modal "ยืนยันการลบ User?"
                  2. ผล: กรอบแดง + title แดง + body "คุณต้องการลบผู้ใช้งาน X ออกจากระบบใช่หรือไม่?"

                  3. 3. Inventory (ตรวจสอบสินค้า)

                    TC-3.1 Master นำเข้าสินค้า — Hybrid subtype picker

                    1. Login master/inventory
                    2. กรอกฟอร์ม: สาขา ADS, ID|Pass|2FA
                    3. dropdown "เลือกประเภทสินค้า" — เห็น 3 ตัวเลือกพิเศษบนสุด:
                    4. - "ไม่ระบุประเภทสินค้า (ให้คนจัดประเภทระบุภายหลัง)"

                      - "อื่น ๆ (ระบุเอง)"

                      - (เส้นแบ่ง)

                      - กลุ่ม subtype ตาม category

                      1. กด search box แล้วพิมพ์ "FB" → filter เหลือเฉพาะ FB
                      2. ลองเลือก "อื่น ๆ (ระบุเอง)" → text field "ระบุประเภทสินค้า" โผล่ขึ้นมา
                      3. กด "เพิ่มเข้าคลังสินค้า" → row ใหม่ขึ้นในตาราง QC
                      4. TC-3.2 Staff QC ผ่าน/ไม่ผ่าน (ทำได้)

                        1. Login staff/inventory
                        2. ผล: ไม่เห็นฟอร์มนำเข้า, เห็นเฉพาะตาราง QC
                        3. subtitle "ตรวจสอบคุณภาพสินค้า (Check User)"
                        4. กด "ผ่าน" → row หายไป
                        5. กด "ไม่ผ่าน" → modal กรอบแดง → เลือกสาเหตุ → ยืนยัน → row หาย
                        6. TC-3.3 Workflow — Pre-categorized vs unspecified

                          1. Pre-categorized: import พร้อม subtype "เฟสผูกบัตร" → QC pass → status = CATEGORIZED ทันที (ข้าม /categorization)
                          2. Unspecified: import ด้วย "ไม่ระบุประเภท" → QC pass → status = QC_PASS → ไปดูที่ /categorization
                          3. อื่น ๆ: import ด้วยข้อความฟรี → QC pass → status = QC_PASS → /categorization
                          4. TC-3.4 Pagination

                            1. ถ้ามี row > 10 → เห็น Pagination Bar ด้านล่าง
                            2. กดหน้า 2 → แสดง row 11-20
                            3. TC-3.5 ข้อมูลถูก encrypt ใน DB

                              1. นำเข้าสินค้าใหม่ผ่าน UI
                              2. เปิด DB: docker compose exec db psql -U seo seo_online -c "SELECT \"loginData\" FROM \"Product\" ORDER BY \"createdAt\" DESC LIMIT 1;"
                              3. ผล: ค่าขึ้นต้นด้วย enc:v1: (ไม่ใช่ plaintext)

                              4. 4. Sales & Categorization (ประเภทสินค้า)

                                TC-4.1 จัดประเภทสินค้า

                                1. ไป /categorization
                                2. ผล: เห็น 3 cards (เฟสบุ๊ค/เพจ/LINE OA) + ตาราง "สินค้าที่ผ่าน QC"
                                3. กด "เลือกประเภท" บน row → modal เปิด → SearchableSelect dropdown
                                4. เลือก subtype → ยืนยัน → row หาย, นับใน category card +1
                                5. TC-4.2 คลิก Category card ดูสินค้าทั้งหมดในหมวด

                                  1. คลิก card "ประเภทเฟสบุ๊ค"
                                  2. ผล: ไปหน้า /products?cat=FB (filtered by FB)

                                  3. 5. All Products (สินค้าทั้งหมด)

                                    TC-5.1 ดูสินค้าทุกสถานะ

                                    1. ไป /products (จาก Sidebar รายการที่ 2)
                                    2. ผล: เห็น 7 tabs ของสถานะ + chips กรองหมวด + chips กรองสาขา
                                    3. คลิก "จัดประเภทแล้ว" → filter เหลือ CATEGORIZED
                                    4. เพิ่ม "เฟสบุ๊ค" + "ADS" → กรอง 3 ชั้น (URL params: ?status=CATEGORIZED&cat=FB&branch=ADS)
                                    5. ดู column "วันที่ QC" + "ผู้สร้าง" — ข้อมูลครบจริงจาก DB
                                    6. TC-5.2 Pagination

                                      1. ถ้ามี > 15 row → เห็น pagination bar
                                      2. เลื่อนหน้า → URL ยังคง filter เดิม

                                      3. 6. Product Transfer (โยกสินค้า)

                                        TC-6.1 Master โอนทันที (COMPLETED)

                                        1. Login master/transfer
                                        2. คลิก dropdown "เลือกสินค้า" → เห็น ⓘ tooltip "แสดง 100 รายการล่าสุด..."
                                        3. เลือกสินค้า + สาขาปลายทาง + กดบันทึก
                                        4. ผล: row ใหม่สถานะ "สำเร็จ" (สีเขียว) ทันที
                                        5. TC-6.2 Staff ต้องรอ Master อนุมัติ (PENDING)

                                          1. Login staff/transfer
                                          2. สร้างคำขอโยกย้าย
                                          3. ผล: row ใหม่สถานะ "รอ Master ยืนยัน" (สีเหลือง)
                                          4. TC-6.3 Master กดอนุมัติเป็นชุด

                                            1. Login master → มี PENDING รออยู่
                                            2. กดปุ่ม "กดรับเฟสทั้งหมดที่แจ้ง"
                                            3. ผล: ทุก PENDING เปลี่ยนเป็น COMPLETED, สินค้าย้ายไปสาขาปลายทาง
                                            4. TC-6.4 Server-side product search

                                              1. คลิก dropdown "เลือกสินค้า" — ค่าเริ่มต้น 100 รายการล่าสุด
                                              2. พิมพ์ "ADS" (≥ 2 ตัวอักษร) → spinner → ผลจากฐานข้อมูลทั้งหมด
                                              3. พิมพ์ "เฟสผูกบัตร" → ผลเฉพาะ subtype นั้น (รวมที่อยู่นอก 100 แรก)
                                              4. TC-6.5 Searchable problem dropdown

                                                1. dropdown "ระบุปัญหา (ถ้ามี)" — search ได้
                                                2. พิมพ์ "เข้า" → filter เหลือ "ปัญหา 1: เข้าไม่ได้"

                                                3. 7. Claims & Defective (เคลม/สินค้าเสีย)

                                                  TC-7.1 บันทึก claim ลูกค้า

                                                  1. ไป /claims → กด "เปิดเคสเคลมลูกค้า"
                                                  2. ผล: modal กรอบฟ้า (cyan) + icon ฟ้า
                                                  3. กรอกชื่อลูกค้า + รหัสเฟส + IssueType → ยืนยัน
                                                  4. row ใหม่ในตาราง, badge "CLAIM" สีฟ้า
                                                  5. TC-7.2 บันทึกสินค้าเสีย

                                                    1. กด "แจ้งสินค้าเสีย"
                                                    2. ผล: modal กรอบแดง (danger) + icon แดง
                                                    3. กรอกรหัสสินค้า + เลือกสาเหตุ → ยืนยัน
                                                    4. badge "DEFECTIVE" สีแดง
                                                    5. TC-7.3 Refund — cap จาก SystemConfig

                                                      1. กด "เบิกงบชดเชย (Max ฿X)" — X = ค่าใน SystemConfig
                                                      2. ผล: modal กรอบเขียว (success) + icon เขียว
                                                      3. กรอก amountTHB เกิน cap → error "จำนวนเงินเกิน ฿X ต่อรายการ" (server-side block)
                                                      4. กรอกตามเกณฑ์ → ยืนยัน → stat "งบชดเชยคงเหลือ" ลดลง
                                                      5. TC-7.4 Pagination

                                                        1. ตารางประวัติ — pagination 10 row/หน้า

                                                        2. 8. Reception & Log (รับสินค้า & log) — Master เท่านั้น

                                                          TC-8.1 Staff เข้าไม่ได้

                                                          1. Login staff → พิมพ์ /reception ตรง URL
                                                          2. ผล: redirect ไป /dashboard
                                                          3. TC-8.2 Master ใช้งานได้

                                                            1. Login master/reception
                                                            2. กด "จัดการข้อมูล ADS" → กรอก ID + หมายเหตุ → ยืนยัน
                                                            3. ผล: banner สำเร็จ, Activity Log ที่ด้านล่างมี entry ใหม่ reception:ADS
                                                            4. TC-8.3 ค้นหา Activity Log

                                                              1. พิมพ์ "ADS" ในช่องค้นหา
                                                              2. ผล: ตารางกรองเฉพาะ row ที่มี "ADS" ใน action/detail
                                                              3. TC-8.4 Pagination

                                                                1. ถ้ามี > 15 row → pagination bar

                                                                2. 9. Settings (ตั้งค่าระบบ) — Master เท่านั้น

                                                                  TC-9.1 Sidebar visibility

                                                                  1. Login master → เห็นเมนู "ตั้งค่าระบบ" (icon ฟันเฟือง)
                                                                  2. Login staffไม่เห็น เมนูนี้
                                                                  3. TC-9.2 Tab order ตามความปลอดภัย

                                                                    1. เปิด /settings → เห็น 5 tabs:
                                                                    2. - สาขา (default)

                                                                      - หมวดสินค้า

                                                                      - ประเภทย่อย

                                                                      - สาเหตุปัญหา

                                                                      - ค่าระบบ ⚠ (ท้ายสุด เพราะอันตราย)

                                                                      TC-9.3 เพิ่มสาขาใหม่

                                                                      1. tab "สาขา" → กรอก Code "TEST" / Name "สาขาทดสอบ" → เพิ่ม
                                                                      2. ผล: row ใหม่ปรากฏ + ใน /inventory dropdown สาขามีตัวเลือกใหม่
                                                                      3. TC-9.4 ปิดใช้งานสาขา

                                                                        1. กด "ปิดใช้งาน" บน row "TEST"
                                                                        2. ผล: สถานะ "Inactive", ใน /inventory dropdown ไม่เห็น
                                                                        3. TC-9.5 System Config — refund budget + cap

                                                                          1. tab "ค่าระบบ ⚠" → เห็น 2 ฟิลด์ + warning info
                                                                          2. แก้ "งบชดเชยรายวัน" จาก 1000 → 2500
                                                                          3. แก้ "เพดานต่อรายการ" → 800
                                                                          4. กด "บันทึกค่าระบบ"
                                                                          5. ผล: banner เขียว
                                                                          6. ไป /claims → "งบชดเชยคงเหลือ ฿2,500 / 2,500" ทันที (ไม่ต้องรอ cache TTL)
                                                                          7. ปุ่ม "เบิกงบชดเชย (Max ฿800)" — cap ใหม่
                                                                          8. ลอง refund > 800 → server-block
                                                                          9. TC-9.6 Validation

                                                                            1. ตั้งเพดาน > งบรายวัน → error "เพดานต่อรายการต้องไม่เกินงบรายวัน"
                                                                            2. ตั้งค่าลบ → error "ต้องเป็นจำนวนบวก"

                                                                            3. 10. Dashboard

                                                                              TC-10.1 Master เห็น Super Admin Overview

                                                                              1. Login master/dashboard
                                                                              2. ผล: 4 stat cards (Total Stock / Pending QC / Transfer / Defective) + 5 module cards
                                                                              3. Module 1 icon = cubes-stacked (ไม่ว่าง)
                                                                              4. Module 5: "รอรับสินค้าเข้า (ADS/DAJA/KEN)" + "กิจกรรมล่าสุด (Activity Log)"
                                                                              5. TC-10.2 Staff เห็น Main Dashboard

                                                                                1. Login staff/dashboard
                                                                                2. ผล: 4 stat cards จาก DB จริง:
                                                                                3. - "นำเข้าวันนี้" — Product created today

                                                                                  - "ผ่าน QC วันนี้" — Product QC'd today

                                                                                  - "โอนสำเร็จวันนี้" — Transfer completed today

                                                                                  - "สินค้าทั้งหมด (เดือนนี้)" — Product created this month

                                                                                  1. Bottom bar: Database Connected, Last Update จาก Activity Log ล่าสุดจริง, Security: User Role Level
                                                                                  2. TC-10.3 ตัวเลขอัพเดทเมื่อ data เปลี่ยน

                                                                                    1. Master เพิ่มสินค้าใน /inventory → /dashboard "สินค้าในระบบทั้งหมด" +1 ทันที (cache invalidate)
                                                                                    2. กด QC ผ่าน → "นำเข้าวันนี้" / "ผ่าน QC วันนี้" อัพ

                                                                                    3. 11. Sidebar — Active state + Sticky

                                                                                      TC-11.1 Active state

                                                                                      1. คลิกเมนูใด ๆ → border + bg ของเมนูนั้นค้างเป็นสี cyan
                                                                                      2. ดู URL — ตรง
                                                                                      3. TC-11.2 Sticky scroll

                                                                                        1. ไปหน้าที่ content ยาว (เช่น /products มี 40 rows)
                                                                                        2. scroll down → sidebar + user chip + ปุ่มเปลี่ยนรหัส + ออกจากระบบ ค้างที่ viewport เสมอ

                                                                                        3. 12. Cache Invalidation (Data freshness)

                                                                                          TC-12.1 Rename Subtype → กระทบทุก list

                                                                                          1. Master → /settings → tab "ประเภทย่อย" → แก้ชื่อ subtype X เป็น "X-V2"
                                                                                          2. ไป /inventory → ตาราง column "ประเภท" แสดง "X-V2" ทันที (ไม่รอ TTL)
                                                                                          3. ไป /products → ตารางก็ใช้ชื่อใหม่
                                                                                          4. TC-12.2 Toggle Branch → กระทบ dropdown

                                                                                            1. /settings → tab "สาขา" → กด "ปิดใช้งาน" สาขา KEN
                                                                                            2. /inventory → dropdown สาขาไม่มี KEN
                                                                                            3. /products → chip กรองสาขา ไม่มี KEN
                                                                                            4. TC-12.3 Rename Username → กระทบ activity log + transfer list

                                                                                              1. /users → แก้ username "staff" → "staff_renamed"
                                                                                              2. /transfer → column "ผู้ส่งรายการ" แสดงชื่อใหม่
                                                                                              3. /reception → Activity Log column "ผู้ดำเนินการ" แสดงชื่อใหม่
                                                                                              4. TC-12.4 Update System Config → กระทบ /claims + /dashboard

                                                                                                1. /settings → tab "ค่าระบบ ⚠" → เปลี่ยน budget เป็น 3000
                                                                                                2. /claims → stat "งบชดเชยคงเหลือ ฿3,000 / 3,000" ทันที
                                                                                                3. /dashboard (master) → Module 3 "งบชดเชยคงเหลือ ฿3,000.00"

                                                                                                4. 13. ความปลอดภัย (ดู OWASP_REVIEW.md)

                                                                                                  OWASPStatus
                                                                                                  A01 Broken Access Control
                                                                                                  A02 Cryptographic Failures
                                                                                                  A03 Injection
                                                                                                  A04 Insecure Design
                                                                                                  A05 Security Misconfiguration

                                                                                                  เกณฑ์ผ่าน

                                                                                                  ระบบจะถือว่า ผ่านการรับมอบ เมื่อ:

                                                                                                  • TC-1.x ถึง TC-12.x ทั้งหมด pass
                                                                                                  • Unit tests ผ่านครบ (npm run test)
                                                                                                  • Load test 100 req/sec ผ่านที่ p(95) < 500ms (npm run test:load)
                                                                                                  • OWASP Top 5 mitigated ครบ
                                                                                                  • ไม่มี data leak ใน plain text ที่ DB (TC-3.5 ผ่าน)

                                                                                                  หากพบปัญหา รายงานเข้า issue tracker พร้อม screenshot + ขั้นตอน reproduce