208 lines
6.6 KiB
PHP
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');
|
|
});
|
|
}
|
|
}
|