Files
-S.I.S-QuaySo_v2/tests/Browser/AdminPrizeTest.php
T

208 lines
6.6 KiB
PHP

<?php
namespace Tests\Browser;
use App\Models\Prize;
use App\Models\PrizeUser;
use App\Models\Role;
use App\Models\User;
use App\Models\UserRole;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
class AdminPrizeTest extends DuskTestCase
{
private User $adminUser;
protected function setUp(): void
{
parent::setUp();
$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');
});
}
}