diff --git a/src/Commands/MachineToken/DeleteCommand.php b/src/Commands/MachineToken/DeleteCommand.php index 39ac448de..5faa168f9 100644 --- a/src/Commands/MachineToken/DeleteCommand.php +++ b/src/Commands/MachineToken/DeleteCommand.php @@ -3,6 +3,7 @@ namespace Pantheon\Terminus\Commands\MachineToken; use Pantheon\Terminus\Commands\TerminusCommand; +use Terminus\Exceptions\TerminusException; class DeleteCommand extends TerminusCommand { @@ -15,14 +16,35 @@ class DeleteCommand extends TerminusCommand * Removes a machine token from the logged-in user's account * * @name machine-token:delete + * @param string $machine_token_id The ID of the machine token to be deleted + * @throws \Terminus\Exceptions\TerminusException * @aliases mt:delete * - * @param machine_token_id The ID of the machine token to be deleted * @usage terminus machine-token:delete * Removes the given machine token from the user's account */ public function delete($machine_token_id) { + $user = $this->session()->getUser(); + // Find the token. Will throw an exception if it doesn't exist. + $machine_token = $user->machine_tokens->get($machine_token_id); + if (empty($machine_token)) { + throw new TerminusException('There are no machine tokens with the id {id}.', compact($machine_token_id)); + } + $name = $machine_token->get('device_name'); + + // Confirm the delete. + if ($this->confirm(sprintf('Are you sure you want to delete "%s"?', $name))) { + $this->log()->notice('Deleting {token} ...', ['token' => $name]); + + $response = $machine_token->delete(); + if ($response['status_code'] == 200) { + $this->log()->notice('Deleted {token}!', ['token' => $name]); + } else { + throw new TerminusException('There was an problem deleting the machine token.'); + } + + } } } diff --git a/src/Commands/MachineToken/ListCommand.php b/src/Commands/MachineToken/ListCommand.php index 049b325a3..7648bfd76 100644 --- a/src/Commands/MachineToken/ListCommand.php +++ b/src/Commands/MachineToken/ListCommand.php @@ -3,6 +3,8 @@ namespace Pantheon\Terminus\Commands\MachineToken; use Pantheon\Terminus\Commands\TerminusCommand; +use Consolidation\OutputFormatters\StructuredData\RowsOfFields; + class ListCommand extends TerminusCommand { @@ -19,9 +21,27 @@ class ListCommand extends TerminusCommand * * @usage terminus machine-token:list * Lists your user's machine tokens + * + * @return \Consolidation\OutputFormatters\StructuredData\RowsOfFields */ - public function listTokens() { + public function listTokens($options = ['format' => 'table', 'fields' => '']) { + $user = $this->session()->getUser(); + + $machine_tokens = $user->machine_tokens->all(); + $data = array(); + foreach ($machine_tokens as $id => $machine_token) { + $data[] = array( + 'id' => $machine_token->id, + 'device_name' => $machine_token->get('device_name'), + ); + } + + if (count($data) == 0) { + $this->log()->warning('You have no machine tokens.'); + } + // Return the output data. + return new RowsOfFields($data); } } diff --git a/tests/active_features/machine-token.feature b/tests/active_features/machine-token.feature new file mode 100644 index 000000000..f2bc5e352 --- /dev/null +++ b/tests/active_features/machine-token.feature @@ -0,0 +1,23 @@ +Feature: Machine tokens command + In order to manage my devices + As a user + I need to be able to view and delete my machine tokens. + + Background: I am logged in + Given I am authenticated + + @vcr machine-tokens_list + Scenario: List the machine tokens + When I run "terminus machine-token:list" + Then I should get: + """ + [[machine_token_id]] + """ + + @vcr machine-tokens_delete + Scenario: Delete machine token + When I run "terminus machine-token:delete [[machine_token_id]] --yes" + Then I should get: + """ + Deleted [[machine_token_device]]! + """ diff --git a/tests/new_unit_tests/Commands/MachineToken/MachineTokenCommandTest.php b/tests/new_unit_tests/Commands/MachineToken/MachineTokenCommandTest.php new file mode 100644 index 000000000..ea89ebf28 --- /dev/null +++ b/tests/new_unit_tests/Commands/MachineToken/MachineTokenCommandTest.php @@ -0,0 +1,51 @@ +machine_tokens = $this->getMockBuilder(MachineTokens::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->user = $this->getMockBuilder(User::class) + ->disableOriginalConstructor() + ->getMock(); + $this->user->machine_tokens = $this->machine_tokens; + + $this->session = $this->getMockBuilder(Session::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->session->method('getUser') + ->willReturn($this->user); + + $this->logger = $this->getMockBuilder(NullLogger::class) + ->setMethods(array('log')) + ->getMock(); + + + } +} diff --git a/tests/new_unit_tests/Commands/MachineToken/MachineTokensDeleteCommandTest.php b/tests/new_unit_tests/Commands/MachineToken/MachineTokensDeleteCommandTest.php new file mode 100644 index 000000000..c0af0f13c --- /dev/null +++ b/tests/new_unit_tests/Commands/MachineToken/MachineTokensDeleteCommandTest.php @@ -0,0 +1,121 @@ +command = new DeleteCommand(new Config()); + $this->command->setSession($this->session); + $this->command->setLogger($this->logger); + + // Ignore user input. + $input = $this->getMockBuilder(ArrayInput::class) + ->disableOriginalConstructor() + ->getMock(); + $input->expects($this->any()) + ->method('hasParameterOption') + ->with(['--yes', '-y']) + ->willReturn(true); + + $this->command->setInput($input); + } + + + /** + * Tests the machine-token:delete command. + * + * @return void + */ + public function testMachineTokenDelete() + { + $token = $this->getMockBuilder(MachineToken::class) + ->disableOriginalConstructor() + ->getMock(); + + $token->expects($this->once()) + ->method('delete') + ->willReturn( + ['status_code' => 200] + ); + + + $this->machine_tokens->expects($this->once()) + ->method('get') + ->with($this->equalTo('123')) + ->willReturn( + $token + ); + + + $this->command->delete('123'); + } + + /** + * Tests the machine-token:delete command when there are no tokens. + * + * @return void + */ + public function testMachineTokenDeleteNonExistant() + { + $token = $this->getMockBuilder(MachineToken::class) + ->disableOriginalConstructor() + ->getMock(); + + $token->expects($this->never()) + ->method('delete'); + + $this->machine_tokens->expects($this->once()) + ->method('get') + ->with($this->equalTo('123')) + ->willReturn(null); + + $this->setExpectedException(\Exception::class, 'There are no machine tokens with the id {id}.'); + + $this->command->delete('123'); + } + + /** + * Tests the machine-token:delete command when the API fails. + * + * @return void + */ + public function testMachineTokenDeleteAPIFailure() + { + $token = $this->getMockBuilder(MachineToken::class) + ->disableOriginalConstructor() + ->getMock(); + + $token->expects($this->once()) + ->method('delete') + ->willReturn( + ['status_code' => 500] + ); + + $this->machine_tokens->expects($this->once()) + ->method('get') + ->with($this->equalTo('123')) + ->willReturn( + $token + ); + + + $this->setExpectedException(\Exception::class, 'There was an problem deleting the machine token.'); + + $this->command->delete('123'); + } +} diff --git a/tests/new_unit_tests/Commands/MachineToken/MachineTokensListCommandTest.php b/tests/new_unit_tests/Commands/MachineToken/MachineTokensListCommandTest.php new file mode 100644 index 000000000..750570acc --- /dev/null +++ b/tests/new_unit_tests/Commands/MachineToken/MachineTokensListCommandTest.php @@ -0,0 +1,71 @@ +command = new ListCommand(new Config()); + $this->command->setSession($this->session); + $this->command->setLogger($this->logger); + } + + /** + * Tests the machine-token:list command when there are no tokens. + * + * @return void + */ + public function testMachineTokenListEmpty() + { + $this->machine_tokens->method('all') + ->willReturn([]); + + $this->logger->expects($this->once()) + ->method('log') + ->with($this->equalTo('warning'), $this->equalTo('You have no machine tokens.')); + + $out = $this->command->listTokens(); + $this->assertInstanceOf('Consolidation\OutputFormatters\StructuredData\RowsOfFields', $out); + $this->assertEquals([], $out->getArrayCopy()); + } + + /** + * Tests the machine-token:list command when there are tokens. + * + * @return void + */ + public function testMachineTokenListNotEmpty() + { + $tokens = [ + ['id' => '1', 'device_name' => 'Foo'], + ['id' => '2', 'device_name' => 'Bar'] + ]; + $collection = new MachineTokens(['user' => $this->user]); + $this->machine_tokens->method('all') + ->willReturn([ + new MachineToken((object)$tokens[0], ['collection' => $collection]), + new MachineToken((object)$tokens[1], ['collection' => $collection]) + ]); + + $this->logger->expects($this->never()) + ->method($this->anything()); + + $out = $this->command->listTokens(); + $this->assertInstanceOf('Consolidation\OutputFormatters\StructuredData\RowsOfFields', $out); + $this->assertEquals($tokens, $out->getArrayCopy()); + } + +}