Skip to content

Commit

Permalink
Make sure optional tools are optional
Browse files Browse the repository at this point in the history
Fixes an issue where local storage dependencies were declared in the config provider for custom type api usage but required during general build operations.
Adds test to make sure all deps can be loaded with various config provider combinations and moves dependency config to the correct provider
  • Loading branch information
gsteel committed Sep 2, 2021
1 parent 8b6308c commit c3ebde8
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 9 deletions.
1 change: 1 addition & 0 deletions src/ConfigProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ private function dependencies(): array
return [
'factories' => [
Console\BuildCommand::class => Console\Container\BuildCommandFactory::class,
Type\LocalPersistence::class => Type\Container\LocalPersistenceFactory::class,
BuildConfig::class => Container\BuildConfigFactory::class,
],
];
Expand Down
1 change: 0 additions & 1 deletion src/CustomTypeApiConfigProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ private function dependencies(): array
Console\DownloadCommand::class => Console\Container\DownloadCommandFactory::class,
Console\UploadCommand::class => Console\Container\UploadCommandFactory::class,

Type\LocalPersistence::class => Type\Container\LocalPersistenceFactory::class,
Type\RemotePersistence::class => Type\Container\RemotePersistenceFactory::class,

DiffTool::class => Container\DiffToolFactory::class,
Expand Down
76 changes: 68 additions & 8 deletions test/Integration/ServiceManagerIntegrationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Primo\Cli\ApiToolsConfigProvider;
use Primo\Cli\ConfigProvider;
use Primo\Cli\CustomTypeApiConfigProvider;
use Psr\Container\ContainerInterface;

use function array_keys;

Expand Down Expand Up @@ -48,7 +49,7 @@ private function validConfig(): array
}

/** @return array<string, mixed> */
private function mergedConfig(): array
private function kitchenSinkConfig(): array
{
$aggregator = new ConfigAggregator([
ConfigProvider::class,
Expand All @@ -60,19 +61,46 @@ private function mergedConfig(): array
return $aggregator->getMergedConfig();
}

private function serviceManager(): ServiceManager
/** @return array<string, mixed> */
private function generalPlusApiConfig(): array
{
$aggregator = new ConfigAggregator([
ConfigProvider::class,
ApiToolsConfigProvider::class,
new ArrayProvider($this->validConfig()),
]);

return $aggregator->getMergedConfig();
}

/** @return array<string, mixed> */
private function buildOnlyConfig(): array
{
$aggregator = new ConfigAggregator([
ConfigProvider::class,
new ArrayProvider($this->validConfig()),
]);

return $aggregator->getMergedConfig();
}

/** @param array<string, mixed> $config */
private function serviceManager(array $config): ContainerInterface
{
$config = $this->mergedConfig();
$dependencies = $config['dependencies'];
$dependencies['services']['config'] = $config;

return new ServiceManager($dependencies);
}

/** @return Generator<class-string, array{0: class-string, 1: ServiceManager}> */
public function serviceDataProvider(): Generator
/**
* @param array<string, mixed> $config
*
* @return Generator<class-string, array{0: class-string, 1: ServiceManager}>
*/
private function factoryGenerator(array $config): Generator
{
$container = $this->serviceManager();
$container = $this->serviceManager($config);
self::assertTrue($container->has('config'));
$config = $container->get('config');
$factories = $config['dependencies']['factories'] ?? null;
Expand All @@ -84,8 +112,40 @@ public function serviceDataProvider(): Generator
}
}

/** @dataProvider serviceDataProvider */
public function testThatConfigProvidersCanProduceAllRequiredDependenciesGivenValidConfig(string $serviceId, ServiceManager $container): void
/** @return Generator<class-string, array{0: class-string, 1: ServiceManager}> */
public function kitchenSinkDataProvider(): Generator
{
return $this->factoryGenerator($this->kitchenSinkConfig());
}

/** @dataProvider kitchenSinkDataProvider */
public function testThatConfigProvidersCanProduceAllRequiredDependenciesGivenValidConfig(string $serviceId, ContainerInterface $container): void
{
self::assertTrue($container->has($serviceId));
self::assertIsObject($container->get($serviceId));
}

/** @return Generator<class-string, array{0: class-string, 1: ServiceManager}> */
public function generalUsageDataProvider(): Generator
{
return $this->factoryGenerator($this->generalPlusApiConfig());
}

/** @dataProvider generalUsageDataProvider */
public function testGeneralUsage(string $serviceId, ContainerInterface $container): void
{
self::assertTrue($container->has($serviceId));
self::assertIsObject($container->get($serviceId));
}

/** @return Generator<class-string, array{0: class-string, 1: ServiceManager}> */
public function buildOnlyDataProvider(): Generator
{
return $this->factoryGenerator($this->buildOnlyConfig());
}

/** @dataProvider buildOnlyDataProvider */
public function testBuildOnlyUsage(string $serviceId, ContainerInterface $container): void
{
self::assertTrue($container->has($serviceId));
self::assertIsObject($container->get($serviceId));
Expand Down

0 comments on commit c3ebde8

Please sign in to comment.