Skip to content

Commit 322570d

Browse files
xviloakondas
andauthored
Feature: Synchronise all packages command (#536)
* Add the SynchronizeAllPackages Command * Add tests Co-authored-by: Arkadiusz Kondas <[email protected]>
1 parent 0de28d9 commit 322570d

File tree

2 files changed

+148
-0
lines changed

2 files changed

+148
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Buddy\Repman\Command;
6+
7+
use Buddy\Repman\Entity\Organization;
8+
use Buddy\Repman\Message\Organization\SynchronizePackage;
9+
use Buddy\Repman\Repository\OrganizationRepository;
10+
use Symfony\Component\Console\Command\Command;
11+
use Symfony\Component\Console\Input\InputArgument;
12+
use Symfony\Component\Console\Input\InputInterface;
13+
use Symfony\Component\Console\Output\OutputInterface;
14+
use Symfony\Component\Messenger\MessageBusInterface;
15+
16+
final class SynchronizeAllPackagesCommand extends Command
17+
{
18+
protected static $defaultName = 'repman:package:synchronize-all';
19+
20+
private MessageBusInterface $bus;
21+
22+
private OrganizationRepository $organizations;
23+
24+
public function __construct(MessageBusInterface $bus, OrganizationRepository $organizations)
25+
{
26+
$this->bus = $bus;
27+
$this->organizations = $organizations;
28+
29+
parent::__construct();
30+
}
31+
32+
/**
33+
* @return void
34+
*/
35+
protected function configure()
36+
{
37+
$this
38+
->setDescription('Synchronize all packages')
39+
->addArgument('organization', InputArgument::OPTIONAL, 'Organization alias')
40+
;
41+
}
42+
43+
protected function execute(InputInterface $input, OutputInterface $output)
44+
{
45+
$organizations = $this->getOrganizationsToSync($input->getArgument('organization'));
46+
$output->writeln(sprintf('Synchronizing packages of %d organizations.', count($organizations)));
47+
48+
foreach ($organizations as $organization) {
49+
$output->writeln(sprintf('Synchronizing packages for %s.', $organization->name()));
50+
51+
foreach ($organization->synchronizedPackages() as $package) {
52+
$output->writeln(sprintf('- %s.', $package->name()));
53+
$this->bus->dispatch(new SynchronizePackage($package->id()->toString()));
54+
}
55+
}
56+
57+
return 0;
58+
}
59+
60+
/**
61+
* @return Organization[]
62+
*/
63+
protected function getOrganizationsToSync(?string $organizationAlias): array
64+
{
65+
if ($organizationAlias === null) {
66+
return $this->organizations->findAll();
67+
}
68+
69+
$organization = $this->organizations->findOneBy(['alias' => $organizationAlias]);
70+
71+
if (!$organization instanceof Organization) {
72+
throw new \InvalidArgumentException(sprintf('Organization with alias %s not found.', $organizationAlias));
73+
}
74+
75+
return [$organization];
76+
}
77+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Buddy\Repman\Tests\Functional\Command;
6+
7+
use Buddy\Repman\Command\SynchronizeAllPackagesCommand;
8+
use Buddy\Repman\Message\Security\ScanPackage;
9+
use Buddy\Repman\Tests\Functional\FunctionalTestCase;
10+
use Symfony\Component\Console\Tester\CommandTester;
11+
use Symfony\Component\Messenger\Transport\InMemoryTransport;
12+
13+
final class SynchronizeAllPackagesCommandTest extends FunctionalTestCase
14+
{
15+
private string $buddyId;
16+
17+
protected function setUp(): void
18+
{
19+
parent::setUp();
20+
21+
$userId = $this->createAndLoginAdmin();
22+
$this->buddyId = $this->fixtures->createOrganization('buddy', $userId);
23+
24+
$packageId = $this->fixtures->addPackage($this->buddyId, 'https://buddy.com');
25+
$this->fixtures->syncPackageWithData($packageId, 'buddy-works/buddy', 'Test', '1.1.1', new \DateTimeImmutable());
26+
}
27+
28+
public function testSynchronizeAllSuccess(): void
29+
{
30+
/** @var InMemoryTransport $transport */
31+
$transport = $this->container()->get('messenger.transport.async');
32+
$transport->reset();
33+
34+
$commandTester = new CommandTester($this->container()->get(SynchronizeAllPackagesCommand::class));
35+
$result = $commandTester->execute([]);
36+
37+
self::assertCount(1, $transport->getSent());
38+
self::assertInstanceOf(ScanPackage::class, $transport->getSent()[0]->getMessage());
39+
self::assertEquals($result, 0);
40+
}
41+
42+
public function testSynchronizeAllOrganizationSuccess(): void
43+
{
44+
$alias = 'buddy';
45+
/** @var InMemoryTransport $transport */
46+
$transport = $this->container()->get('messenger.transport.async');
47+
$transport->reset();
48+
49+
$commandTester = new CommandTester($this->container()->get(SynchronizeAllPackagesCommand::class));
50+
$result = $commandTester->execute(['organization' => $alias]);
51+
52+
self::assertCount(1, $transport->getSent());
53+
self::assertInstanceOf(ScanPackage::class, $transport->getSent()[0]->getMessage());
54+
self::assertEquals($result, 0);
55+
}
56+
57+
public function testSynchronizeAllOrganizationFailure(): void
58+
{
59+
$alias = 'non-existing-alias';
60+
61+
$this->expectException(\InvalidArgumentException::class);
62+
$this->expectExceptionMessage(sprintf('Organization with alias %s not found.', $alias));
63+
64+
/** @var InMemoryTransport $transport */
65+
$transport = $this->container()->get('messenger.transport.async');
66+
$transport->reset();
67+
68+
$commandTester = new CommandTester($this->container()->get(SynchronizeAllPackagesCommand::class));
69+
$commandTester->execute(['organization' => $alias]);
70+
}
71+
}

0 commit comments

Comments
 (0)