From 7aa5195e87d5a7060fd4165e60ac06a6ab8aa8b4 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 16 Dec 2024 14:39:24 -0800 Subject: [PATCH] Add tests for license checkin --- .../Licenses/LicenseCheckinController.php | 4 -- database/factories/LicenseSeatFactory.php | 4 +- .../Checkins/Ui/LicenseCheckinTest.php | 58 +++++++++++++++++-- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/Licenses/LicenseCheckinController.php b/app/Http/Controllers/Licenses/LicenseCheckinController.php index 4496eb3bc..373a16764 100644 --- a/app/Http/Controllers/Licenses/LicenseCheckinController.php +++ b/app/Http/Controllers/Licenses/LicenseCheckinController.php @@ -63,7 +63,6 @@ class LicenseCheckinController extends Controller $license = License::find($licenseSeat->license_id); // LicenseSeat is not assigned, it can't be checked in - // @todo: if (is_null($licenseSeat->assigned_to) && is_null($licenseSeat->asset_id)) { return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.checkin.error')); } @@ -91,14 +90,12 @@ class LicenseCheckinController extends Controller return redirect()->back()->withInput()->withErrors($validator); } - // @todo: if($licenseSeat->assigned_to != null){ $return_to = User::find($licenseSeat->assigned_to); } else { $return_to = Asset::find($licenseSeat->asset_id); } - // @todo: // Update the asset data $licenseSeat->assigned_to = null; $licenseSeat->asset_id = null; @@ -109,7 +106,6 @@ class LicenseCheckinController extends Controller // Was the asset updated? if ($licenseSeat->save()) { - // @todo: event(new CheckoutableCheckedIn($licenseSeat, $return_to, auth()->user(), $request->input('notes'))); diff --git a/database/factories/LicenseSeatFactory.php b/database/factories/LicenseSeatFactory.php index cc3b7521a..aaf75bdc2 100644 --- a/database/factories/LicenseSeatFactory.php +++ b/database/factories/LicenseSeatFactory.php @@ -37,14 +37,14 @@ class LicenseSeatFactory extends Factory public function reassignable() { - return $this->afterCreating(function (LicenseSeat $seat) { + return $this->afterMaking(function (LicenseSeat $seat) { $seat->license->update(['reassignable' => true]); }); } public function notReassignable() { - return $this->afterCreating(function (LicenseSeat $seat) { + return $this->afterMaking(function (LicenseSeat $seat) { $seat->license->update(['reassignable' => false]); }); } diff --git a/tests/Feature/Checkins/Ui/LicenseCheckinTest.php b/tests/Feature/Checkins/Ui/LicenseCheckinTest.php index 5842e0c93..7e6a33853 100644 --- a/tests/Feature/Checkins/Ui/LicenseCheckinTest.php +++ b/tests/Feature/Checkins/Ui/LicenseCheckinTest.php @@ -2,8 +2,11 @@ namespace Tests\Feature\Checkins\Ui; +use App\Events\CheckoutableCheckedIn; +use App\Models\Asset; use App\Models\LicenseSeat; use App\Models\User; +use Illuminate\Support\Facades\Event; use Tests\TestCase; class LicenseCheckinTest extends TestCase @@ -34,16 +37,37 @@ class LicenseCheckinTest extends TestCase $this->assertNotNull($licenseSeat->fresh()->assigned_to); } - public function testCanCheckInLicenseAssignedToAsset() + public function testCannotCheckinLicenseThatIsNotAssigned() { $licenseSeat = LicenseSeat::factory() ->reassignable() - ->assignedToAsset() ->create(); - $this->assertNotNull($licenseSeat->asset_id); + $this->assertNull($licenseSeat->assigned_to); + $this->assertNull($licenseSeat->asset_id); $this->actingAs(User::factory()->checkoutLicenses()->create()) + ->post(route('licenses.checkin.save', $licenseSeat), [ + 'notes' => 'my note', + 'redirect_option' => 'index', + ]) + ->assertSessionHas('error', trans('admin/licenses/message.checkin.error')); + } + + public function testCanCheckInLicenseAssignedToAsset() + { + Event::fake([CheckoutableCheckedIn::class]); + + $asset = Asset::factory()->create(); + + $licenseSeat = LicenseSeat::factory() + ->reassignable() + ->assignedToAsset($asset) + ->create(); + + $actor = User::factory()->checkoutLicenses()->create(); + + $this->actingAs($actor) ->post(route('licenses.checkin.save', $licenseSeat), [ 'notes' => 'my note', 'redirect_option' => 'index', @@ -52,18 +76,31 @@ class LicenseCheckinTest extends TestCase $this->assertNull($licenseSeat->fresh()->asset_id); $this->assertNull($licenseSeat->fresh()->assigned_to); + $this->assertEquals('my note', $licenseSeat->fresh()->notes); + + Event::assertDispatchedTimes(CheckoutableCheckedIn::class, 1); + Event::assertDispatched(CheckoutableCheckedIn::class, function (CheckoutableCheckedIn $event) use ($actor, $asset, $licenseSeat) { + return $event->checkoutable->is($licenseSeat) + && $event->checkedOutTo->is($asset) + && $event->checkedInBy->is($actor) + && $event->note === 'my note'; + }); } public function testCanCheckInLicenseAssignedToUser() { + Event::fake([CheckoutableCheckedIn::class]); + + $user = User::factory()->create(); + $licenseSeat = LicenseSeat::factory() ->reassignable() - ->assignedToUser() + ->assignedToUser($user) ->create(); - $this->assertNotNull($licenseSeat->assigned_to); + $actor = User::factory()->checkoutLicenses()->create(); - $this->actingAs(User::factory()->checkoutLicenses()->create()) + $this->actingAs($actor) ->post(route('licenses.checkin.save', $licenseSeat), [ 'notes' => 'my note', 'redirect_option' => 'index', @@ -72,5 +109,14 @@ class LicenseCheckinTest extends TestCase $this->assertNull($licenseSeat->fresh()->asset_id); $this->assertNull($licenseSeat->fresh()->assigned_to); + $this->assertEquals('my note', $licenseSeat->fresh()->notes); + + Event::assertDispatchedTimes(CheckoutableCheckedIn::class, 1); + Event::assertDispatched(CheckoutableCheckedIn::class, function (CheckoutableCheckedIn $event) use ($actor, $licenseSeat, $user) { + return $event->checkoutable->is($licenseSeat) + && $event->checkedOutTo->is($user) + && $event->checkedInBy->is($actor) + && $event->note === 'my note'; + }); } }