新增聊天室刷新同步与全员刷新功能

This commit is contained in:
2026-04-21 17:14:12 +08:00
parent c209221bad
commit fed51dda18
13 changed files with 425 additions and 9 deletions
@@ -8,6 +8,7 @@
namespace Tests\Feature;
use App\Events\UserBrowserRefreshRequested;
use App\Jobs\SaveMessageJob;
use App\Models\Department;
use App\Models\Position;
@@ -15,6 +16,7 @@ use App\Models\Room;
use App\Models\User;
use App\Models\UserPosition;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\Facades\Redis;
use Tests\TestCase;
@@ -40,6 +42,7 @@ class ChatAppointmentControllerTest extends TestCase
*/
public function test_appoint_pushes_private_toast_notification_to_target(): void
{
Event::fake([UserBrowserRefreshRequested::class]);
Queue::fake();
[$admin, $target, $room, $position] = $this->createAppointmentActors();
@@ -63,6 +66,12 @@ class ChatAppointmentControllerTest extends TestCase
$this->assertSame('✨', $privateMessage['toast_notification']['icon'] ?? null);
$this->assertSame('#a855f7', $privateMessage['toast_notification']['color'] ?? null);
Event::assertDispatched(UserBrowserRefreshRequested::class, function (UserBrowserRefreshRequested $event) use ($target, $admin) {
return $event->targetUserId === $target->id
&& $event->operator === $admin->username
&& $event->reason === '你的职务已发生变更,页面权限正在同步更新。';
});
Queue::assertPushed(SaveMessageJob::class, 1);
}
@@ -71,6 +80,7 @@ class ChatAppointmentControllerTest extends TestCase
*/
public function test_revoke_pushes_private_toast_notification_to_target(): void
{
Event::fake([UserBrowserRefreshRequested::class]);
Queue::fake();
[$admin, $target, $room, $position] = $this->createAppointmentActors();
@@ -102,6 +112,12 @@ class ChatAppointmentControllerTest extends TestCase
$this->assertSame('📋', $privateMessage['toast_notification']['icon'] ?? null);
$this->assertSame('#6b7280', $privateMessage['toast_notification']['color'] ?? null);
Event::assertDispatched(UserBrowserRefreshRequested::class, function (UserBrowserRefreshRequested $event) use ($target, $admin) {
return $event->targetUserId === $target->id
&& $event->operator === $admin->username
&& $event->reason === '你的职务已被撤销,页面权限正在同步更新。';
});
Queue::assertPushed(SaveMessageJob::class, 1);
}
+35
View File
@@ -215,6 +215,41 @@ class ChatControllerTest extends TestCase
$response->assertDontSee("runAdminAction('announce-message')", false);
}
/**
* 测试站长即使没有在职职务,也能看到管理菜单中的刷新全员按钮。
*/
public function test_room_view_shows_refresh_all_button_for_site_owner(): void
{
$room = Room::create(['room_name' => 'owner-rf']);
$user = User::factory()->create([
'id' => 1,
'user_level' => 100,
]);
$response = $this->actingAs($user)->get(route('chat.room', $room->id));
$response->assertOk();
$response->assertSee('🛠 管理', false);
$response->assertSee("runAdminAction('refresh-all')", false);
$response->assertSee('♻️ 刷新全员', false);
}
/**
* 测试普通职务用户不会看到刷新全员按钮。
*/
public function test_room_view_hides_refresh_all_button_for_non_site_owner(): void
{
$room = Room::create(['room_name' => 'normal-rf']);
$user = $this->createUserWithPositionPermissions([
PositionPermissionRegistry::ROOM_ANNOUNCEMENT,
]);
$response = $this->actingAs($user)->get(route('chat.room', $room->id));
$response->assertOk();
$response->assertDontSee("runAdminAction('refresh-all')", false);
}
/**
* 测试用户可以发送普通文本消息。
*/
@@ -7,6 +7,7 @@
namespace Tests\Feature\Feature;
use App\Events\BrowserRefreshRequested;
use App\Jobs\SaveMessageJob;
use App\Models\Department;
use App\Models\Position;
@@ -15,6 +16,7 @@ use App\Models\User;
use App\Models\UserPosition;
use App\Support\PositionPermissionRegistry;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\Facades\Redis;
use Tests\TestCase;
@@ -173,6 +175,59 @@ class AdminCommandControllerTest extends TestCase
$this->assertSame([], Redis::lrange("room:{$room->id}:messages", 0, -1));
}
/**
* 测试站长可以触发当前房间全员刷新事件。
*/
public function test_site_owner_can_request_refresh_for_all_users_in_room(): void
{
Event::fake([BrowserRefreshRequested::class]);
$admin = User::factory()->create([
'id' => 1,
'user_level' => 100,
]);
$room = Room::create([
'room_name' => '刷新房',
]);
$response = $this->actingAs($admin)->postJson(route('command.refresh_all'), [
'room_id' => $room->id,
'reason' => '功能更新,要求刷新',
]);
$response->assertOk()->assertJson([
'status' => 'success',
]);
Event::assertDispatched(BrowserRefreshRequested::class, function (BrowserRefreshRequested $event) use ($room, $admin) {
return $event->roomId === $room->id
&& $event->operator === $admin->username
&& $event->reason === '功能更新,要求刷新';
});
}
/**
* 测试非站长用户不能触发全员刷新。
*/
public function test_non_site_owner_cannot_request_refresh_for_all_users(): void
{
Event::fake([BrowserRefreshRequested::class]);
$admin = $this->createPositionedManager([
PositionPermissionRegistry::ROOM_CLEAR_SCREEN,
]);
$room = Room::create([
'room_name' => '无权刷新房',
]);
$response = $this->actingAs($admin)->postJson(route('command.refresh_all'), [
'room_id' => $room->id,
]);
$response->assertStatus(403);
Event::assertNotDispatched(BrowserRefreshRequested::class);
}
/**
* 测试管理操作中的奖励金币会给接收方写入带右下角提示的私聊消息。
*/