first(); if ($stale) { UserRole::where('user_id', $stale->id)->delete(); $stale->delete(); } $this->adminUser = User::create([ 'name' => 'DUSK PRIZE ADMIN', 'email' => 'dusk_prize_admin@test.local', 'phone' => '09' . rand(10000000, 99999999), 'password' => bcrypt('dusk_admin_pwd_2026'), 'status' => 1, 'address' => 'Test', 'known_sis'=> 0, 'job' => 'Admin', 'spined' => 0, ]); $roles = Role::where('role_status', 1)->get(); foreach ($roles as $role) { UserRole::create(['user_id' => $this->adminUser->id, 'role_id' => $role->id]); } } protected function tearDown(): void { UserRole::where('user_id', $this->adminUser->id)->delete(); $this->adminUser->delete(); parent::tearDown(); } /** * Trang danh sách giải thưởng hiển thị đúng. */ public function test_prize_list_page_loads(): void { $this->browse(function (Browser $browser) { $browser->loginAs($this->adminUser) ->visit('/admin/prizes') ->assertPresent('table, .table'); }); } /** * Trang thêm mới giải thưởng hiển thị form. */ public function test_add_prize_form_loads(): void { $this->browse(function (Browser $browser) { $browser->loginAs($this->adminUser) ->visit('/admin/prize/update?id=0') ->assertPresent('input[name="prize_name"]') ->assertPresent('input[name="prize_order"]') ->assertPresent('select[name="prize_status"]'); }); } /** * Submit form thêm giải thưởng rỗng phải hiện lỗi. */ public function test_add_prize_with_empty_name_shows_error(): void { $this->browse(function (Browser $browser) { $browser->loginAs($this->adminUser) ->visit('/admin/prize/update?id=0'); // Strip HTML5 required nếu có, rồi submit để Server-side validation chạy $browser->script("document.querySelectorAll('input[required]').forEach(function(el){el.removeAttribute('required');})"); $browser->press('Thêm mới') ->pause(500) ->assertPresent('.text-danger, .alert-danger, [class*="error"]'); }); } /** * Thêm mới giải thưởng thành công và kiểm tra DB. */ public function test_create_prize_successfully(): void { $prizeName = 'Dusk Test Prize ' . rand(1000, 9999); $this->browse(function (Browser $browser) use ($prizeName) { $browser->loginAs($this->adminUser) ->visit('/admin/prize/update?id=0') ->pause(500) ->type('prize_name', $prizeName) ->type('prize_number', '100') ->type('prize_order', '99') ->select('prize_status', '1') ->press('Thêm mới') ->waitFor('.alert-success', 10); }); // Kiểm tra DB $prize = Prize::where('prize_name', $prizeName)->first(); $this->assertNotNull($prize, 'Giải thưởng phải được tạo trong DB'); $this->assertEquals(1, $prize->prize_status); $this->assertEquals(100, $prize->prize_number); $this->assertEquals(99, $prize->prize_order); // Dọn dẹp $prize->delete(); } /** * Cập nhật tên giải thưởng thành công. */ public function test_update_prize_successfully(): void { // Tạo giải thưởng để cập nhật $prize = Prize::create([ 'prize_name' => 'Dusk Prize To Update', 'prize_status' => 1, 'prize_number' => 10, 'prize_order' => 88, 'user_id' => $this->adminUser->id, ]); $newName = 'Dusk Prize Updated ' . rand(1000, 9999); $this->browse(function (Browser $browser) use ($prize, $newName) { $browser->loginAs($this->adminUser) ->visit('/admin/prize/update?id=' . $prize->id) ->clear('prize_name') ->type('prize_name', $newName) ->press('Cập nhật') ->waitFor('.alert-success', 10); }); // Kiểm tra DB $updated = Prize::find($prize->id); $this->assertEquals($newName, $updated->prize_name); $prize->delete(); } /** * Xóa giải thưởng thành công. */ public function test_delete_prize_successfully(): void { $prize = Prize::create([ 'prize_name' => 'Dusk Prize To Delete', 'prize_status' => 1, 'prize_number' => 5, 'prize_order' => 77, 'user_id' => $this->adminUser->id, ]); $prizeId = $prize->id; $this->browse(function (Browser $browser) use ($prizeId) { $browser->loginAs($this->adminUser) ->visit('/admin/prizes') ->visit('/admin/prize/delete/' . $prizeId) ->pause(1000); // redirect()->back() sau khi xóa }); // Kiểm tra DB: giải thưởng đã bị xóa $this->assertNull(Prize::find($prizeId), 'Giải thưởng phải bị xóa khỏi DB'); } /** * Trang danh sách người trúng giải hiển thị. */ public function test_prize_winner_list_loads(): void { $this->browse(function (Browser $browser) { $browser->loginAs($this->adminUser) ->visit('/admin/prizeuser') ->assertPresent('table, .table'); }); } /** * Trang danh sách người trúng giải có ô lọc ngày. */ public function test_prize_winner_list_has_date_filter(): void { $this->browse(function (Browser $browser) { $browser->loginAs($this->adminUser) ->visit('/admin/prizeuser') ->assertPresent('#fromDateTime, #toDateTime'); }); } /** * Link export Excel hoạt động. */ public function test_prize_winner_export_link_present(): void { $this->browse(function (Browser $browser) { $browser->loginAs($this->adminUser) ->visit('/admin/prizeuser') ->assertPresent('#excel_export'); }); } }