Skip to content

Commit 6ddbd70

Browse files
authored
Add functional tests (#6)
1 parent 7177482 commit 6ddbd70

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+614
-185
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ jobs:
1717
matrix:
1818
php-versions: [ '8.1', '8.2', '8.3' ]
1919
composer-flags: [ '', '--prefer-lowest' ]
20-
exclude:
21-
- php-versions: 8.3
22-
composer-flags: ''
2320
steps:
2421
- uses: actions/checkout@v4
2522

@@ -33,7 +30,7 @@ jobs:
3330
run: composer validate
3431

3532
- name: Install dependencies
36-
run: composer update --prefer-dist --no-progress --no-suggest --prefer-stable ${{ matrix.composer-flags }}
33+
run: composer update --prefer-dist --no-progress --prefer-stable ${{ matrix.composer-flags }}
3734

3835
- name: Run test suite
3936
run: composer test
@@ -51,7 +48,7 @@ jobs:
5148
coverage: pcov
5249

5350
- name: Install dependencies
54-
run: composer update --prefer-dist --no-progress --no-suggest --prefer-stable
51+
run: composer update --prefer-dist --no-progress --prefer-stable
5552

5653
- name: Run test suite
5754
run: php -dpcov.enabled=1 -dpcov.exclude="~vendor~" vendor/bin/phpunit --testsuite unit,integration --coverage-clover ./.coverage/coverage.xml

.gitignore

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/.idea
2-
/vendor
3-
/composer.lock
4-
/phpunit.xml
52
/.phpunit.result.cache
3+
/composer.lock
64
/dev/public/bundles
75
/dev/var
6+
/phpunit.xml
7+
/tests/.kernel
8+
/vendor

composer.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
"require": {
2929
"php": ">=8.1",
3030
"ext-json": "*",
31-
"symfony/asset": "^6.0||^7.0",
31+
"psr/clock": "^1.0",
3232
"symfony/config": "^6.0||^7.0",
3333
"symfony/dependency-injection": "^6.0||^7.0",
34+
"symfony/filesystem": "^6.0||^7.0",
3435
"symfony/finder": "^6.0||^7.0",
3536
"symfony/framework-bundle": "^6.0||^7.0",
36-
"symfony/filesystem": "^6.0||^7.0",
3737
"symfony/http-foundation": "^6.0||^7.0",
3838
"symfony/http-kernel": "^6.0||^7.0",
3939
"symfony/routing": "^6.0||^7.0",
@@ -58,7 +58,7 @@
5858
"symfony/css-selector": "^6.0||^7.0",
5959
"symfony/monolog-bridge": "^6.0||^7.0",
6060
"symfony/monolog-bundle": "^3.10",
61-
"symfony/phpunit-bridge": "^6.0||^7.0",
61+
"symfony/phpunit-bridge": "^6.4||^7.0",
6262
"symfony/runtime": "^6.0||^7.0",
6363
"symfony/templating": "^6.0||^7.0",
6464
"symfony/twig-bundle": "^6.0||^7.0",

dev/config/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ web_profiler:
2424
intercept_redirects: false
2525

2626
twig:
27+
debug: false
2728
strict_variables: true
2829

2930
monolog:

docs/configuration.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ fd_log_viewer:
2121
start_of_line_pattern: '/^\[\d{4}-\d{2}-\d{2}[^]]*]\s+\S+\.\S+:/'
2222
log_message_pattern: '/^\[(?P<date>[^\]]+)\]\s+(?P<channel>[^\.]+)\.(?P<severity>[^:]+):\s+(?P<message>.*)\s+(?P<context>[[{].*?[\]}])\s+(?P<extra>[[{].*?[\]}])\s+$/s'
2323
date_format: "Y-m-d H:i:s"
24+
enable_default_monolog: true
2425
```
2526
2627
## Configuration reference
@@ -112,3 +113,8 @@ If you use a custom monolog format, adjust this pattern to your needs.
112113
### log_files.date_format <small>`string`</small>
113114

114115
This is the date format that will be used to format the date in frontend. Default: `Y-m-d H:i:s`
116+
117+
118+
### enable_default_monolog <small>`boolean`</small>
119+
120+
Should the default monolog configuration be enabled? Default: `true`

phpunit.xml.dist

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@
1111
beStrictAboutTodoAnnotatedTests="true"
1212
executionOrder="defects"
1313
>
14+
<php>
15+
<env name="KERNEL_CLASS" value="FD\LogViewer\Tests\Utility\TestKernel"/>
16+
</php>
1417
<testsuites>
18+
<testsuite name="functional">
19+
<directory>tests/Functional</directory>
20+
</testsuite>
1521
<testsuite name="integration">
1622
<directory>tests/Integration</directory>
1723
</testsuite>

src/Controller/IndexController.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
use FD\LogViewer\Entity\Output\DirectionEnum;
77
use FD\LogViewer\Routing\RouteService;
88
use FD\LogViewer\Service\Folder\LogFolderOutputProvider;
9+
use FD\LogViewer\Service\JsonManifestAssetLoader;
910
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1011
use Symfony\Component\HttpFoundation\Response;
1112
use Throwable;
1213

1314
class IndexController extends AbstractController
1415
{
1516
public function __construct(
17+
private readonly JsonManifestAssetLoader $assetLoader,
1618
private readonly RouteService $routeService,
1719
private readonly LogFolderOutputProvider $folderOutputProvider
1820
) {
@@ -29,6 +31,16 @@ public function __invoke(): Response
2931
// retrieve all log files and folders
3032
$folders = $this->folderOutputProvider->provide(DirectionEnum::Desc);
3133

32-
return $this->render('@FdLogViewer/index.html.twig', ['base_uri' => $baseUri, 'folders' => $folders]);
34+
return $this->render(
35+
'@FdLogViewer/index.html.twig',
36+
[
37+
'base_uri' => $baseUri,
38+
'folders' => $folders,
39+
'assets' => [
40+
'style' => $this->assetLoader->getUrl('style.css'),
41+
'js' => $this->assetLoader->getUrl('src/main.ts')
42+
],
43+
]
44+
);
3345
}
3446
}

src/DependencyInjection/Configuration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public function getConfigTreeBuilder(): TreeBuilder
2121
$rootNode = $tree->getRootNode();
2222

2323
$rootNode->children()
24+
->scalarNode('enable_default_monolog')
25+
->info('Enable default monolog configuration')
26+
->defaultTrue()
27+
->end()
2428
->arrayNode('log_files')
2529
->info('List of log files to show')
2630
->useAttributeAsKey('log_name')
@@ -62,6 +66,7 @@ public function getConfigTreeBuilder(): TreeBuilder
6266
->end()
6367
->end();
6468

69+
6570
return $tree;
6671
}
6772
}

src/DependencyInjection/Extension.php

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55

66
use FD\LogViewer\Entity\Config\FinderConfig;
77
use FD\LogViewer\Entity\Config\LogFilesConfig;
8-
use FD\LogViewer\Service\JsonManifestVersionStrategy;
98
use Symfony\Component\Config\FileLocator;
109
use Symfony\Component\DependencyInjection\ContainerBuilder;
1110
use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension;
12-
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
1311
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
1412
use Symfony\Component\DependencyInjection\Reference;
1513
use Throwable;
@@ -18,7 +16,7 @@
1816
* @codeCoverageIgnore
1917
* @internal
2018
*/
21-
final class Extension extends BaseExtension implements PrependExtensionInterface
19+
final class Extension extends BaseExtension
2220
{
2321
/**
2422
* @inheritDoc
@@ -32,19 +30,8 @@ public function load(array $configs, ContainerBuilder $container): void
3230
$mergedConfigs = $this->processConfiguration(new Configuration(), $configs);
3331

3432
// add defaults
35-
if (count($mergedConfigs['log_files']) === 0) {
36-
$mergedConfigs['log_files']['monolog'] = [
37-
'type' => 'monolog',
38-
'name' => 'Monolog',
39-
'finder' => [
40-
'in' => '%kernel.logs_dir%',
41-
'name' => '*.log',
42-
'ignoreUnreadableDirs' => true,
43-
'followLinks' => false
44-
],
45-
'downloadable' => false,
46-
'deletable' => false,
47-
];
33+
if ($mergedConfigs['enable_default_monolog']) {
34+
$mergedConfigs = self::addMonologDefault($mergedConfigs);
4835
}
4936

5037
foreach ($mergedConfigs['log_files'] as $key => $config) {
@@ -76,22 +63,25 @@ public function getAlias(): string
7663
}
7764

7865
/**
79-
* @inheritdoc
66+
* @template T of array
67+
* @phpstan-param T $configs
68+
*
69+
* @phpstan-return T
8070
*/
81-
public function prepend(ContainerBuilder $container): void
71+
private static function addMonologDefault(array $configs): array
8272
{
83-
$container->prependExtensionConfig(
84-
'framework',
85-
[
86-
'assets' => [
87-
'enabled' => true,
88-
'packages' => [
89-
'fd_symfony_log_viewer' => [
90-
'version_strategy' => JsonManifestVersionStrategy::class
91-
],
92-
],
93-
],
94-
]
95-
);
73+
// monolog
74+
$configs['log_files']['monolog']['type'] ??= 'monolog';
75+
$configs['log_files']['monolog']['name'] ??= 'Monolog';
76+
$configs['log_files']['monolog']['downloadable'] ??= false;
77+
$configs['log_files']['monolog']['deletable'] ??= false;
78+
79+
// finder
80+
$configs['log_files']['monolog']['finder']['in'] ??= '%kernel.logs_dir%';
81+
$configs['log_files']['monolog']['finder']['name'] ??= '*.log';
82+
$configs['log_files']['monolog']['finder']['ignoreUnreadableDirs'] ??= true;
83+
$configs['log_files']['monolog']['finder']['followLinks'] ??= false;
84+
85+
return $configs;
9686
}
9787
}

src/Entity/TempFile.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use RuntimeException;
77
use SplFileInfo;
88

9+
use function register_shutdown_function;
910
use function sys_get_temp_dir;
1011
use function tempnam;
1112
use function unlink;
@@ -21,9 +22,12 @@ public function __construct()
2122
// @codeCoverageIgnoreEnd
2223
}
2324
parent::__construct($path);
25+
26+
// cleanup temp file when script ends (and not when object lifecycle ends)
27+
register_shutdown_function(fn() => $this->destruct());
2428
}
2529

26-
public function __destruct()
30+
public function destruct(): void
2731
{
2832
if ($this->isFile()) {
2933
@unlink($this->getPathname());

0 commit comments

Comments
 (0)