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ó $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(); } }