From 7f384776a5a4a18c497cf46f1e5169e0726e0639 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Sun, 6 Jun 2021 19:18:33 +0100 Subject: [PATCH 1/2] Install composer deps for test solutions --- src/Listener/PrepareSolutionListener.php | 8 +++---- src/TestUtils/WorkshopExerciseTest.php | 24 +++++++++++++++++++ test/Listener/PrepareSolutionListenerTest.php | 3 +++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/Listener/PrepareSolutionListener.php b/src/Listener/PrepareSolutionListener.php index 5aa46834..66e2ec42 100644 --- a/src/Listener/PrepareSolutionListener.php +++ b/src/Listener/PrepareSolutionListener.php @@ -19,7 +19,7 @@ class PrepareSolutionListener * * @var array */ - private $composerLocations = [ + private static $composerLocations = [ 'composer', 'composer.phar', '/usr/local/bin/composer', @@ -45,7 +45,7 @@ public function __invoke(ExerciseRunnerEvent $event): void if (!file_exists(sprintf('%s/vendor', $solution->getBaseDirectory()))) { $process = new Process( - [$this->locateComposer(), 'install', '--no-interaction'], + [self::locateComposer(), 'install', '--no-interaction'], $solution->getBaseDirectory() ); $process->run(); @@ -56,9 +56,9 @@ public function __invoke(ExerciseRunnerEvent $event): void /** * @return string */ - private function locateComposer(): string + public static function locateComposer(): string { - foreach ($this->composerLocations as $location) { + foreach (self::$composerLocations as $location) { if (file_exists($location) && is_executable($location)) { return $location; } diff --git a/src/TestUtils/WorkshopExerciseTest.php b/src/TestUtils/WorkshopExerciseTest.php index 7ceb12db..b7345f17 100644 --- a/src/TestUtils/WorkshopExerciseTest.php +++ b/src/TestUtils/WorkshopExerciseTest.php @@ -9,8 +9,11 @@ use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\ProvidesSolution; +use PhpSchool\PhpWorkshop\ExerciseCheck\ComposerExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseDispatcher; use PhpSchool\PhpWorkshop\ExerciseRepository; +use PhpSchool\PhpWorkshop\Listener\PrepareSolutionListener; use PhpSchool\PhpWorkshop\Result\Cgi\CgiResult; use PhpSchool\PhpWorkshop\Result\Cli\CliResult; use PhpSchool\PhpWorkshop\Result\Failure; @@ -23,6 +26,7 @@ use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use PhpSchool\PhpWorkshop\Input\Input; +use Symfony\Component\Process\Process; abstract class WorkshopExerciseTest extends TestCase { @@ -81,6 +85,11 @@ public function runExercise(string $submissionFile): void ); } + if ($exercise instanceof ComposerExerciseCheck) { + $this->installDeps($exercise, dirname($submissionFileAbsolute)); + } + + $input = new Input($this->container->get('appName'), [ 'program' => $submissionFileAbsolute ]); @@ -89,6 +98,21 @@ public function runExercise(string $submissionFile): void ->verify($exercise, $input); } + /** + * @param ExerciseInterface&ProvidesSolution $exercise + * @param string $directory + */ + private function installDeps(ExerciseInterface $exercise, string $directory): void + { + if (file_exists("$directory/composer.json") && !file_exists("$directory/vendor")) { + $process = new Process( + [PrepareSolutionListener::locateComposer(), 'install', '--no-interaction'], + $directory + ); + $process->run(); + } + } + public function assertVerifyWasSuccessful(): void { $failures = (new Collection($this->results->getIterator()->getArrayCopy())) diff --git a/test/Listener/PrepareSolutionListenerTest.php b/test/Listener/PrepareSolutionListenerTest.php index f04d4954..23997150 100644 --- a/test/Listener/PrepareSolutionListenerTest.php +++ b/test/Listener/PrepareSolutionListenerTest.php @@ -44,6 +44,9 @@ public function setUp(): void touch($this->file); } + /** + * @runInSeparateProcess + */ public function testIfSolutionRequiresComposerButComposerCannotBeLocatedExceptionIsThrown(): void { $refProp = new ReflectionProperty(PrepareSolutionListener::class, 'composerLocations'); From a9a5caa5b12e3faeacd420b05d76c9339e0b2779 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Sun, 6 Jun 2021 19:20:13 +0100 Subject: [PATCH 2/2] CS --- src/TestUtils/WorkshopExerciseTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/TestUtils/WorkshopExerciseTest.php b/src/TestUtils/WorkshopExerciseTest.php index b7345f17..d0d4c35d 100644 --- a/src/TestUtils/WorkshopExerciseTest.php +++ b/src/TestUtils/WorkshopExerciseTest.php @@ -89,7 +89,6 @@ public function runExercise(string $submissionFile): void $this->installDeps($exercise, dirname($submissionFileAbsolute)); } - $input = new Input($this->container->get('appName'), [ 'program' => $submissionFileAbsolute ]);