Files

206 lines
6.0 KiB
PHP

<?php
namespace Tests\Browser;
use App\Models\PrizeUser;
use App\Models\User;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
class GamePageTest extends DuskTestCase
{
/**
* Trang game tải được khi chưa đăng nhập.
*/
public function test_game_page_loads_when_guest(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/game')
->assertPathIs('/game');
});
}
/**
* URL gốc (/) redirect về /game.
*/
public function test_root_redirects_to_game(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/')
->assertPresent('#wheelCanvas'); // / và /game cùng render game
});
}
/**
* Vòng quay (canvas) hiển thị trên trang game.
*/
public function test_game_page_shows_lucky_wheel_canvas(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/game')
->assertPresent('#wheelCanvas');
});
}
/**
* Nút quay hiển thị trên trang game.
*/
public function test_spin_button_is_present(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/game')
->assertPresent('#spinButton');
});
}
/**
* Banner "Thể lệ tham dự" hiển thị.
*/
public function test_game_rule_ribbon_is_present(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/game')
->assertPresent('#game_rule');
});
}
/**
* Khi guest vào /game, hiển thị thông báo yêu cầu đăng nhập.
*/
public function test_guest_sees_login_prompt_on_game(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/logout')
->visit('/game')
->assertPresent('.alert_wheel_spin')
->assertPresent('a[href*="login"]');
});
}
/**
* Khi đã đăng nhập và chưa quay, nút quay ở trạng thái sẵn sàng.
*/
public function test_logged_in_user_can_see_spin_button_enabled(): void
{
$phone = '09' . rand(10000000, 99999999);
$this->browse(function (Browser $browser) use ($phone) {
$browser->visit('/logout')
->visit('/login')
->pause(300)
->type('name', 'Spin Test User')
->type('phone', $phone)
->type('address', 'TP.HCM')
->radio('known_sis', '1')
->type('job', 'Kỹ sư')
->press('Gửi thông tin')
->waitForText('thành công', 10)
->assertPathIs('/game')
->assertAttribute('#spinButton', 'data-check', 'true');
});
User::where('phone', $phone)->delete();
}
/**
* Khi đã quay rồi (spined=1), nút quay bị khóa.
*/
public function test_already_spined_user_sees_spin_button_disabled(): void
{
$phone = '09' . rand(10000000, 99999999);
// Tạo user với spined=1
$user = User::create([
'name' => 'SPINED USER',
'phone' => $phone,
'email' => $phone . '@phone.local',
'password' => bcrypt('test123'),
'address' => 'Cần Thơ',
'known_sis' => 1,
'job' => 'Kỹ sư',
'status' => 1,
'spined' => 1,
]);
$this->browse(function (Browser $browser) use ($user) {
$browser->visit('/logout')
->loginAs($user)
->visit('/game')
->assertAttribute('#spinButton', 'data-check', 'false');
});
$user->delete();
}
/**
* Popup luật chơi tải nội dung.
*/
public function test_game_rule_popup_loads(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/logout')
->visit('/game')
->pause(500);
// Dismiss alerts che button rồi click bằng JS
$browser->script("document.querySelectorAll('.alert').forEach(el => el.remove())");
$browser->script("document.getElementById('game_rule').click()");
$browser->pause(800)
->assertPresent('#gamerule');
});
}
/**
* API /game/rule trả về nội dung HTML.
*/
public function test_game_rule_api_returns_html(): void
{
$this->browse(function (Browser $browser) {
// /game/rule được gọi qua AJAX, trả về fragment HTML không có <body>
$browser->visit('/game/rule')
->assertSourceHas('class='); // snippet HTML luon co class=
});
}
/**
* API /checkspined trả lỗi khi chưa đăng nhập.
*/
public function test_checkspined_returns_error_for_guest(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/logout')
->visit('/checkspined')
->assertSee('error');
});
}
/**
* API /checkspined trả spined=0 khi đăng nhập user mới.
*/
public function test_checkspined_returns_zero_for_new_user(): void
{
$phone = '09' . rand(10000000, 99999999);
$user = User::create([
'name' => 'CHECK SPINED USER',
'phone' => $phone,
'email' => $phone . '@phone.local',
'password' => bcrypt('test123'),
'address' => 'Cần Thơ',
'known_sis' => 0,
'job' => 'Sinh viên',
'status' => 1,
'spined' => 0,
]);
$this->browse(function (Browser $browser) use ($user) {
$browser->visit('/logout')
->loginAs($user)
->visit('/checkspined')
->assertSee('"spined":0');
});
$user->delete();
}
}