From c46f2cb274d5605c064512ad251e395c62987a6c Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 16 Sep 2017 17:39:52 -0500 Subject: [PATCH] More command tests --- .../Location/DeleteLocationCommand.php | 10 +- .../Location/DeleteLocationCommandTest.php | 154 ++++++++++++++++++ .../Location/MakeLocationCommandTest.php | 108 ++++++++++++ 3 files changed, 266 insertions(+), 6 deletions(-) create mode 100644 tests/Unit/Commands/Location/DeleteLocationCommandTest.php create mode 100644 tests/Unit/Commands/Location/MakeLocationCommandTest.php diff --git a/app/Console/Commands/Location/DeleteLocationCommand.php b/app/Console/Commands/Location/DeleteLocationCommand.php index d713c233b..b75c186f0 100644 --- a/app/Console/Commands/Location/DeleteLocationCommand.php +++ b/app/Console/Commands/Location/DeleteLocationCommand.php @@ -48,9 +48,7 @@ class DeleteLocationCommand extends Command /** * @var string */ - protected $signature = 'p:location:delete - {--minimal : Passing this flag will hide the list of current locations.} - {--short= : The short code of the location to delete.}'; + protected $signature = 'p:location:delete {--short= : The short code of the location to delete.}'; /** * DeleteLocationCommand constructor. @@ -76,7 +74,7 @@ class DeleteLocationCommand extends Command */ public function handle() { - $this->locations = $this->locations ?? $this->repository->getAllWithNodes(); + $this->locations = $this->locations ?? $this->repository->all(); $short = $this->option('short') ?? $this->anticipate( trans('command/messages.location.ask_short'), $this->locations->pluck('short')->toArray() ); @@ -84,14 +82,14 @@ class DeleteLocationCommand extends Command $location = $this->locations->where('short', $short)->first(); if (is_null($location)) { $this->error(trans('command/messages.location.no_location_found')); - if (is_null($this->option('short')) && ! $this->option('no-interaction')) { + if ($this->input->isInteractive()) { $this->handle(); } return; } - $this->line(trans('command/messages.location.deleted')); $this->deletionService->handle($location->id); + $this->line(trans('command/messages.location.deleted')); } } diff --git a/tests/Unit/Commands/Location/DeleteLocationCommandTest.php b/tests/Unit/Commands/Location/DeleteLocationCommandTest.php new file mode 100644 index 000000000..b1fa00504 --- /dev/null +++ b/tests/Unit/Commands/Location/DeleteLocationCommandTest.php @@ -0,0 +1,154 @@ +. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +namespace Tests\Unit\Commands\Location; + +use Mockery as m; +use Tests\TestCase; +use Pterodactyl\Models\Location; +use Symfony\Component\Console\Tester\CommandTester; +use Pterodactyl\Services\Locations\LocationDeletionService; +use Pterodactyl\Console\Commands\Location\DeleteLocationCommand; +use Pterodactyl\Contracts\Repository\LocationRepositoryInterface; + +class DeleteLocationCommandTest extends TestCase +{ + /** + * @var \Pterodactyl\Console\Commands\Location\DeleteLocationCommand + */ + protected $command; + + /** + * @var \Pterodactyl\Services\Locations\LocationDeletionService + */ + protected $deletionService; + + /** + * @var \Pterodactyl\Contracts\Repository\LocationRepositoryInterface + */ + protected $repository; + + /** + * Setup tests. + */ + public function setUp() + { + parent::setUp(); + + $this->deletionService = m::mock(LocationDeletionService::class); + $this->repository = m::mock(LocationRepositoryInterface::class); + + $this->command = new DeleteLocationCommand($this->deletionService, $this->repository); + $this->command->setLaravel($this->app); + } + + /** + * Test that a location can be deleted. + */ + public function testLocationIsDeleted() + { + $locations = collect([ + $location1 = factory(Location::class)->make(), + $location2 = factory(Location::class)->make(), + ]); + + $this->repository->shouldReceive('all')->withNoArgs()->once()->andReturn($locations); + $this->deletionService->shouldReceive('handle')->with($location2->id)->once()->andReturnNull(); + + $response = new CommandTester($this->command); + $response->setInputs([$location2->short]); + $response->execute([]); + + $display = $response->getDisplay(); + $this->assertNotEmpty($display); + $this->assertContains(trans('command/messages.location.deleted'), $display); + } + + /** + * Test that a location is deleted if passed in as an option. + */ + public function testLocationIsDeletedIfPassedInOption() + { + $locations = collect([ + $location1 = factory(Location::class)->make(), + $location2 = factory(Location::class)->make(), + ]); + + $this->repository->shouldReceive('all')->withNoArgs()->once()->andReturn($locations); + $this->deletionService->shouldReceive('handle')->with($location2->id)->once()->andReturnNull(); + + $response = new CommandTester($this->command); + $response->execute([ + '--short' => $location2->short, + ]); + + $display = $response->getDisplay(); + $this->assertNotEmpty($display); + $this->assertContains(trans('command/messages.location.deleted'), $display); + } + + /** + * Test that prompt shows back up if the user enters the wrong parameters. + */ + public function testInteractiveEnvironmentAllowsReAttemptingSearch() + { + $locations = collect([ + $location1 = factory(Location::class)->make(), + $location2 = factory(Location::class)->make(), + ]); + + $this->repository->shouldReceive('all')->withNoArgs()->once()->andReturn($locations); + $this->deletionService->shouldReceive('handle')->with($location2->id)->once()->andReturnNull(); + + $response = new CommandTester($this->command); + $response->setInputs(['123_not_exist', 'another_not_exist', $location2->short]); + $response->execute([]); + + $display = $response->getDisplay(); + $this->assertNotEmpty($display); + $this->assertContains(trans('command/messages.location.no_location_found'), $display); + $this->assertContains(trans('command/messages.location.deleted'), $display); + } + + /** + * Test that no re-attempt is performed in a non-interactive environment. + */ + public function testNonInteractiveEnvironmentThrowsErrorIfNoLocationIsFound() + { + $locations = collect([ + $location1 = factory(Location::class)->make(), + $location2 = factory(Location::class)->make(), + ]); + + $this->repository->shouldReceive('all')->withNoArgs()->once()->andReturn($locations); + $this->deletionService->shouldNotReceive('handle'); + + $response = new CommandTester($this->command); + $response->execute(['--short' => 'randomTestString'], ['interactive' => false]); + + $display = $response->getDisplay(); + $this->assertNotEmpty($display); + $this->assertContains(trans('command/messages.location.no_location_found'), $display); + } +} diff --git a/tests/Unit/Commands/Location/MakeLocationCommandTest.php b/tests/Unit/Commands/Location/MakeLocationCommandTest.php new file mode 100644 index 000000000..3ae3222eb --- /dev/null +++ b/tests/Unit/Commands/Location/MakeLocationCommandTest.php @@ -0,0 +1,108 @@ +. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +namespace Tests\Unit\Commands\Location; + +use Mockery as m; +use Tests\TestCase; +use Pterodactyl\Models\Location; +use Symfony\Component\Console\Tester\CommandTester; +use Pterodactyl\Services\Locations\LocationCreationService; +use Pterodactyl\Console\Commands\Location\MakeLocationCommand; + +class MakeLocationCommandTest extends TestCase +{ + /** + * @var \Pterodactyl\Console\Commands\Location\MakeLocationCommand + */ + protected $command; + + /** + * @var \Pterodactyl\Services\Locations\LocationCreationService + */ + protected $creationService; + + /** + * Setup tests. + */ + public function setUp() + { + parent::setUp(); + + $this->creationService = m::mock(LocationCreationService::class); + + $this->command = new MakeLocationCommand($this->creationService); + $this->command->setLaravel($this->app); + } + + /** + * Test that a location can be created when no options are passed. + */ + public function testLocationIsCreatedWithNoOptionsPassed() + { + $location = factory(Location::class)->make(); + + $this->creationService->shouldReceive('handle')->with([ + 'short' => $location->short, + 'long' => $location->long, + ])->once()->andReturn($location); + + $response = new CommandTester($this->command); + $response->setInputs([$location->short, $location->long]); + $response->execute([]); + + $display = $response->getDisplay(); + $this->assertNotEmpty($display); + $this->assertContains(trans('command/messages.location.created', [ + 'name' => $location->short, + 'id' => $location->id, + ]), $display); + } + + /** + * Test that a location is created when options are passed. + */ + public function testLocationIsCreatedWhenOptionsArePassed() + { + $location = factory(Location::class)->make(); + + $this->creationService->shouldReceive('handle')->with([ + 'short' => $location->short, + 'long' => $location->long, + ])->once()->andReturn($location); + + $response = new CommandTester($this->command); + $response->execute([ + '--short' => $location->short, + '--long' => $location->long, + ]); + + $display = $response->getDisplay(); + $this->assertNotEmpty($display); + $this->assertContains(trans('command/messages.location.created', [ + 'name' => $location->short, + 'id' => $location->id, + ]), $display); + } +}