create(); $activeItem = ShopItem::create([ 'name' => 'Active', 'slug' => 'active_item', 'type' => 'one_time', 'price' => 100, 'is_active' => true, ]); $inactiveItem = ShopItem::create([ 'name' => 'Inactive', 'slug' => 'inactive_item', 'type' => 'one_time', 'price' => 100, 'is_active' => false, ]); $response = $this->actingAs($user)->getJson(route('shop.items')); $response->assertStatus(200); $responseItems = collect($response->json('items')); $this->assertTrue($responseItems->contains('id', $activeItem->id)); $this->assertFalse($responseItems->contains('id', $inactiveItem->id)); } public function test_can_buy_one_time_item() { $user = User::factory()->create(['jjb' => 500]); $item = ShopItem::firstOrCreate( ['slug' => 'rename_card_test'], [ 'name' => 'Rename Card Test', 'type' => 'one_time', 'price' => 100, 'is_active' => true, ]); $response = $this->actingAs($user)->postJson(route('shop.buy'), [ 'item_id' => $item->id, 'room_id' => 1, ]); $response->assertStatus(200); $response->assertJson(['status' => 'success']); $this->assertDatabaseHas('user_purchases', [ 'user_id' => $user->id, 'shop_item_id' => $item->id, ]); $this->assertDatabaseHas('users', [ 'id' => $user->id, 'jjb' => 400, ]); } public function test_cannot_buy_if_insufficient_funds() { $user = User::factory()->create(['jjb' => 50]); $item = ShopItem::firstOrCreate( ['slug' => 'rename_card_test'], [ 'name' => 'Rename Card Test', 'type' => 'one_time', 'price' => 100, 'is_active' => true, ]); $response = $this->actingAs($user)->postJson(route('shop.buy'), [ 'item_id' => $item->id, ]); $response->assertStatus(400); $response->assertJson(['status' => 'error']); $this->assertDatabaseMissing('user_purchases', [ 'user_id' => $user->id, 'shop_item_id' => $item->id, ]); } public function test_cannot_buy_inactive_item() { $user = User::factory()->create(['jjb' => 500]); $item = ShopItem::create([ 'name' => 'Old Card', 'slug' => 'old_card', 'type' => 'one_time', 'price' => 100, 'is_active' => false, ]); $response = $this->actingAs($user)->postJson(route('shop.buy'), [ 'item_id' => $item->id, ]); $response->assertStatus(400); $this->assertDatabaseMissing('user_purchases', [ 'user_id' => $user->id, ]); } public function test_can_use_rename_card() { $user = User::factory()->create(['username' => 'OldName']); // Actually the service hardcodes 'rename_card' slug check: $item->slug === 'rename_card' // So we MUST use 'rename_card' $item = ShopItem::firstOrCreate( ['slug' => 'rename_card'], [ 'name' => 'Rename Card', 'type' => 'one_time', 'price' => 100, 'is_active' => true, ]); UserPurchase::create([ 'user_id' => $user->id, 'shop_item_id' => $item->id, 'status' => 'active', 'used_at' => null, 'cost_amount' => 100, 'currency_type' => 'gold', ]); $response = $this->actingAs($user)->postJson(route('shop.rename'), [ 'new_name' => 'NewName', ]); $response->assertStatus(200); $response->assertJson(['status' => 'success']); // Assert user's name is updated $this->assertDatabaseHas('users', [ 'id' => $user->id, 'username' => 'NewName', ]); // Assert card is used $this->assertDatabaseHas('user_purchases', [ 'user_id' => $user->id, 'shop_item_id' => $item->id, 'status' => 'used', ]); } }