206 lines
6.0 KiB
PHP
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();
|
|
}
|
|
}
|