/** * @todo A monster method to refactor!!! * * @param SpecRest $restSpec * @param string $useCaseFilter * @return ValidationReport */ public function validate(Spec\Rest $restSpec, $apiFilter, $useCaseFilter = null) { $validationReport = new ValidationReport(); $apiSpecs = $restSpec->getApiSpecs(); foreach ($apiSpecs as $apiSpec) { if ($apiFilter && $apiSpec->getName() !== $apiFilter) { $this->log[] = sprintf("API %s omitted due to filter '%'", $apiSpec->getName(), $apiFilter); continue; } $this->log[] = sprintf("Testing %s API at %s ", $apiSpec->getName(), $apiSpec->getBaseUrl()); $apiValidationReport = new ApiValidationReport($apiSpec); $validationReport->addApiReport($apiValidationReport); $client = new \GuzzleHttp\Client(['base_url' => $apiSpec->getBaseUrl()]); $responseValidator = new Response(); foreach ($apiSpec->getUrlSpecs() as $urlSpec) { $this->log[] = sprintf("\tTesting URL %s", $urlSpec->getUrl()); $urlReport = new UrlValidationReport($urlSpec); $apiValidationReport->addUrlReport($urlReport); $useCases = $urlSpec->getUseCases(); foreach ($useCases as $urlUseCaseSpec) { if ($useCaseFilter && strpos(strtolower($urlUseCaseSpec->getDescription()), strtolower($useCaseFilter)) === false) { continue; } $useCaseValidationReport = new UseCaseValidationReport($urlUseCaseSpec, $urlUseCaseSpec->getExpectedResponseSpec()); $urlReport->addUseCaseReport($useCaseValidationReport); if ($beforeCallback = $urlUseCaseSpec->getBeforeCallback()) { call_user_func($beforeCallback, $urlUseCaseSpec); } $request = $urlUseCaseSpec->getRequest(); $res = $client->send($request); $responseValidator->validate($res, $urlUseCaseSpec->getExpectedResponseSpec(), $useCaseValidationReport); $useCaseValidationReport->setResponse($res); if ($responseValidator->isValid()) { $validationReport->incrementPassedCount(); } else { $validationReport->incrementFailedCount(); } $responseValidator->reset(); if ($doneCallback = $urlUseCaseSpec->getDoneCallback()) { call_user_func($doneCallback, $res); } if ($this->onProgress) { call_user_func($this->onProgress, $validationReport->getTotalUseCases()); } } } } return $validationReport; }
protected function execute(InputInterface $input, OutputInterface $output) { $constraintDescriber = new \RestSpec\Output\ConstraintDescriber(); $consoleOutput = new \RestSpec\Output\ConsoleOutput($output, $constraintDescriber); $validator = new \RestSpec\Validator\Rest(); $loader = new \RestSpec\Loader(); $loader->run(); try { $useCaseFilter = $input->getArgument('filter'); $api = $input->getOption('api'); $restSpec = Spec\Rest::getInstance(); $restSpecValidator = new \RestSpec\Spec\Validator(); $restSpecValidator->validate($restSpec); $progressBar = new ProgressBar($output); $progressBar->setFormat('Testing your API specs. Already tested: %current% use cases [%bar%]'); $progressBar->start(); $validator->progress(function ($useCases) use($output, $progressBar) { $progressBar->advance(); }); $report = $validator->validate($restSpec, $api, $useCaseFilter); $progressBar->finish(); $output->write($report->dumpAsConsoleText($api, $useCaseFilter)); if ($report->getTotalUseCases() === 0 || $report->getUseCasesFailedCount() > 0) { exit(1); } else { exit(0); } } catch (\Exception $e) { $log = join("\n", $validator->getLog()); $consoleOutput->getOutput()->writeln(sprintf("\n<error>Whoops! Some unexpected error occured. Validation log dump:\n\n%s\n\nThe exception type is: %s, and a message is following:</error>", $log, get_class($e))); $consoleOutput->errorHandler($e, 2); } }
protected function execute(InputInterface $input, OutputInterface $output) { $constraintDescriber = new \RestSpec\Output\ConstraintDescriber(); $consoleOutput = new \RestSpec\Output\ConsoleOutput($output, $constraintDescriber); $loader = new \RestSpec\Loader(); $loader->run(); $restSpec = Spec\Rest::getInstance(); $restSpecValidator = new \RestSpec\Spec\Validator(); $restSpecValidator->validate($restSpec); $apiSpec = $restSpec->getApiSpecs(); foreach ($apiSpec as $apiSpec) { $output->writeln(sprintf("\nAPI base URL: <info>%s</info>\n", $apiSpec->getBaseUrl())); foreach ($apiSpec->getUrlSpecs() as $urlSpec) { $output->writeln(sprintf("<comment>%s</comment>\n\n<info>%s</info>\n", $urlSpec->getDescription(), $urlSpec->getUrl())); $useCases = $urlSpec->getUseCases(); $useCaseView = new UseCaseView(); foreach ($useCases as $useCase) { $output->write($useCaseView->view($useCase, $output)); } } } }