shlink/config/test/test_config.global.php

276 lines
9.2 KiB
PHP
Raw Normal View History

<?php
2019-10-05 10:26:10 -05:00
declare(strict_types=1);
2019-08-11 09:30:46 -05:00
namespace Shlinkio\Shlink;
2019-01-26 03:19:20 -06:00
use GuzzleHttp\Client;
2020-01-01 14:11:53 -06:00
use Laminas\ConfigAggregator\ConfigAggregator;
2020-09-26 03:43:50 -05:00
use Laminas\Diactoros\Response\EmptyResponse;
2020-01-01 14:11:53 -06:00
use Laminas\ServiceManager\Factory\InvokableFactory;
use League\Event\EventDispatcher;
2022-06-04 01:59:17 -05:00
use Monolog\Level;
2020-09-26 03:43:50 -05:00
use PHPUnit\Runner\Version;
use Psr\Container\ContainerInterface;
2021-12-10 10:45:50 -06:00
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
2020-09-26 03:43:50 -05:00
use SebastianBergmann\CodeCoverage\CodeCoverage;
2020-11-02 04:50:19 -06:00
use SebastianBergmann\CodeCoverage\Driver\Selector;
use SebastianBergmann\CodeCoverage\Filter;
2021-12-10 10:45:50 -06:00
use SebastianBergmann\CodeCoverage\Report\Html\Facade as Html;
use SebastianBergmann\CodeCoverage\Report\PHP;
2020-09-26 03:43:50 -05:00
use SebastianBergmann\CodeCoverage\Report\Xml\Facade as Xml;
2022-08-09 12:48:43 -05:00
use Shlinkio\Shlink\Common\Logger\LoggerType;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use function file_exists;
use function Functional\contains;
2020-09-26 03:43:50 -05:00
use function Laminas\Stratigility\middleware;
use function Shlinkio\Shlink\Config\env;
use function sprintf;
use function sys_get_temp_dir;
use const ShlinkioTest\Shlink\API_TESTS_HOST;
use const ShlinkioTest\Shlink\API_TESTS_PORT;
2020-09-26 03:43:50 -05:00
$isApiTest = env('TEST_ENV') === 'api';
$isCliTest = env('TEST_ENV') === 'cli';
$isE2eTest = $isApiTest || $isCliTest;
$coverageType = env('GENERATE_COVERAGE');
$generateCoverage = contains(['yes', 'pretty'], $coverageType);
$coverage = null;
if ($isE2eTest && $generateCoverage) {
2020-11-02 04:50:19 -06:00
$filter = new Filter();
2021-12-10 10:45:50 -06:00
$filter->includeDirectory(__DIR__ . '/../../module/Core/src');
$filter->includeDirectory(__DIR__ . '/../../module/' . ($isApiTest ? 'Rest' : 'CLI') . '/src');
2020-11-02 04:50:19 -06:00
$coverage = new CodeCoverage((new Selector())->forLineCoverage($filter), $filter);
2020-09-26 03:43:50 -05:00
}
/**
* @param 'api'|'cli' $type
*/
$exportCoverage = static function (string $type = 'api') use (&$coverage, $coverageType): void {
if ($coverage === null) {
return;
}
$basePath = __DIR__ . '/../../build/coverage-' . $type;
$covPath = $basePath . '.cov';
// Every CLI test runs on its own process and dumps the coverage afterwards.
// Try to load it and merge it, so that we end up with the whole coverage at the end.
if ($type === 'cli' && file_exists($covPath)) {
$coverage->merge(require $covPath);
}
if ($coverageType === 'pretty') {
(new Html())->process($coverage, $basePath . '/coverage-html');
} else {
(new PHP())->process($coverage, $covPath);
(new Xml(Version::getVersionString()))->process($coverage, $basePath . '/coverage-xml');
}
};
2021-07-20 07:03:19 -05:00
$buildDbConnection = static function (): array {
$driver = env('DB_DRIVER', 'sqlite');
$isCi = env('CI', false);
2021-07-20 07:03:19 -05:00
$getCiMysqlPort = static fn (string $driver) => $driver === 'mysql' ? '3307' : '3308';
2021-07-20 07:03:19 -05:00
return match ($driver) {
'sqlite' => [
'driver' => 'pdo_sqlite',
'memory' => true,
],
'postgres' => [
'driver' => 'pdo_pgsql',
'host' => $isCi ? '127.0.0.1' : 'shlink_db_postgres',
'port' => $isCi ? '5433' : '5432',
'user' => 'postgres',
'password' => 'root',
'dbname' => 'shlink_test',
2022-01-10 06:04:16 -06:00
'charset' => 'utf8',
],
2020-02-03 14:20:40 -06:00
'mssql' => [
'driver' => 'pdo_sqlsrv',
'host' => $isCi ? '127.0.0.1' : 'shlink_db_ms',
'user' => 'sa',
'password' => 'Passw0rd!',
2020-02-03 14:20:40 -06:00
'dbname' => 'shlink_test',
'driverOptions' => [
'TrustServerCertificate' => 'true',
],
2020-02-03 14:20:40 -06:00
],
2021-07-20 07:03:19 -05:00
default => [ // mysql and maria
'driver' => 'pdo_mysql',
'host' => $isCi ? '127.0.0.1' : sprintf('shlink_db_%s', $driver),
2021-07-20 07:03:19 -05:00
'port' => $isCi ? $getCiMysqlPort($driver) : '3306',
'user' => 'root',
'password' => 'root',
'dbname' => 'shlink_test',
2022-01-10 06:04:16 -06:00
'charset' => 'utf8mb4',
2021-07-20 07:03:19 -05:00
],
};
};
2022-06-04 01:59:17 -05:00
$buildTestLoggerConfig = static fn (string $filename) => [
'level' => Level::Debug->value,
'type' => LoggerType::STREAM->value,
'destination' => sprintf('data/log/api-tests/%s', $filename),
'add_new_line' => true,
];
return [
2019-01-26 03:59:24 -06:00
'debug' => true,
ConfigAggregator::ENABLE_CACHE => false,
2019-01-27 05:35:00 -06:00
'url_shortener' => [
'domain' => [
'schema' => 'http',
'hostname' => 's.test',
2019-01-27 05:35:00 -06:00
],
],
2020-01-01 14:11:53 -06:00
'mezzio-swoole' => [
'enable_coroutine' => false,
'swoole-http-server' => [
'host' => API_TESTS_HOST,
'port' => API_TESTS_PORT,
2019-01-26 03:19:20 -06:00
'process-name' => 'shlink_test',
'options' => [
'pid_file' => sys_get_temp_dir() . '/shlink-test-swoole.pid',
'log_file' => __DIR__ . '/../../data/log/api-tests/output.log',
'enable_coroutine' => false,
],
],
],
2020-09-26 03:43:50 -05:00
'routes' => !$isApiTest ? [] : [
[
'name' => 'dump_coverage',
'path' => '/api-tests/stop-coverage',
'middleware' => middleware(static function () use ($exportCoverage) {
// TODO I have tried moving this block to a listener so that it's invoked automatically,
// but then the coverage is generated empty ¯\_(ツ)_/¯
$exportCoverage();
2020-09-26 03:43:50 -05:00
return new EmptyResponse();
}),
'allowed_methods' => ['GET'],
],
],
2021-12-10 10:45:50 -06:00
'middleware_pipeline' => !$isApiTest ? [] : [
'capture_code_coverage' => [
'middleware' => middleware(static function (
ServerRequestInterface $req,
RequestHandlerInterface $handler,
) use (&$coverage): ResponseInterface {
$coverage?->start($req->getHeaderLine('x-coverage-id'));
try {
return $handler->handle($req);
} finally {
$coverage?->stop();
}
}),
'priority' => 9999,
],
],
'mercure' => [
'public_hub_url' => null,
'internal_hub_url' => null,
'jwt_secret' => null,
],
'dependencies' => [
'services' => [
'shlink_test_api_client' => new Client([
'base_uri' => sprintf('http://%s:%s/', API_TESTS_HOST, API_TESTS_PORT),
'http_errors' => false,
]),
],
'factories' => [
2019-08-11 09:30:46 -05:00
TestUtils\Helper\TestHelper::class => InvokableFactory::class,
],
'delegators' => $isCliTest ? [
Application::class => [
static function (
ContainerInterface $c,
string $serviceName,
callable $callback,
) use (
&$coverage,
$exportCoverage,
) {
/** @var Application $app */
$app = $callback();
$wrappedEventDispatcher = new EventDispatcher();
// When the command starts, start collecting coverage
$wrappedEventDispatcher->subscribeTo(
ConsoleCommandEvent::class,
static function () use (&$coverage): void {
$id = env('COVERAGE_ID');
if ($id === null) {
return;
}
$coverage?->start($id);
},
);
// When the command ends, stop collecting coverage
$wrappedEventDispatcher->subscribeTo(
ConsoleTerminateEvent::class,
static function () use (&$coverage, $exportCoverage): void {
$id = env('COVERAGE_ID');
if ($id === null) {
return;
}
$coverage?->stop();
$exportCoverage('cli');
},
);
$app->setDispatcher(new class ($wrappedEventDispatcher) implements EventDispatcherInterface {
public function __construct(private EventDispatcher $wrappedDispatcher)
{
}
public function dispatch(object $event, ?string $eventName = null): object
{
$this->wrappedDispatcher->dispatch($event);
return $event;
}
});
return $app;
},
],
] : [],
],
'entity_manager' => [
'connection' => $buildDbConnection(),
],
2019-01-27 05:14:18 -06:00
'data_fixtures' => [
'paths' => [
2022-02-13 05:20:02 -06:00
// TODO These are used for CLI tests too, so maybe should be somewhere else
2019-01-27 05:14:18 -06:00
__DIR__ . '/../../module/Rest/test-api/Fixtures',
],
],
'logger' => [
2022-06-04 01:59:17 -05:00
'Shlink' => $buildTestLoggerConfig('shlink.log'),
'Access' => $buildTestLoggerConfig('access.log'),
],
];