Skip to content

Commit c787521

Browse files
committed
tests(export): progress
1 parent 0ed9dce commit c787521

File tree

9 files changed

+101
-11
lines changed

9 files changed

+101
-11
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ summary.log
1616
.php-cs-fixer.cache
1717

1818
# Tests
19+
tests/**/assets/
1920
.phpunit.result.cache
2021
tests/.assets/**/*.json
2122

src/Command/ExportCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
7272
});
7373
} catch (Throwable $throwable) {
7474
$style->error([
75-
'An error occurred when exporting tasks',
75+
'An error occurred when exporting tasks:',
7676
$throwable->getMessage(),
7777
]);
7878

src/DependencyInjection/SchedulerBundleExtension.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,9 @@ public function registerExportTools(ContainerBuilder $container): void
993993
$container->setAlias(ExporterRegistryInterface::class, ExporterRegistry::class);
994994

995995
$container->register(CronTabExporter::class, CronTabExporter::class)
996+
->setArguments([
997+
$container->getParameter('kernel.project_dir'),
998+
])
996999
->addTag(self::TASK_EXPORTER_TAG)
9971000
->addTag('container.preload', [
9981001
'class' => CronTabExporter::class,

src/Export/AbstractExporter.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SchedulerBundle\Export;
6+
7+
/**
8+
* @author Guillaume Loulier <[email protected]>
9+
*/
10+
abstract class AbstractExporter implements ExporterInterface
11+
{
12+
private string $projectDir;
13+
14+
public function __construct(string $projectDir)
15+
{
16+
$this->projectDir = $projectDir;
17+
}
18+
19+
protected function getProjectDir(): string
20+
{
21+
return $this->projectDir;
22+
}
23+
}

src/Export/CronTabExporter.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,34 @@
55
namespace SchedulerBundle\Export;
66

77
use SchedulerBundle\Task\TaskInterface;
8-
use function file_exists;
8+
use Symfony\Component\Filesystem\Filesystem;
9+
use function sprintf;
910

1011
/**
1112
* @author Guillaume Loulier <[email protected]>
1213
*/
13-
final class CronTabExporter implements ExporterInterface
14+
final class CronTabExporter extends AbstractExporter
1415
{
16+
/**
17+
* {@inheritdoc}
18+
*/
1519
public function export(string $filename, TaskInterface $task): void
1620
{
17-
if (file_exists($filename)) {
21+
$finalFilename = sprintf('%s/%s', $this->getProjectDir(), $task->getName());
22+
23+
$fs = new Filesystem();
24+
25+
if ($fs->exists($finalFilename)) {
1826
return;
1927
}
28+
29+
$fs->touch($finalFilename);
30+
$fs->dumpFile($finalFilename, sprintf(
31+
'%s cd %s && php bin/console scheduler:execute --name %s',
32+
$task->getExpression(),
33+
$this->getProjectDir(),
34+
$task->getName(),
35+
));
2036
}
2137

2238
/**

tests/DependencyInjection/SchedulerBundleExtensionTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ public function testTransportIsRegistered(): void
465465
$schedulerBundleExtension = new SchedulerBundleExtension();
466466

467467
$containerBuilder = new ContainerBuilder();
468+
$containerBuilder->setParameter('kernel.project_dir', 'foo');
468469
$containerBuilder->register(SerializerInterface::class, SerializerInterface::class);
469470

470471
$schedulerBundleExtension->load([
@@ -1116,7 +1117,8 @@ public function testExportToolsAreRegistered(): void
11161117
self::assertSame(ExporterRegistry::class, $container->getDefinition(ExporterRegistry::class)->getTag('container.preload')[0]['class']);
11171118

11181119
self::assertTrue($container->hasDefinition(CronTabExporter::class));
1119-
self::assertCount(0, $container->getDefinition(CronTabExporter::class)->getArguments());
1120+
self::assertCount(1, $container->getDefinition(CronTabExporter::class)->getArguments());
1121+
self::assertSame('foo', $container->getDefinition(CronTabExporter::class)->getArgument(0));
11201122
self::assertTrue($container->getDefinition(CronTabExporter::class)->hasTag('scheduler.task_exporter'));
11211123
self::assertTrue($container->getDefinition(CronTabExporter::class)->hasTag('container.preload'));
11221124
self::assertSame(CronTabExporter::class, $container->getDefinition(CronTabExporter::class)->getTag('container.preload')[0]['class']);
@@ -2315,6 +2317,7 @@ public function provideDoctrineDsn(): Generator
23152317
private function getContainer(array $configuration = [], Closure $extraDefinitions = null, Closure $extraPasses = null): ContainerBuilder
23162318
{
23172319
$containerBuilder = new ContainerBuilder();
2320+
$containerBuilder->setParameter('kernel.project_dir', 'foo');
23182321
$containerBuilder->registerExtension(new SchedulerBundleExtension());
23192322
$containerBuilder->loadFromExtension('scheduler_bundle', $configuration);
23202323

tests/Export/CronTabExporterTest.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,54 @@
55
namespace Tests\SchedulerBundle\Export;
66

77
use PHPUnit\Framework\TestCase;
8+
use SchedulerBundle\Export\CronTabExporter;
9+
use SchedulerBundle\Task\NullTask;
10+
use function file_get_contents;
11+
use function sprintf;
12+
use function unlink;
813

914
/**
1015
* @author Guillaume Loulier <[email protected]>
1116
*/
1217
final class CronTabExporterTest extends TestCase
1318
{
19+
public function testExporterSupport(): void
20+
{
21+
$exporter = new CronTabExporter(__DIR__);
22+
23+
self::assertFalse($exporter->support('cli'));
24+
self::assertTrue($exporter->support('crontab'));
25+
}
26+
27+
public function testExporterCannotExportExistingFile(): void
28+
{
29+
$exporter = new CronTabExporter(__DIR__.'/assets');
30+
31+
self::assertFileExists(sprintf('%s/assets/foo', __DIR__));
32+
33+
$exporter->export('foo', new NullTask('foo'));
34+
35+
self::assertFileExists(sprintf('%s/assets/foo', __DIR__));
36+
}
37+
38+
public function testExporterCanExportUndefinedFile(): void
39+
{
40+
unlink(__DIR__.'/assets/bar');
41+
42+
$task = new NullTask('bar');
43+
44+
$exporter = new CronTabExporter(__DIR__.'/assets');
45+
46+
self::assertFileDoesNotExist(sprintf('%s/bar', __DIR__.'/assets'));
47+
48+
$exporter->export('bar', $task);
49+
50+
self::assertFileExists(sprintf('%s/bar', __DIR__.'/assets'));
51+
self::assertSame(sprintf(
52+
'%s cd %s && php bin/console scheduler:execute --name %s',
53+
$task->getExpression(),
54+
__DIR__.'/assets',
55+
$task->getName(),
56+
), file_get_contents(__DIR__.'/assets/bar'));
57+
}
1458
}

tests/Export/ExporterRegistryTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function testRegistryCanReturnEmptyExporterList(): void
2525
public function testRegistryCanFilterExporterList(): void
2626
{
2727
$registry = new ExporterRegistry([
28-
new CronTabExporter(),
28+
new CronTabExporter(__DIR__),
2929
]);
3030

3131
$registry->filter(static fn (ExporterInterface $exporter): bool => $exporter instanceof CronTabExporter);
@@ -35,7 +35,7 @@ public function testRegistryCanFilterExporterList(): void
3535
public function testRegistryCannotFindExporterWithEmptyList(): void
3636
{
3737
$registry = new ExporterRegistry([
38-
new CronTabExporter(),
38+
new CronTabExporter(__DIR__),
3939
]);
4040

4141
self::expectException(InvalidArgumentException::class);
@@ -47,8 +47,8 @@ public function testRegistryCannotFindExporterWithEmptyList(): void
4747
public function testRegistryCannotFindExporterWithMultipleSupportingExporter(): void
4848
{
4949
$registry = new ExporterRegistry([
50-
new CronTabExporter(),
51-
new CronTabExporter(),
50+
new CronTabExporter(__DIR__),
51+
new CronTabExporter(__DIR__),
5252
]);
5353

5454
self::expectException(InvalidArgumentException::class);
@@ -60,7 +60,7 @@ public function testRegistryCannotFindExporterWithMultipleSupportingExporter():
6060
public function testRegistryCanFindExporter(): void
6161
{
6262
$registry = new ExporterRegistry([
63-
new CronTabExporter(),
63+
new CronTabExporter(__DIR__),
6464
]);
6565

6666
$exporter = $registry->find('crontab');
@@ -70,7 +70,7 @@ public function testRegistryCanFindExporter(): void
7070
public function testRegistryCanReturnCurrentExporter(): void
7171
{
7272
$registry = new ExporterRegistry([
73-
new CronTabExporter(),
73+
new CronTabExporter(__DIR__),
7474
]);
7575

7676
$exporter = $registry->current();

tests/Export/assets/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)