Add this script to composer.json: "scripts": { "pre-update-cmd": "ExpressiveInstaller\\OptionalPackages::install", "pre-install-cmd": "ExpressiveInstaller\\OptionalPackages::install" },
 public function testRequestMinimalInstallIsFalse()
 {
     $io = $this->prophesize('Composer\\IO\\IOInterface');
     $io->ask(Argument::any(), Argument::any())->willReturn('n');
     $answer = OptionalPackages::requestMinimal($io->reveal());
     $this->assertFalse($answer);
 }
 /**
  * @dataProvider templateRendererProvider
  */
 public function testTemplateRenderer($containerOption, $routerOption, $templateRendererOption, $copyFilesKey, $expectedResponseStatusCode, $expectedTemplateRenderer)
 {
     $io = $this->prophesize('Composer\\IO\\IOInterface');
     $config = $this->getConfig();
     // Install container
     $containerResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['container'], $containerOption, $copyFilesKey);
     $this->assertTrue($containerResult);
     // Install router
     $routerResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['router'], $routerOption, $copyFilesKey);
     $this->assertTrue($routerResult);
     // Install template engine
     $templateEngineResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['template-engine'], $templateRendererOption, $copyFilesKey);
     $this->assertTrue($templateEngineResult);
     // Test container
     $container = $this->getContainer();
     $this->assertTrue($container->has(Expressive\Application::class));
     $this->assertTrue($container->has('Zend\\Expressive\\FinalHandler'));
     // Test config
     $config = $container->get('config');
     $this->assertEquals(Expressive\Container\TemplatedErrorHandlerFactory::class, $config['dependencies']['factories']['Zend\\Expressive\\FinalHandler']);
     // Test template renderer
     $templateRenderer = $container->get(Expressive\Template\TemplateRendererInterface::class);
     $this->assertInstanceOf(Expressive\Template\TemplateRendererInterface::class, $templateRenderer);
     $this->assertInstanceOf($expectedTemplateRenderer, $templateRenderer);
     if ($copyFilesKey == 'copy-files') {
         // Test home page for full install only, otherwise you get invalid template name errors
         $response = $this->getAppResponse();
         $this->assertEquals($expectedResponseStatusCode, $response->getStatusCode());
     }
 }
 public function testDevDependenciesAreRemoved()
 {
     // Prepare the installer
     OptionalPackages::removeDevDependencies();
     $this->assertComposerHasPackages($this->standardDependencies);
     $this->assertComposerNotHasPackages($this->devDependencies);
 }
 public function testRemoveLastLine()
 {
     $string = "foo\nbar\nbaz\nqux\nquux";
     $actual = OptionalPackages::removeLinesContainingStrings(['quux'], $string);
     $expected = "foo\nbar\nbaz\nqux\n";
     $this->assertEquals($expected, $actual);
 }
 /**
  * @dataProvider packageProvider
  */
 public function testAddPackage($packageName, $packageVersion, $expectedStability)
 {
     // Prepare the installer
     OptionalPackages::removeDevDependencies();
     $io = $this->prophesize('Composer\\IO\\IOInterface');
     $io->write(Argument::containingString('Adding package'))->shouldBeCalled();
     OptionalPackages::addPackage($io->reveal(), $packageName, $packageVersion);
     $this->assertComposerHasPackages(['zendframework/zend-stdlib']);
     $stabilityFlags = $this->getStabilityFlags();
     // Stability flags are only set for non-stable packages
     if ($expectedStability) {
         $this->assertArrayHasKey($packageName, $stabilityFlags);
         $this->assertEquals($expectedStability, $stabilityFlags[$packageName]);
     }
 }
 public function testAnsweredWithPackage()
 {
     // Prepare the installer
     OptionalPackages::removeDevDependencies();
     $io = $this->prophesize('Composer\\IO\\IOInterface');
     $io->write(Argument::containingString('Adding package <info>league/container</info>'))->shouldBeCalled();
     $io->write(Argument::containingString('<warning>You need to edit public/index.php'))->shouldBeCalled();
     $config = $this->getConfig();
     $question = $config['questions']['container'];
     $answer = 'league/container:2.2.0';
     $copyFilesKey = 'minimal-files';
     $result = OptionalPackages::processAnswer($io->reveal(), $question, $answer, $copyFilesKey);
     $this->assertTrue($result);
     $this->assertFileNotExists($this->getProjectRoot() . '/config/container.php');
     $this->assertComposerHasPackages(['league/container']);
 }
 /**
  * @dataProvider errorHandlerProvider
  */
 public function testErrorHandler($containerOption, $errorHandlerOption, $copyFilesKey, $expectedErrorHandler)
 {
     $io = $this->prophesize('Composer\\IO\\IOInterface');
     $config = $this->getConfig();
     // Install container
     $containerResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['container'], $containerOption, $copyFilesKey);
     $this->assertTrue($containerResult);
     // Install error handler
     $containerResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['error-handler'], $errorHandlerOption, $copyFilesKey);
     $this->assertTrue($containerResult);
     // Test container
     $container = $this->getContainer();
     $this->assertTrue($container->has('Zend\\Expressive\\FinalHandler'));
     $config = $container->get('config');
     $this->assertEquals($expectedErrorHandler, $config['dependencies']['factories']['Zend\\Expressive\\FinalHandler']);
 }
 public function installPackage($config, $copyFilesKey)
 {
     /* TODO: First we need to set $composerDefinition, $composerRequires, $composerDevRequires and $stabilityFlags;
        // Add packages to install
        if (isset($config['packages'])) {
            foreach ($config['packages'] as $packageName) {
                OptionalPackages::addPackage($this->io, $packageName, $this->config['packages'][$packageName]);
            }
        }*/
     // Copy files
     if (isset($config[$copyFilesKey])) {
         foreach ($config[$copyFilesKey] as $source => $target) {
             OptionalPackages::copyFile($this->io->reveal(), $this->projectRoot, $source, $target);
         }
     }
 }
 public function testInstallerDataIsRemoved()
 {
     // Mimic answered question
     $refDefinition = new ReflectionProperty(OptionalPackages::class, 'composerDefinition');
     $refDefinition->setAccessible(true);
     $definition = $refDefinition->getValue();
     $definition['extra']['optional-packages']['router'] = 3;
     $refDefinition->setValue($definition);
     // Test if the value is stored
     $definition = $this->getComposerDefinition();
     $this->assertTrue(isset($definition['extra']['optional-packages']));
     // Remove the installer
     OptionalPackages::removeInstallerFromDefinition();
     // Test if the value is removed
     $definition = $this->getComposerDefinition();
     $this->assertFalse(isset($definition['extra']['optional-packages']));
     $this->assertFalse(isset($definition['extra']));
 }
 /**
  * @dataProvider routerProvider
  */
 public function testRouter($containerOption, $routerOption, $copyFilesKey, $expectedResponseStatusCode, $expectedRoutes, $expectedRouter)
 {
     $io = $this->prophesize('Composer\\IO\\IOInterface');
     $config = $this->getConfig();
     // Install container
     $containerResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['container'], $containerOption, $copyFilesKey);
     $this->assertTrue($containerResult);
     // Install router
     $routerResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['router'], $routerOption, $copyFilesKey);
     $this->assertTrue($routerResult);
     // Test container
     $container = $this->getContainer();
     $this->assertTrue($container->has(Router\RouterInterface::class));
     // Test config
     $config = $container->get('config');
     $this->assertEquals($expectedRouter, $config['dependencies']['invokables'][Router\RouterInterface::class]);
     $this->assertEquals($expectedRoutes, $config['routes']);
     // Test home page
     $response = $this->getAppResponse();
     $this->assertEquals($expectedResponseStatusCode, $response->getStatusCode());
 }
 /**
  * @dataProvider containerProvider
  */
 public function testContainer($containerOption, $routerOption, $copyFilesKey, $expectedResponseStatusCode, $expectedContainer)
 {
     $io = $this->prophesize('Composer\\IO\\IOInterface');
     $config = $this->getConfig();
     // Install container
     $containerResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['container'], $containerOption, $copyFilesKey);
     $this->assertTrue($containerResult);
     // Install router
     $routerResult = OptionalPackages::processAnswer($io->reveal(), $config['questions']['router'], $routerOption, $copyFilesKey);
     $this->assertTrue($routerResult);
     // Test container
     $container = $this->getContainer();
     $this->assertInstanceOf(ContainerInterface::class, $container);
     $this->assertInstanceOf($expectedContainer, $container);
     $this->assertTrue($container->has(Expressive\Helper\UrlHelper::class));
     $this->assertTrue($container->has(Expressive\Helper\ServerUrlHelper::class));
     $this->assertTrue($container->has(Expressive\Application::class));
     $this->assertTrue($container->has(Expressive\Router\RouterInterface::class));
     // Test home page
     $response = $this->getAppResponse();
     $this->assertEquals($expectedResponseStatusCode, $response->getStatusCode());
 }