改为独立座驾模块

This commit is contained in:
pllx
2026-04-30 09:55:20 +08:00
parent 3c95478097
commit 181cc6a0b0
22 changed files with 886 additions and 216 deletions
+10 -10
View File
@@ -12,12 +12,12 @@ use App\Events\MessageSent;
use App\Models\Department;
use App\Models\Gift;
use App\Models\Position;
use App\Models\Ride;
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\UserRidePurchase;
use App\Models\VipLevel;
use App\Support\PositionPermissionRegistry;
use Illuminate\Broadcasting\PresenceChannel;
@@ -1104,20 +1104,20 @@ class ChatControllerTest extends TestCase
{
$room = Room::create(['room_name' => 'rideroom']);
$user = User::factory()->create(['has_received_new_gift' => true]);
$ride = ShopItem::query()->updateOrCreate(['slug' => 'ride_j35'], [
$ride = Ride::query()->updateOrCreate(['slug' => 'ride_j35'], [
'name' => '歼-35测试座驾',
'effect_key' => 'j35',
'description' => '测试座驾',
'icon' => '🛩️',
'price' => 18888,
'type' => 'ride',
'duration_days' => 7,
'sort_order' => 80,
'is_active' => true,
'welcome_message' => '【{name}】驾驶【{ride}】震撼入场',
]);
UserPurchase::create([
UserRidePurchase::create([
'user_id' => $user->id,
'shop_item_id' => $ride->id,
'ride_id' => $ride->id,
'status' => 'active',
'price_paid' => 18888,
'expires_at' => now()->addDays(3),
@@ -1143,20 +1143,20 @@ class ChatControllerTest extends TestCase
{
$room = Room::create(['room_name' => '过期房']);
$user = User::factory()->create(['has_received_new_gift' => true]);
$ride = ShopItem::query()->updateOrCreate(['slug' => 'ride_df5c'], [
$ride = Ride::query()->updateOrCreate(['slug' => 'ride_df5c'], [
'name' => '过期座驾',
'effect_key' => 'df5c',
'description' => '测试座驾',
'icon' => '🚀',
'price' => 18888,
'type' => 'ride',
'duration_days' => 7,
'sort_order' => 80,
'is_active' => true,
'welcome_message' => '【{name}】驾驶【{ride}】震撼入场',
]);
$purchase = UserPurchase::create([
$purchase = UserRidePurchase::create([
'user_id' => $user->id,
'shop_item_id' => $ride->id,
'ride_id' => $ride->id,
'status' => 'active',
'price_paid' => 18888,
'expires_at' => now()->subMinute(),
+43 -31
View File
@@ -8,10 +8,10 @@
namespace Tests\Feature;
use App\Models\Ride;
use App\Models\Room;
use App\Models\ShopItem;
use App\Models\User;
use App\Models\UserPurchase;
use App\Models\UserRidePurchase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Redis;
use Tests\TestCase;
@@ -41,9 +41,9 @@ class RideControllerTest extends TestCase
$user = User::factory()->create();
$ride = $this->createRide(['name' => '歼-35测试座驾', 'slug' => 'ride_j35']);
UserPurchase::create([
UserRidePurchase::create([
'user_id' => $user->id,
'shop_item_id' => $ride->id,
'ride_id' => $ride->id,
'status' => 'active',
'price_paid' => 18888,
'expires_at' => now()->addDays(3),
@@ -76,9 +76,9 @@ class RideControllerTest extends TestCase
->assertJsonPath('status', 'error');
$this->assertSame(100, (int) $user->fresh()->jjb);
$this->assertDatabaseMissing('user_purchases', [
$this->assertDatabaseMissing('user_ride_purchases', [
'user_id' => $user->id,
'shop_item_id' => $ride->id,
'ride_id' => $ride->id,
]);
}
@@ -102,9 +102,9 @@ class RideControllerTest extends TestCase
->assertJsonPath('current_ride.item.slug', 'ride_99a')
->assertJsonPath('jjb', 11112);
$this->assertDatabaseHas('user_purchases', [
$this->assertDatabaseHas('user_ride_purchases', [
'user_id' => $user->id,
'shop_item_id' => $ride->id,
'ride_id' => $ride->id,
'status' => 'active',
'price_paid' => 18888,
]);
@@ -120,9 +120,9 @@ class RideControllerTest extends TestCase
$this->joinRoom($user, $room);
$ride = $this->createRide(['price' => 1000, 'duration_days' => 7]);
$purchase = UserPurchase::create([
$purchase = UserRidePurchase::create([
'user_id' => $user->id,
'shop_item_id' => $ride->id,
'ride_id' => $ride->id,
'status' => 'active',
'price_paid' => 1000,
'expires_at' => now()->addDays(2),
@@ -136,14 +136,14 @@ class RideControllerTest extends TestCase
$response->assertOk();
$this->assertSame('cancelled', $purchase->fresh()->status);
$activePurchase = UserPurchase::query()
$activePurchase = UserRidePurchase::query()
->where('user_id', $user->id)
->where('shop_item_id', $ride->id)
->where('ride_id', $ride->id)
->where('status', 'active')
->firstOrFail();
$this->assertSame(1000, (int) $activePurchase->price_paid);
$this->assertTrue($activePurchase->expires_at->greaterThan(now()->addDays(8)));
$this->assertSame(1, UserPurchase::query()->where('user_id', $user->id)->where('status', 'active')->count());
$this->assertSame(1, UserRidePurchase::query()->where('user_id', $user->id)->where('status', 'active')->count());
}
/**
@@ -157,9 +157,9 @@ class RideControllerTest extends TestCase
$oldRide = $this->createRide(['slug' => 'ride_j35', 'price' => 1000]);
$newRide = $this->createRide(['slug' => 'ride_df5c', 'price' => 2000]);
$oldPurchase = UserPurchase::create([
$oldPurchase = UserRidePurchase::create([
'user_id' => $user->id,
'shop_item_id' => $oldRide->id,
'ride_id' => $oldRide->id,
'status' => 'active',
'price_paid' => 1000,
'expires_at' => now()->addDays(3),
@@ -174,66 +174,78 @@ class RideControllerTest extends TestCase
->assertJsonPath('current_ride.item.slug', 'ride_df5c');
$this->assertSame('cancelled', $oldPurchase->fresh()->status);
$this->assertDatabaseHas('user_purchases', [
$this->assertDatabaseHas('user_ride_purchases', [
'user_id' => $user->id,
'shop_item_id' => $newRide->id,
'ride_id' => $newRide->id,
'status' => 'active',
]);
}
/**
* 测试后台商店可以保存座驾类型和欢迎语字段。
* 测试后台座驾独立模块可以保存欢迎语字段。
*/
public function test_admin_can_store_ride_with_welcome_message(): void
{
$admin = User::factory()->create(['id' => 1, 'user_level' => 100]);
$response = $this->actingAs($admin)->post(route('admin.shop.store'), [
$response = $this->actingAs($admin)->post(route('admin.rides.store'), [
'name' => '测试座驾',
'slug' => 'ride_test',
'effect_key' => 'test',
'icon' => '🚘',
'description' => '测试座驾说明',
'price' => 12345,
'type' => 'ride',
'duration_days' => 7,
'duration_minutes' => 0,
'intimacy_bonus' => 0,
'charm_bonus' => 0,
'welcome_message' => '【{name}】驾驶【{ride}】入场',
'sort_order' => 99,
'is_active' => 1,
]);
$response->assertRedirect(route('admin.shop.index'));
$this->assertDatabaseHas('shop_items', [
$response->assertRedirect(route('admin.rides.index'));
$this->assertDatabaseHas('rides', [
'slug' => 'ride_test',
'type' => 'ride',
'effect_key' => 'test',
'welcome_message' => '【{name}】驾驶【{ride}】入场',
]);
}
/**
* 创建测试用座驾商品
* 测试后台座驾管理页面可以显示独立座驾数据
*/
public function test_admin_can_view_ride_management_page(): void
{
$admin = User::factory()->create(['id' => 1, 'user_level' => 100]);
$ride = $this->createRide(['name' => '后台可见座驾', 'slug' => 'ride_admin_visible']);
$response = $this->actingAs($admin)->get(route('admin.rides.index'));
$response->assertOk()
->assertSee('座驾管理')
->assertSee($ride->name)
->assertSee('ride_admin_visible');
}
/**
* 创建测试用独立座驾。
*
* @param array<string, mixed> $attributes 覆盖字段
*/
private function createRide(array $attributes = []): ShopItem
private function createRide(array $attributes = []): Ride
{
$data = array_merge([
'name' => '测试座驾',
'slug' => 'ride_test_'.str()->random(8),
'effect_key' => 'test_'.str()->random(8),
'description' => '测试座驾说明',
'icon' => '🚘',
'price' => 1000,
'type' => 'ride',
'duration_days' => 7,
'duration_minutes' => 0,
'sort_order' => 80,
'is_active' => true,
'welcome_message' => '【{name}】驾驶【{ride}】入场',
], $attributes);
return ShopItem::query()->updateOrCreate(
return Ride::query()->updateOrCreate(
['slug' => $data['slug']],
$data,
);