diff --git a/tests/Feature/Checkouts/Api/AccessoryCheckoutTest.php b/tests/Feature/Checkouts/Api/AccessoryCheckoutTest.php index e6128aa78..9b69395e3 100644 --- a/tests/Feature/Checkouts/Api/AccessoryCheckoutTest.php +++ b/tests/Feature/Checkouts/Api/AccessoryCheckoutTest.php @@ -33,18 +33,111 @@ class AccessoryCheckoutTest extends TestCase ->postJson(route('api.accessories.checkout', Accessory::factory()->withoutItemsRemaining()->create()), [ 'assigned_to' => User::factory()->create()->id, ]) - ->assertStatusMessageIs('error'); + ->assertOk() + ->assertStatusMessageIs('error') + ->assertJson([ + 'messages' => [ + 'assigned_to' => ['The assigned to field must be an integer.'], + ], + ]) + ->assertStatus(200) + ->json(); } public function testAccessoryCanBeCheckedOut() { $accessory = Accessory::factory()->create(); $user = User::factory()->create(); + $admin = User::factory()->checkoutAccessories()->create(); $this->actingAsForApi(User::factory()->checkoutAccessories()->create()) ->postJson(route('api.accessories.checkout', $accessory), [ 'assigned_to' => $user->id, - ]); + ]) + ->assertOk() + ->assertStatusMessageIs('success') + ->assertStatus(200) + ->assertJson([ + 'messages' => [ + 'assigned_to' => ['Accessory checked out successfully.'], + ], + ]) + ->json(); + + $this->assertTrue($accessory->users->contains($user)); + + $this->assertEquals( + 1, + Actionlog::where([ + 'action_type' => 'checkout', + 'target_id' => $user->id, + 'target_type' => User::class, + 'item_id' => $accessory->id, + 'item_type' => Accessory::class, + 'user_id' => $admin->id, + 'note' => 'oh hi there', + ])->count(), + 'Log entry either does not exist or there are more than expected' + ); + } + + public function testAccessoryCanBeCheckedOutWithQty() + { + $accessory = Accessory::factory()->create(['qty' => 20]); + $user = User::factory()->create(); + $admin = User::factory()->checkoutAccessories()->create(); + + $this->actingAsForApi(User::factory()->checkoutAccessories()->create()) + ->postJson(route('api.accessories.checkout', $accessory), [ + 'assigned_to' => $user->id, + 'checkout_qty' => 2, + ]) + ->assertOk() + ->assertStatusMessageIs('success') + ->assertStatus(200) + ->assertJson([ + 'messages' => [ + 'assigned_to' => ['The assigned to field must be an integer.'], + ], + ]) + ->json(); + + $this->assertTrue($accessory->users->contains($user)); + + $this->assertEquals( + 1, + Actionlog::where([ + 'action_type' => 'checkout', + 'target_id' => $user->id, + 'target_type' => User::class, + 'item_id' => $accessory->id, + 'item_type' => Accessory::class, + 'user_id' => $admin->id, + 'note' => 'oh hi there', + ])->count(), + 'Log entry either does not exist or there are more than expected' + ); + } + + public function testAccessoryCannotBeCheckedOutToInvalidUser() + { + $accessory = Accessory::factory()->create(); + $user = User::factory()->create(); + + $this->actingAsForApi(User::factory()->checkoutAccessories()->create()) + ->postJson(route('api.accessories.checkout', $accessory), [ + 'assigned_to' => 'invalid-user-id', + 'note' => 'oh hi there', + ]) + ->assertOk() + ->assertStatusMessageIs('error') + ->assertJson([ + 'messages' => [ + 'assigned_to' => ['The assigned to field must be an integer.'], + ], + ]) + ->assertStatus(200) + ->json(); $this->assertTrue($accessory->users->contains($user)); }