新增聊天室座驾系统

This commit is contained in:
pllx
2026-04-30 09:40:50 +08:00
parent 45ce8b2b2d
commit 3c95478097
32 changed files with 3982 additions and 53 deletions
+76
View File
@@ -13,9 +13,11 @@ use App\Models\Department;
use App\Models\Gift;
use App\Models\Position;
use App\Models\Room;
use App\Models\ShopItem;
use App\Models\Sysparam;
use App\Models\User;
use App\Models\UserPosition;
use App\Models\UserPurchase;
use App\Models\VipLevel;
use App\Support\PositionPermissionRegistry;
use Illuminate\Broadcasting\PresenceChannel;
@@ -1095,6 +1097,80 @@ class ChatControllerTest extends TestCase
$this->assertStringContainsString($user->username, $presenceMessage['presence_text']);
}
/**
* 测试有效座驾用户首次进房时会生成座驾播报并返回座驾入场特效。
*/
public function test_active_ride_user_join_message_uses_ride_presence_payload(): void
{
$room = Room::create(['room_name' => 'rideroom']);
$user = User::factory()->create(['has_received_new_gift' => true]);
$ride = ShopItem::query()->updateOrCreate(['slug' => 'ride_j35'], [
'name' => '歼-35测试座驾',
'description' => '测试座驾',
'icon' => '🛩️',
'price' => 18888,
'type' => 'ride',
'duration_days' => 7,
'sort_order' => 80,
'is_active' => true,
'welcome_message' => '【{name}】驾驶【{ride}】震撼入场',
]);
UserPurchase::create([
'user_id' => $user->id,
'shop_item_id' => $ride->id,
'status' => 'active',
'price_paid' => 18888,
'expires_at' => now()->addDays(3),
]);
$response = $this->actingAs($user)->get(route('chat.room', $room->id));
$response->assertOk();
$history = collect($response->viewData('historyMessages'));
$rideMessage = $history->first(fn (array $message): bool => ($message['welcome_kind'] ?? '') === 'ride_presence');
$this->assertNotNull($rideMessage);
$this->assertSame('座驾播报', $rideMessage['from_user']);
$this->assertSame('j35', $rideMessage['ride_key']);
$this->assertStringContainsString($user->username, $rideMessage['content']);
$this->assertSame('j35', $response->viewData('initialRideEffect'));
}
/**
* 测试过期座驾用户进房时不会触发座驾播报。
*/
public function test_expired_ride_does_not_trigger_ride_presence_payload(): void
{
$room = Room::create(['room_name' => '过期房']);
$user = User::factory()->create(['has_received_new_gift' => true]);
$ride = ShopItem::query()->updateOrCreate(['slug' => 'ride_df5c'], [
'name' => '过期座驾',
'description' => '测试座驾',
'icon' => '🚀',
'price' => 18888,
'type' => 'ride',
'duration_days' => 7,
'sort_order' => 80,
'is_active' => true,
'welcome_message' => '【{name}】驾驶【{ride}】震撼入场',
]);
$purchase = UserPurchase::create([
'user_id' => $user->id,
'shop_item_id' => $ride->id,
'status' => 'active',
'price_paid' => 18888,
'expires_at' => now()->subMinute(),
]);
$response = $this->actingAs($user)->get(route('chat.room', $room->id));
$response->assertOk();
$history = collect($response->viewData('historyMessages'));
$this->assertNull($history->first(fn (array $message): bool => ($message['welcome_kind'] ?? '') === 'ride_presence'));
$this->assertNull($response->viewData('initialRideEffect'));
$this->assertSame('expired', $purchase->fresh()->status);
}
/**
* 测试新人首次进房时首屏历史包含礼包公告、AI 欢迎和普通进场播报。
*/