From 7275299165660b13d8c92de2db9ea526b1164476 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:02:56 -0700 Subject: [PATCH 01/10] Scaffold some tests --- .../Ui/AssetAcceptanceTest.php | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php diff --git a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php new file mode 100644 index 000000000..cd7e7dae6 --- /dev/null +++ b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php @@ -0,0 +1,57 @@ +pending()->create(); + + $this->actingAs($checkoutAcceptance->assignedTo) + ->get(route('account.accept.item', $checkoutAcceptance)) + ->assertViewIs('account.accept.create'); + } + + public function testCannotAcceptAssetAlreadyAccepted() + { + $this->markTestIncomplete(); + } + + public function testCannotAcceptAssetForAnotherUser() + { + $this->markTestIncomplete(); + } + + public function testUserCanAcceptAssetCheckout() + { + Event::fake([CheckoutAccepted::class]); + + $checkoutAcceptance = CheckoutAcceptance::factory()->pending()->create(); + + $this->assertTrue($checkoutAcceptance->isPending()); + + $this->actingAs($checkoutAcceptance->assignedTo) + ->post(route('account.store-acceptance', $checkoutAcceptance), [ + 'asset_acceptance' => 'accepted', + 'note' => 'my note', + ]) + ->assertRedirectToRoute('account.accept'); + + $this->assertFalse($checkoutAcceptance->fresh()->isPending()); + + Event::assertDispatched(CheckoutAccepted::class); + } + + public function testActionLoggedWhenAcceptingAsset() + { + $this->markTestIncomplete(); + } + + +} From d29f5fa13e45f22e498323458e97f9408284bb25 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:07:47 -0700 Subject: [PATCH 02/10] Implement tests --- .../Ui/AssetAcceptanceTest.php | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php index cd7e7dae6..7eb7697db 100644 --- a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php +++ b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php @@ -4,6 +4,7 @@ namespace Tests\Feature\CheckoutAcceptances\Ui; use App\Events\CheckoutAccepted; use App\Models\CheckoutAcceptance; +use App\Models\User; use Illuminate\Support\Facades\Event; use Tests\TestCase; @@ -20,12 +21,44 @@ class AssetAcceptanceTest extends TestCase public function testCannotAcceptAssetAlreadyAccepted() { - $this->markTestIncomplete(); + Event::fake([CheckoutAccepted::class]); + + $checkoutAcceptance = CheckoutAcceptance::factory()->accepted()->create(); + + $this->assertFalse($checkoutAcceptance->isPending()); + + $this->actingAs($checkoutAcceptance->assignedTo) + ->post(route('account.store-acceptance', $checkoutAcceptance), [ + 'asset_acceptance' => 'accepted', + 'note' => 'my note', + ]) + ->assertRedirectToRoute('account.accept') + ->assertSessionHas('error'); + + Event::assertNotDispatched(CheckoutAccepted::class); } public function testCannotAcceptAssetForAnotherUser() { - $this->markTestIncomplete(); + Event::fake([CheckoutAccepted::class]); + + $checkoutAcceptance = CheckoutAcceptance::factory()->pending()->create(); + + $this->assertTrue($checkoutAcceptance->isPending()); + + $anotherUser = User::factory()->create(); + + $this->actingAs($anotherUser) + ->post(route('account.store-acceptance', $checkoutAcceptance), [ + 'asset_acceptance' => 'accepted', + 'note' => 'my note', + ]) + ->assertRedirectToRoute('account.accept') + ->assertSessionHas('error'); + + $this->assertTrue($checkoutAcceptance->fresh()->isPending()); + + Event::assertNotDispatched(CheckoutAccepted::class); } public function testUserCanAcceptAssetCheckout() @@ -41,7 +74,8 @@ class AssetAcceptanceTest extends TestCase 'asset_acceptance' => 'accepted', 'note' => 'my note', ]) - ->assertRedirectToRoute('account.accept'); + ->assertRedirectToRoute('account.accept') + ->assertSessionHas('success'); $this->assertFalse($checkoutAcceptance->fresh()->isPending()); @@ -52,6 +86,4 @@ class AssetAcceptanceTest extends TestCase { $this->markTestIncomplete(); } - - } From d76871760ca06e1f40b4110062b870fcae35bd21 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:11:30 -0700 Subject: [PATCH 03/10] Add failing test --- .../Ui/AssetAcceptanceTest.php | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php index 7eb7697db..e2a1c44bc 100644 --- a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php +++ b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php @@ -3,6 +3,8 @@ namespace Tests\Feature\CheckoutAcceptances\Ui; use App\Events\CheckoutAccepted; +use App\Models\Actionlog; +use App\Models\Asset; use App\Models\CheckoutAcceptance; use App\Models\User; use Illuminate\Support\Facades\Event; @@ -84,6 +86,25 @@ class AssetAcceptanceTest extends TestCase public function testActionLoggedWhenAcceptingAsset() { - $this->markTestIncomplete(); + $checkoutAcceptance = CheckoutAcceptance::factory()->pending()->create(); + + $this->actingAs($checkoutAcceptance->assignedTo) + ->post(route('account.store-acceptance', $checkoutAcceptance), [ + 'asset_acceptance' => 'accepted', + 'note' => 'my note', + ]); + + $this->assertTrue(Actionlog::query() + ->where([ + 'action_type' => 'accepted', + 'target_id' => $checkoutAcceptance->assignedTo->id, + 'target_type' => User::class, + 'note' => 'my note', + 'item_type' => Asset::class, + 'item_id' => $checkoutAcceptance->checkoutable->id, + ]) + ->whereNotNull('action_date') + ->exists() + ); } } From aa58f08b3d36455c3ab8492b20ee246b776fd4ed Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:13:46 -0700 Subject: [PATCH 04/10] Use accepted at for action date in log --- app/Listeners/LogListener.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Listeners/LogListener.php b/app/Listeners/LogListener.php index 27a916848..edddf7036 100644 --- a/app/Listeners/LogListener.php +++ b/app/Listeners/LogListener.php @@ -65,6 +65,7 @@ class LogListener $logaction->filename = $event->acceptance->stored_eula_file; $logaction->note = $event->acceptance->note; $logaction->action_type = 'accepted'; + $logaction->action_date = $event->acceptance->accepted_at; // TODO: log the actual license seat that was checked out if ($event->acceptance->checkoutable instanceof LicenseSeat) { From dbfa952a692b8d2322d423d688b4c3e0a9b48e99 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:15:25 -0700 Subject: [PATCH 05/10] Improve test name --- tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php index e2a1c44bc..c7a912cba 100644 --- a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php +++ b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php @@ -63,7 +63,7 @@ class AssetAcceptanceTest extends TestCase Event::assertNotDispatched(CheckoutAccepted::class); } - public function testUserCanAcceptAssetCheckout() + public function testUserCanAcceptAsset() { Event::fake([CheckoutAccepted::class]); From aed798800ce2093c702b7aa24ec9ecf6be2727ed Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:17:57 -0700 Subject: [PATCH 06/10] Improve assertions --- .../Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php index c7a912cba..23d2212c5 100644 --- a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php +++ b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php @@ -79,7 +79,11 @@ class AssetAcceptanceTest extends TestCase ->assertRedirectToRoute('account.accept') ->assertSessionHas('success'); - $this->assertFalse($checkoutAcceptance->fresh()->isPending()); + $checkoutAcceptance->refresh(); + + $this->assertFalse($checkoutAcceptance->isPending()); + $this->assertNotNull($checkoutAcceptance->accepted_at); + $this->assertNull($checkoutAcceptance->declined_at); Event::assertDispatched(CheckoutAccepted::class); } From 7a9d5bfc0767c07c824835b5911688512ed2da04 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:18:52 -0700 Subject: [PATCH 07/10] Add test for declining assets --- .../Ui/AssetAcceptanceTest.php | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php index 23d2212c5..ed536c704 100644 --- a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php +++ b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php @@ -88,6 +88,31 @@ class AssetAcceptanceTest extends TestCase Event::assertDispatched(CheckoutAccepted::class); } + public function testUserCanDeclineAsset() + { + Event::fake([CheckoutAccepted::class]); + + $checkoutAcceptance = CheckoutAcceptance::factory()->pending()->create(); + + $this->assertTrue($checkoutAcceptance->isPending()); + + $this->actingAs($checkoutAcceptance->assignedTo) + ->post(route('account.store-acceptance', $checkoutAcceptance), [ + 'asset_acceptance' => 'declined', + 'note' => 'my note', + ]) + ->assertRedirectToRoute('account.accept') + ->assertSessionHas('success'); + + $checkoutAcceptance->refresh(); + + $this->assertFalse($checkoutAcceptance->isPending()); + $this->assertNull($checkoutAcceptance->accepted_at); + $this->assertNotNull($checkoutAcceptance->declined_at); + + Event::assertNotDispatched(CheckoutAccepted::class); + } + public function testActionLoggedWhenAcceptingAsset() { $checkoutAcceptance = CheckoutAcceptance::factory()->pending()->create(); From c2123e307a8f6805913658a49379c78cccc96e2e Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:20:07 -0700 Subject: [PATCH 08/10] Add failing test --- .../Ui/AssetAcceptanceTest.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php index ed536c704..4a3ee4001 100644 --- a/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php +++ b/tests/Feature/CheckoutAcceptances/Ui/AssetAcceptanceTest.php @@ -136,4 +136,28 @@ class AssetAcceptanceTest extends TestCase ->exists() ); } + + public function testActionLoggedWhenDecliningAsset() + { + $checkoutAcceptance = CheckoutAcceptance::factory()->pending()->create(); + + $this->actingAs($checkoutAcceptance->assignedTo) + ->post(route('account.store-acceptance', $checkoutAcceptance), [ + 'asset_acceptance' => 'declined', + 'note' => 'my note', + ]); + + $this->assertTrue(Actionlog::query() + ->where([ + 'action_type' => 'declined', + 'target_id' => $checkoutAcceptance->assignedTo->id, + 'target_type' => User::class, + 'note' => 'my note', + 'item_type' => Asset::class, + 'item_id' => $checkoutAcceptance->checkoutable->id, + ]) + ->whereNotNull('action_date') + ->exists() + ); + } } From e5d7bcb6296d352209348fecb3dd6b8abe8253bc Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:20:46 -0700 Subject: [PATCH 09/10] Use declinded at for action date in log --- app/Listeners/LogListener.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Listeners/LogListener.php b/app/Listeners/LogListener.php index edddf7036..d7973e210 100644 --- a/app/Listeners/LogListener.php +++ b/app/Listeners/LogListener.php @@ -83,6 +83,7 @@ class LogListener $logaction->accept_signature = $event->acceptance->signature_filename; $logaction->note = $event->acceptance->note; $logaction->action_type = 'declined'; + $logaction->action_date = $event->acceptance->declined_at; // TODO: log the actual license seat that was checked out if ($event->acceptance->checkoutable instanceof LicenseSeat) { From cd10cd34f4c5ec38f0b3f9875a903ed34aa78eb3 Mon Sep 17 00:00:00 2001 From: akemidx Date: Thu, 10 Apr 2025 14:46:52 -0400 Subject: [PATCH 10/10] location update bug fix and test --- .../Controllers/Assets/AssetsController.php | 5 ---- tests/Feature/Assets/Ui/EditAssetTest.php | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 835689977..6391a3dd9 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -351,11 +351,6 @@ class AssetsController extends Controller event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on asset update with '.$status->getStatuslabelType().' status', date('Y-m-d H:i:s'), $originalValues)); } - if ($asset->assigned_to == '') { - $asset->location_id = $request->input('rtd_location_id', null); - } - - if ($request->filled('image_delete')) { try { unlink(public_path().'/uploads/assets/'.$asset->image); diff --git a/tests/Feature/Assets/Ui/EditAssetTest.php b/tests/Feature/Assets/Ui/EditAssetTest.php index f443f6640..a2645f732 100644 --- a/tests/Feature/Assets/Ui/EditAssetTest.php +++ b/tests/Feature/Assets/Ui/EditAssetTest.php @@ -102,4 +102,27 @@ class EditAssetTest extends TestCase }, 1); } + public function testCurrentLocationIsNotUpdatedOnEdit() + { + $defaultLocation = Location::factory()->create(); + $currentLocation = Location::factory()->create(); + $asset = Asset::factory()->create([ + 'location_id' => $currentLocation->id, + 'rtd_location_id' => $defaultLocation->id + ]); + + $this->actingAs(User::factory()->viewAssets()->editAssets()->create()) + ->put(route('hardware.update', $asset), [ + 'redirect_option' => 'item', + 'name' => 'New name', + 'asset_tags' => 'New Asset Tag', + 'status_id' => $asset->status_id, + 'model_id' => $asset->model_id, + ]); + + $asset->refresh(); + $this->assertEquals('New name', $asset->name); + $this->assertEquals($currentLocation->id, $asset->location_id); + } + }