hoàn thành 58 test case

This commit is contained in:
2026-04-08 15:52:56 +07:00
parent c138adb108
commit 18ec75071c
13 changed files with 588 additions and 6 deletions
+89 -5
View File
@@ -488,6 +488,8 @@ FILE 11: tests/Browser/AdminEdgeCaseTest.php (3 tests)
--------------------------------------------------------------------------------
Chuẩn bị chung: Tạo adminUser với đầy đủ roles trong DB.
Dọn dẹp chung: Xóa UserRole, adminUser khỏi DB; xóa prize test nếu còn sót.
Chuẩn bị chung: Tạo adminUser với đầy đủ roles trong DB.
Dọn dẹp chung: Xóa UserRole, adminUser khỏi DB; xóa prize test nếu còn sót.
[TC-55] test_prize_number_cannot_be_negative
Mô tả : Nhập prize_number âm (-5) vào form thêm giải thưởng phải bị
@@ -534,14 +536,94 @@ Dọn dẹp chung: Xóa UserRole, adminUser khỏi DB; xóa prize test nếu cò
Lưu ý : Không dùng actingAs()->get(exportRoute) vì excel.blade.php gọi exit()
sau khi xuất file — điều này sẽ terminate PHPUnit process.
--------------------------------------------------------------------------------
FILE 12: tests/Browser/BulkWorkflowTest.php (1 test)
--------------------------------------------------------------------------------
Chuẩn bị chung: Tạo adminUser (đầy đủ roles), tạo prize có prize_number=2000,
tạo file Excel tạm chứa 1000 bản ghi người dùng bằng PhpSpreadsheet.
Dọn dẹp chung: Xóa 1000 users + PrizeUser (theo chunk 200), xóa admin, prize, file Excel.
[TC-58] test_1000_users_full_workflow_from_excel
Mô tả : Kiểm tra toàn bộ workflow hệ thống (end-to-end) với 1000 người dùng
được cung cấp từ file Excel — từ import dữ liệu đến quay số đến
xác nhận trên giao diện admin.
Luồng :
[A] Đọc file Excel → Xác nhận file có đúng 1001 dòng (1 header + 1000 data).
[B] Bulk-import 1000 users vào DB (đọc từng ô Excel, insert theo chunk 100).
[C] Simulate 1000 lượt quay số (bulk insert prize_users + update spined=1).
[D] 1 lượt quay thực qua HTTP POST /updateprizeuser để kiểm tra API layer.
[E] Browser: Admin mở /admin/users → bảng #table hiển thị.
Browser: Admin mở /admin/prizeuser → bảng + bộ lọc ngày + nút export hiển thị.
[F] Browser: Xác nhận href của #excel_export chứa "prizeuser/export";
PHP route('admin/prizeuser/export') trả URL hợp lệ.
Chi tiết từng bước:
[A] Tạo & Đọc Excel:
Chuẩn bị: generateTestExcel() dùng PhpOffice\PhpSpreadsheet tạo file .xlsx
với 6 cột: STT | HỌ TÊN | SỐ ĐIỆN THOẠI | ĐỊA CHỈ | NGHỀ NGHIỆP | NGUỒN BIẾT SIS.
Phone dùng dải riêng 0900000001..0900001000 (tránh đụng dữ liệu thật).
Bước : XlsxReader::load() → getHighestDataRow() = 1001.
Kết quả : File Excel hợp lệ, đọc được 1001 dòng.
[B] Bulk-import 1000 users:
Bước : Đọc từng row (2..1001) → lấy phone, name (mb_strtoupper), address,
job, known_sis → build $importBatch[].
DB::table('users')->insert() theo chunk 100.
Lấy IDs: User::whereIn('phone', ...)->pluck('id').
Kết quả : assertCount(1000, $bulkUserIds) — 1000 users được import.
[C] Simulate 1000 lần quay:
Bước : Build $spinBatch[] với user_id + prize_id cho 1000 user.
DB::table('prize_users')->insert() theo chunk 100.
User::whereIn('id', chunk)->update(['spined' => 1]) theo chunk 200.
Kết quả : PrizeUser::whereIn('user_id', $bulkUserIds)->count() = 1000.
User::whereIn(...)->where('spined', 1)->count() = 1000.
[D] Kiểm tra luồng spin thực qua Browser (1 user mới, giao diện game):
Chuẩn bị: Tạo 1 user riêng (phone='0900000000') ngoài dải bulk, spined=0.
Bước : browser->loginAs(spinUser) → visit('/game') → pause(800ms)
→ assertAttribute('#spinButton','data-check','true')
→ click('#spinButton') → waitForText('XIN CHÚC MỪNG', 30s)
→ pause(1500ms) để DB commit.
Kết quả : spinUser->refresh()->spined = 1.
PrizeUser::where('user_id', spinUserId)->first() != null.
Lợi thế : Dùng Browser thực → CSRF token có trong session → không bị lỗi 419.
Đây là cách kiểm tra API /updateprizeuser trung thực nhất.
Dọn dẹp : Xóa spinUser và PrizeUser của spinUser ngay sau khi assert.
[E] Browser admin xác nhận:
Bước : browser->loginAs($adminUser).
Truy cập /admin/users → waitFor('#table', 15) → assertPresent('#table').
Truy cập /admin/prizeuser → waitFor('table, .table', 15)
→ assertPresent('#fromDateTime', '#toDateTime', '#excel_export').
Kết quả : Bảng quản lý người dùng và bảng người trúng giải đều hiển thị đúng.
[F] Xác nhận export Excel:
Bước : JS override document.createElement để capture href khi click #excel_export.
PHP: route('admin/prizeuser/export') kiểm tra URL.
Kết quả : capturedHref chứa 'prizeuser/export' (nếu JS capture thành công).
route('admin/prizeuser/export') chứa '/admin/prizeuser/export'.
Lưu ý : Không gọi actingAs()->get(exportUrl) vì excel.blade.php gọi exit()
sau khi xuất file → terminate PHPUnit process.
Dữ liệu test:
- 1000 users với phone 0900000001..0900001000
- 1 prize "Giải Thưởng Bulk Test" (prize_number=2000, prize_order=98)
- 1 admin "DUSK BULK ADMIN" (email: dusk_bulk_admin@test.local)
- 1 file Excel tạm (sys_get_temp_dir()/dusk_bulk_{timestamp}.xlsx)
Assertions: 15 assertions
Thời gian : ~37 giây
================================================================================
TỔNG KẾT
================================================================================
Số file test : 11 files
Số test cases : 57 test cases
Số assertions : 114 assertions
Thời gian : ~178 giây
Số file test : 12 files
Số test cases : 58 test cases
Số assertions : 129 assertions
Thời gian : ~215 giây
Kết quả : ALL PASSED ✓
Phân bổ theo chức năng:
@@ -559,8 +641,9 @@ TỔNG KẾT
│ Logic game nâng cao │ 3 │
│ Bảo mật & phân quyền │ 2 │
│ Admin edge cases │ 3 │
│ Bulk workflow 1000 users từ Excel │ 1 │
├──────────────────────────────────────────┼────────┤
│ TỔNG CỘNG │ 57
│ TỔNG CỘNG │ 58
└──────────────────────────────────────────┴────────┘
Công nghệ kiểm thử:
@@ -570,6 +653,7 @@ TỔNG KẾT
- Môi trường : WSL2 + WSLg, DUSK_HEADLESS_DISABLED=true
- Server : php artisan serve --port=8001
- DB : MySQL (fsg3kct926qj_quaysoDB)
- Excel lib : PhpOffice\PhpSpreadsheet (có sẵn trong vendor/phpoffice/)
Sửa lỗi ứng dụng phát hiện qua quá trình kiểm thử:
┌──────────────────────────────────────────────────────────────────────┐