mirror of
https://github.com/shlinkio/shlink.git
synced 2025-12-12 09:28:24 -06:00
Created first CLI E2E tests
This commit is contained in:
parent
79af315b9f
commit
9e32886f60
@ -92,6 +92,7 @@
|
|||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"ShlinkioTest\\Shlink\\CLI\\": "module/CLI/test",
|
"ShlinkioTest\\Shlink\\CLI\\": "module/CLI/test",
|
||||||
|
"ShlinkioCliTest\\Shlink\\CLI\\": "module/CLI/test-cli",
|
||||||
"ShlinkioTest\\Shlink\\Rest\\": "module/Rest/test",
|
"ShlinkioTest\\Shlink\\Rest\\": "module/Rest/test",
|
||||||
"ShlinkioApiTest\\Shlink\\Rest\\": "module/Rest/test-api",
|
"ShlinkioApiTest\\Shlink\\Rest\\": "module/Rest/test-api",
|
||||||
"ShlinkioTest\\Shlink\\Core\\": "module/Core/test",
|
"ShlinkioTest\\Shlink\\Core\\": "module/Core/test",
|
||||||
@ -138,6 +139,8 @@
|
|||||||
"test:db:ms": "DB_DRIVER=mssql composer test:db:sqlite",
|
"test:db:ms": "DB_DRIVER=mssql composer test:db:sqlite",
|
||||||
"test:api": "bin/test/run-api-tests.sh",
|
"test:api": "bin/test/run-api-tests.sh",
|
||||||
"test:api:ci": "GENERATE_COVERAGE=yes composer test:api",
|
"test:api:ci": "GENERATE_COVERAGE=yes composer test:api",
|
||||||
|
"test:cli": "APP_ENV=test DB_DRIVER=maria TEST_ENV=cli php vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-cli.xml",
|
||||||
|
"test:cli:ci": "GENERATE_COVERAGE=yes composer test:cli",
|
||||||
"infect:ci:base": "infection --threads=4 --log-verbosity=default --only-covered --only-covering-test-cases --skip-initial-tests",
|
"infect:ci:base": "infection --threads=4 --log-verbosity=default --only-covered --only-covering-test-cases --skip-initial-tests",
|
||||||
"infect:ci:unit": "@infect:ci:base --coverage=build/coverage-unit --min-msi=80",
|
"infect:ci:unit": "@infect:ci:base --coverage=build/coverage-unit --min-msi=80",
|
||||||
"infect:ci:db": "@infect:ci:base --coverage=build/coverage-db --min-msi=95 --configuration=infection-db.json",
|
"infect:ci:db": "@infect:ci:base --coverage=build/coverage-db --min-msi=95 --configuration=infection-db.json",
|
||||||
|
|||||||
19
config/test/bootstrap_cli_tests.php
Normal file
19
config/test/bootstrap_cli_tests.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Shlinkio\Shlink\TestUtils;
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityManager;
|
||||||
|
use Psr\Container\ContainerInterface;
|
||||||
|
|
||||||
|
/** @var ContainerInterface $container */
|
||||||
|
$container = require __DIR__ . '/../container.php';
|
||||||
|
$testHelper = $container->get(Helper\TestHelper::class);
|
||||||
|
$config = $container->get('config');
|
||||||
|
$em = $container->get(EntityManager::class);
|
||||||
|
|
||||||
|
$testHelper->createTestDb(['bin/cli', 'db:create'], ['bin/cli', 'db:migrate']);
|
||||||
|
CliTest\CliTestCase::setSeedFixturesCallback(
|
||||||
|
static fn () => $testHelper->seedFixtures($em, $config['data_fixtures'] ?? []),
|
||||||
|
);
|
||||||
@ -178,6 +178,7 @@ return [
|
|||||||
|
|
||||||
'data_fixtures' => [
|
'data_fixtures' => [
|
||||||
'paths' => [
|
'paths' => [
|
||||||
|
// TODO These are used for CLI tests too, so maybe should be somewhere else
|
||||||
__DIR__ . '/../../module/Rest/test-api/Fixtures',
|
__DIR__ . '/../../module/Rest/test-api/Fixtures',
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|||||||
21
module/CLI/test-cli/Command/GenerateApiKeyTest.php
Normal file
21
module/CLI/test-cli/Command/GenerateApiKeyTest.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace ShlinkioCliTest\Shlink\CLI\Command;
|
||||||
|
|
||||||
|
use Shlinkio\Shlink\CLI\Command\Api\GenerateKeyCommand;
|
||||||
|
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
||||||
|
use Shlinkio\Shlink\TestUtils\CliTest\CliTestCase;
|
||||||
|
|
||||||
|
class GenerateApiKeyTest extends CliTestCase
|
||||||
|
{
|
||||||
|
/** @test */
|
||||||
|
public function outputIsCorrect(): void
|
||||||
|
{
|
||||||
|
[$output, $exitCode] = $this->exec([GenerateKeyCommand::NAME]);
|
||||||
|
|
||||||
|
self::assertStringContainsString('[OK] Generated API key', $output);
|
||||||
|
self::assertEquals(ExitCodes::EXIT_SUCCESS, $exitCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
63
module/CLI/test-cli/Command/ListApiKeysTest.php
Normal file
63
module/CLI/test-cli/Command/ListApiKeysTest.php
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace ShlinkioCliTest\Shlink\CLI\Command;
|
||||||
|
|
||||||
|
use Cake\Chronos\Chronos;
|
||||||
|
use Shlinkio\Shlink\CLI\Command\Api\ListKeysCommand;
|
||||||
|
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
||||||
|
use Shlinkio\Shlink\TestUtils\CliTest\CliTestCase;
|
||||||
|
|
||||||
|
class ListApiKeysTest extends CliTestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
* @dataProvider provideFlags
|
||||||
|
*/
|
||||||
|
public function generatesExpectedOutput(array $flags, string $expectedOutput): void
|
||||||
|
{
|
||||||
|
[$output, $exitCode] = $this->exec([ListKeysCommand::NAME, ...$flags]);
|
||||||
|
|
||||||
|
self::assertEquals($expectedOutput, $output);
|
||||||
|
self::assertEquals(ExitCodes::EXIT_SUCCESS, $exitCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideFlags(): iterable
|
||||||
|
{
|
||||||
|
$expiredApiKeyDate = Chronos::now()->subDay()->startOfDay()->toAtomString();
|
||||||
|
$enabledOnlyOutput = <<<OUT
|
||||||
|
+-----------------+------+---------------------------+--------------------------+
|
||||||
|
| Key | Name | Expiration date | Roles |
|
||||||
|
+-----------------+------+---------------------------+--------------------------+
|
||||||
|
| valid_api_key | - | - | Admin |
|
||||||
|
+-----------------+------+---------------------------+--------------------------+
|
||||||
|
| expired_api_key | - | {$expiredApiKeyDate} | Admin |
|
||||||
|
+-----------------+------+---------------------------+--------------------------+
|
||||||
|
| author_api_key | - | - | Author only |
|
||||||
|
+-----------------+------+---------------------------+--------------------------+
|
||||||
|
| domain_api_key | - | - | Domain only: example.com |
|
||||||
|
+-----------------+------+---------------------------+--------------------------+
|
||||||
|
|
||||||
|
OUT;
|
||||||
|
|
||||||
|
yield 'no flags' => [[], <<<OUT
|
||||||
|
+------------------+------+------------+---------------------------+--------------------------+
|
||||||
|
| Key | Name | Is enabled | Expiration date | Roles |
|
||||||
|
+------------------+------+------------+---------------------------+--------------------------+
|
||||||
|
| valid_api_key | - | +++ | - | Admin |
|
||||||
|
+------------------+------+------------+---------------------------+--------------------------+
|
||||||
|
| disabled_api_key | - | --- | - | Admin |
|
||||||
|
+------------------+------+------------+---------------------------+--------------------------+
|
||||||
|
| expired_api_key | - | --- | {$expiredApiKeyDate} | Admin |
|
||||||
|
+------------------+------+------------+---------------------------+--------------------------+
|
||||||
|
| author_api_key | - | +++ | - | Author only |
|
||||||
|
+------------------+------+------------+---------------------------+--------------------------+
|
||||||
|
| domain_api_key | - | +++ | - | Domain only: example.com |
|
||||||
|
+------------------+------+------------+---------------------------+--------------------------+
|
||||||
|
|
||||||
|
OUT];
|
||||||
|
yield '-e' => [['-e'], $enabledOnlyOutput];
|
||||||
|
yield '--enabled-only' => [['--enabled-only'], $enabledOnlyOutput];
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -25,7 +25,7 @@ class ApiKeyFixture extends AbstractFixture implements DependentFixtureInterface
|
|||||||
{
|
{
|
||||||
$manager->persist($this->buildApiKey('valid_api_key', true));
|
$manager->persist($this->buildApiKey('valid_api_key', true));
|
||||||
$manager->persist($this->buildApiKey('disabled_api_key', false));
|
$manager->persist($this->buildApiKey('disabled_api_key', false));
|
||||||
$manager->persist($this->buildApiKey('expired_api_key', true, Chronos::now()->subDay()));
|
$manager->persist($this->buildApiKey('expired_api_key', true, Chronos::now()->subDay()->startOfDay()));
|
||||||
|
|
||||||
$authorApiKey = $this->buildApiKey('author_api_key', true);
|
$authorApiKey = $this->buildApiKey('author_api_key', true);
|
||||||
$authorApiKey->registerRole(RoleDefinition::forAuthoredShortUrls());
|
$authorApiKey->registerRole(RoleDefinition::forAuthoredShortUrls());
|
||||||
|
|||||||
20
phpunit-cli.xml
Normal file
20
phpunit-cli.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<phpunit
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
||||||
|
bootstrap="./config/test/bootstrap_cli_tests.php"
|
||||||
|
colors="true"
|
||||||
|
>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Shlink CLI tests">
|
||||||
|
<directory>./module/*/test-cli</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
|
||||||
|
<coverage processUncoveredFiles="true">
|
||||||
|
<include>
|
||||||
|
<directory suffix=".php">./module/CLI/src</directory>
|
||||||
|
<directory suffix=".php">./module/Core/src</directory>
|
||||||
|
</include>
|
||||||
|
</coverage>
|
||||||
|
</phpunit>
|
||||||
Loading…
x
Reference in New Issue
Block a user