mirror of
https://github.com/shlinkio/shlink.git
synced 2026-03-11 01:33:11 +08:00
Make sure a unique name is required by api-key:generate command
This commit is contained in:
@@ -100,16 +100,22 @@ class GenerateKeyCommand extends Command
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
$io = new SymfonyStyle($input, $output);
|
||||
$expirationDate = $input->getOption('expiration-date');
|
||||
|
||||
$apiKeyMeta = ApiKeyMeta::fromParams(
|
||||
name: $input->getOption('name'),
|
||||
expirationDate: isset($expirationDate) ? Chronos::parse($expirationDate) : null,
|
||||
roleDefinitions: $this->roleResolver->determineRoles($input),
|
||||
);
|
||||
$apiKey = $this->apiKeyService->create($apiKeyMeta);
|
||||
|
||||
$io = new SymfonyStyle($input, $output);
|
||||
if ($this->apiKeyService->existsWithName($apiKeyMeta->name)) {
|
||||
$io->warning(
|
||||
sprintf('An API key with name "%s" already exists. Try with a different ome', $apiKeyMeta->name),
|
||||
);
|
||||
return ExitCode::EXIT_WARNING;
|
||||
}
|
||||
|
||||
$apiKey = $this->apiKeyService->create($apiKeyMeta);
|
||||
$io->success(sprintf('Generated API key: "%s"', $apiKeyMeta->key));
|
||||
|
||||
if ($input->isInteractive()) {
|
||||
@@ -120,8 +126,7 @@ class GenerateKeyCommand extends Command
|
||||
ShlinkTable::default($io)->render(
|
||||
['Role name', 'Role metadata'],
|
||||
$apiKey->mapRoles(fn (Role $role, array $meta) => [$role->value, arrayToString($meta, indentSize: 0)]),
|
||||
null,
|
||||
'Roles',
|
||||
headerTitle: 'Roles',
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ use PHPUnit\Framework\MockObject\MockObject;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Shlinkio\Shlink\CLI\ApiKey\RoleResolverInterface;
|
||||
use Shlinkio\Shlink\CLI\Command\Api\GenerateKeyCommand;
|
||||
use Shlinkio\Shlink\CLI\Util\ExitCode;
|
||||
use Shlinkio\Shlink\Rest\ApiKey\Model\ApiKeyMeta;
|
||||
use Shlinkio\Shlink\Rest\Entity\ApiKey;
|
||||
use Shlinkio\Shlink\Rest\Service\ApiKeyServiceInterface;
|
||||
@@ -64,8 +65,27 @@ class GenerateKeyCommandTest extends TestCase
|
||||
$this->callback(fn (ApiKeyMeta $meta) => $meta->name === 'Alice'),
|
||||
)->willReturn(ApiKey::create());
|
||||
|
||||
$this->commandTester->execute([
|
||||
$exitCode = $this->commandTester->execute([
|
||||
'--name' => 'Alice',
|
||||
]);
|
||||
|
||||
self::assertEquals(ExitCode::EXIT_SUCCESS, $exitCode);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function warningIsPrintedIfProvidedNameAlreadyExists(): void
|
||||
{
|
||||
$name = 'The API key';
|
||||
|
||||
$this->apiKeyService->expects($this->never())->method('create');
|
||||
$this->apiKeyService->expects($this->once())->method('existsWithName')->with($name)->willReturn(true);
|
||||
|
||||
$exitCode = $this->commandTester->execute([
|
||||
'--name' => $name,
|
||||
]);
|
||||
$output = $this->commandTester->getDisplay();
|
||||
|
||||
self::assertEquals(ExitCode::EXIT_WARNING, $exitCode);
|
||||
self::assertStringContainsString('An API key with name "The API key" already exists.', $output);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user