io = $this->prophesize('Composer\IO\IOInterface'); $this->processor = new Processor($this->io->reveal()); } protected function tearDown() { parent::tearDown(); foreach ($this->environmentBackup as $var => $value) { if (false === $value) { putenv($var); } else { putenv($var.'='.$value); } } } /** * @dataProvider provideInvalidConfiguration */ public function testInvalidConfiguration(array $config, $exceptionMessage) { chdir(__DIR__); if (method_exists($this, 'expectException')) { $this->expectException('InvalidArgumentException'); $this->expectExceptionMessage($exceptionMessage); } else { $this->setExpectedException('InvalidArgumentException', $exceptionMessage); } $this->processor->processFile($config); } public function provideInvalidConfiguration() { return array( 'no file' => array( array(), 'The extra.incenteev-parameters.file setting is required to use this script handler.', ), 'missing default dist file' => array( array( 'file' => 'fixtures/invalid/missing.yml', ), 'The dist file "fixtures/invalid/missing.yml.dist" does not exist. Check your dist-file config or create it.', ), 'missing custom dist file' => array( array( 'file' => 'fixtures/invalid/missing.yml', 'dist-file' => 'fixtures/invalid/non-existent.dist.yml', ), 'The dist file "fixtures/invalid/non-existent.dist.yml" does not exist. Check your dist-file config or create it.', ), 'missing top level key in dist file' => array( array( 'file' => 'fixtures/invalid/missing_top_level.yml', ), 'The top-level key parameters is missing.', ), 'invalid values in the existing file' => array( array( 'file' => 'fixtures/invalid/invalid_existing_values.yml', ), 'The existing "fixtures/invalid/invalid_existing_values.yml" file does not contain an array', ), ); } /** * @dataProvider provideParameterHandlingTestCases */ public function testParameterHandling($testCaseName) { $dataDir = __DIR__.'/fixtures/testcases/'.$testCaseName; $testCase = array_replace_recursive( array( 'title' => 'unknown test', 'config' => array( 'file' => 'parameters.yml', ), 'dist-file' => 'parameters.yml.dist', 'environment' => array(), 'interactive' => false, ), (array) Yaml::parse(file_get_contents($dataDir.'/setup.yml')) ); $workingDir = sys_get_temp_dir() . '/incenteev_parameter_handler'; $exists = $this->initializeTestCase($testCase, $dataDir, $workingDir); $message = sprintf('%s the "%s" file', $exists ? 'Updating' : 'Creating', $testCase['config']['file']); $this->io->write($message)->shouldBeCalled(); $this->setInteractionExpectations($testCase); $this->processor->processFile($testCase['config']); $this->assertFileEquals($dataDir.'/expected.yml', $workingDir.'/'.$testCase['config']['file'], $testCase['title']); } private function initializeTestCase(array $testCase, $dataDir, $workingDir) { $fs = new Filesystem(); if (is_dir($workingDir)) { $fs->remove($workingDir); } $fs->copy($dataDir.'/dist.yml', $workingDir.'/'. $testCase['dist-file']); if ($exists = file_exists($dataDir.'/existing.yml')) { $fs->copy($dataDir.'/existing.yml', $workingDir.'/'.$testCase['config']['file']); } foreach ($testCase['environment'] as $var => $value) { $this->environmentBackup[$var] = getenv($var); putenv($var.'='.$value); }; chdir($workingDir); return $exists; } private function setInteractionExpectations(array $testCase) { $this->io->isInteractive()->willReturn($testCase['interactive']); if (!$testCase['interactive']) { return; } if (!empty($testCase['requested_params'])) { $this->io->write('Some parameters are missing. Please provide them.')->shouldBeCalledTimes(1); } foreach ($testCase['requested_params'] as $param => $settings) { $this->io->ask(sprintf('%s (%s): ', $param, $settings['default']), $settings['default']) ->willReturn($settings['input']) ->shouldBeCalled(); } } public function provideParameterHandlingTestCases() { $tests = array(); foreach (glob(__DIR__.'/fixtures/testcases/*/') as $folder) { $tests[] = array(basename($folder)); } return $tests; } }