create(); $this->actingAs($user); $license = License::factory()->create(['seats' => 2]); $license->update(['seats' => 6]); $this->assertDatabaseHas('action_logs', [ 'created_by' => $user->id, 'action_type' => ActionType::AddSeats, 'item_type' => License::class, 'item_id' => $license->id, 'deleted_at' => null, // relevant for this test: 'quantity' => 4, 'note' => 'added 4 seats', ]); } public function test_removing_seats_is_logged_when_updating() { $user = User::factory()->create(); $this->actingAs($user); $license = License::factory()->create(['seats' => 6]); $license->update(['seats' => 3]); $this->assertDatabaseHas('action_logs', [ 'created_by' => $user->id, 'action_type' => ActionType::DeleteSeats, 'item_type' => License::class, 'item_id' => $license->id, 'deleted_at' => null, // relevant for this test: 'quantity' => 3, 'note' => 'deleted 3 seats', ]); } public function test_percent_remaining_returns_zero_when_seats_are_zero() { $license = new class extends License { public int $remaining = 8; public function remaincount(): int { return $this->remaining; } }; $license->seats = 0; $this->assertEquals(0, $license->percentRemaining()); } public function test_percent_remaining_returns_expected_available_ratio() { $license = new class extends License { public int $remaining = 6; public function remaincount(): int { return $this->remaining; } }; $license->seats = 12; $this->assertEquals(50.0, $license->percentRemaining()); } public function test_percent_remaining_clamps_remaining_to_valid_bounds() { $license = new class extends License { public int $remaining = -3; public function remaincount(): int { return $this->remaining; } }; $license->seats = 10; $this->assertEquals(0.0, $license->percentRemaining()); $license->remaining = 99; $this->assertEquals(100.0, $license->percentRemaining()); } }