Skip to content

Commit e36b840

Browse files
committed
tests(export): progress
1 parent 8a2aec0 commit e36b840

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
@@ -13,4 +13,5 @@ summary.log
1313
.php-cs-fixer.cache
1414

1515
# Tests
16+
tests/**/assets/
1617
.phpunit.result.cache

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
@@ -875,6 +875,9 @@ public function registerExportTools(ContainerBuilder $container): void
875875
$container->setAlias(ExporterRegistryInterface::class, ExporterRegistry::class);
876876

877877
$container->register(CronTabExporter::class, CronTabExporter::class)
878+
->setArguments([
879+
$container->getParameter('kernel.project_dir'),
880+
])
878881
->addTag(self::TASK_EXPORTER_TAG)
879882
->addTag('container.preload', [
880883
'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
@@ -389,6 +389,7 @@ public function testTransportIsRegistered(): void
389389
$schedulerBundleExtension = new SchedulerBundleExtension();
390390

391391
$containerBuilder = new ContainerBuilder();
392+
$containerBuilder->setParameter('kernel.project_dir', 'foo');
392393
$containerBuilder->register(SerializerInterface::class, SerializerInterface::class);
393394

394395
$schedulerBundleExtension->load([
@@ -944,7 +945,8 @@ public function testExportToolsAreRegistered(): void
944945
self::assertSame(ExporterRegistry::class, $container->getDefinition(ExporterRegistry::class)->getTag('container.preload')[0]['class']);
945946

946947
self::assertTrue($container->hasDefinition(CronTabExporter::class));
947-
self::assertCount(0, $container->getDefinition(CronTabExporter::class)->getArguments());
948+
self::assertCount(1, $container->getDefinition(CronTabExporter::class)->getArguments());
949+
self::assertSame('foo', $container->getDefinition(CronTabExporter::class)->getArgument(0));
948950
self::assertTrue($container->getDefinition(CronTabExporter::class)->hasTag('scheduler.task_exporter'));
949951
self::assertTrue($container->getDefinition(CronTabExporter::class)->hasTag('container.preload'));
950952
self::assertSame(CronTabExporter::class, $container->getDefinition(CronTabExporter::class)->getTag('container.preload')[0]['class']);
@@ -1805,6 +1807,7 @@ public function provideDoctrineDsn(): Generator
18051807
private function getContainer(array $configuration = []): ContainerBuilder
18061808
{
18071809
$containerBuilder = new ContainerBuilder();
1810+
$containerBuilder->setParameter('kernel.project_dir', 'foo');
18081811
$containerBuilder->registerExtension(new SchedulerBundleExtension());
18091812
$containerBuilder->loadFromExtension('scheduler_bundle', $configuration);
18101813

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)