From 7275299165660b13d8c92de2db9ea526b1164476 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 9 Apr 2025 11:02:56 -0700 Subject: [PATCH 1/9] 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 2/9] 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 3/9] 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 4/9] 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 5/9] 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 6/9] 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 7/9] 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 8/9] 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 9/9] 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) {