/** * @param string $value * @return mixed * @throws UnsetGlobalException * @throws \Exception */ public static function handleArrayVariable($value) { $isLiteral = (string) (int) $value == $value || in_array((string) $value[0], ['\'', '"']); $unquoted = trim($value, '\'"'); if ($isLiteral) { return $unquoted; } return Globals::get($unquoted); }
<?php /** * Copyright 2015 - 2016 Xenofon Spafaridis * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ use Phramework\Testphase\Globals; \Phramework\Testphase\Testphase::setBase('http://jsonplaceholder.typicode.com/'); Globals::set('getIds', [7, 6]); //$testParser = new \Phramework\Testphase\TestParser('./tests/tests/GETById-iterator.json'); //$testParser->createTest(); //die();
/** * Invoke scripts * @return integer Returns indicate how the script exited. * Normal exit is generally represented by a 0 return. */ public function invoke() { $arguments = $this->arguments; if (($serverHost = $arguments->{'server-host'}) !== null) { $this->server = new Server($serverHost, $arguments->{'server-root'}); $this->server->start(); } //Include bootstrap file if set if ($bootstrapFile = $arguments->bootstrap) { require $bootstrapFile; } echo 'testphase v' . Testphase::getVersion() . PHP_EOL; if ($arguments->help) { echo 'Help:' . PHP_EOL; $printer = new ConsoleOptionPrinter(); echo $printer->render(static::getArgumentSpecifications()); return 0; } elseif ($arguments->debug) { echo 'Enabled options: ' . PHP_EOL; foreach ($arguments as $key => $spec) { echo $spec; } } try { $testParserCollection = $this->getTestParserCollection(); } catch (\Exception $e) { echo $e->getMessage(); return $this->stop(1); } //Statistics object $stats = (object) ['tests' => count($testParserCollection), 'success' => 0, 'error' => 0, 'failure' => 0, 'ignore' => 0, 'incomplete' => 0, 'errors' => []]; $testIndex = 0; foreach ($testParserCollection as $test) { //Check if subdir argument is set if (isset($arguments->subdir) && $arguments->subdir !== null) { //If so check if file name passes the given pattern //Remove base dir from filename $cleanFilename = trim(str_replace($arguments->dir, '', $test->getFilename()), '/'); $match = false; //Check if file name matches any of the subdir patterns foreach ($arguments->subdir as $pattern) { $pattern = '@' . $pattern . '@'; if (!!preg_match($pattern, $cleanFilename)) { $match = $match || true; break; } } if (!$match) { //Ignore $stats->ignore += 1; if ($arguments->verbose) { echo sprintf('I %s', $test->getFilename()) . PHP_EOL; } else { echo 'I'; } continue; } } $meta = $test->getMeta(); if (isset($meta->ignore) && $meta->ignore) { if ($arguments->verbose) { echo sprintf('I %s', $test->getFilename()) . PHP_EOL; } else { echo 'I'; } $stats->ignore += 1; continue; } if (isset($meta->incomplete) && $meta->incomplete !== false) { $stats->incomplete += 1; } try { //Complete test's testphase collection $test->createTest(); } catch (\Exception $e) { echo sprintf('Unable to create test from file "%s" %s With message: "%s"', $test->getFilename(), PHP_EOL, $e->getMessage()) . PHP_EOL; return $this->stop(1); } $testphaseCollection = $test->getTest(); //Include number of additional testphase collections $stats->tests += count($testphaseCollection) - 1; //Iterate though test parser's testphase collection foreach ($testphaseCollection as $testphase) { try { $testphase->run(function ($responseStatusCode, $responseHeaders, $responseBody, $responseBodyObject = null) use($test, $arguments) { //todo move to TestParser $export = $test->getExport(); //Fetch all test exports and add them as globals foreach ($export as $key => $value) { $path = explode('.', $value); $pathValue = $responseBodyObject; foreach ($path as $p) { //@todo implement array index $arrayIndex = 0; if (is_array($pathValue)) { $pathValue = $pathValue[$arrayIndex]->{$p}; } else { $pathValue = $pathValue->{$p}; } } Globals::set($key, $pathValue); } if ($arguments->debug) { echo 'Response Status Code:' . PHP_EOL; echo $responseStatusCode . PHP_EOL; echo 'Response Headers:' . PHP_EOL; print_r($responseHeaders); echo PHP_EOL; echo 'Response Body:' . PHP_EOL; echo json_encode($responseBodyObject, JSON_PRETTY_PRINT) . PHP_EOL; } }); //Echo successful char if ($arguments->verbose) { echo sprintf('. %s', $test->getFilename()) . PHP_EOL; } else { echo '.'; } $stats->success += 1; } catch (UnsetGlobalException $e) { //Error message $message = $e->getMessage(); $message = sprintf(self::colored('Test "%s" failed with message', 'red') . PHP_EOL . ' %s' . PHP_EOL, $test->getFilename(), $message); //push message to error message $stats->errors[] = $message; //Echo unsuccessful char if ($arguments->verbose) { echo sprintf('F %s', $test->getFilename()) . PHP_EOL; } else { echo 'F'; } //print if immediate if ($arguments->immediate) { echo PHP_EOL . $message . PHP_EOL; } //Error message $stats->error += 1; } catch (\Exception $e) { //Error message $message = $e->getMessage(); if ($arguments->debug) { $message .= PHP_EOL . $testphase->getResponseBody(); } $message = sprintf(self::colored('Test "%s" failed with message', 'red') . PHP_EOL . ' %s' . PHP_EOL, $test->getFilename(), $message); if (get_class($e) == IncorrectParametersException::class) { $message .= 'Incorrect:' . PHP_EOL . json_encode($e->getParameters(), JSON_PRETTY_PRINT) . PHP_EOL; } elseif (get_class($e) == MissingParametersException::class) { $message .= 'Missing:' . PHP_EOL . json_encode($e->getParameters(), JSON_PRETTY_PRINT) . PHP_EOL; } //push message to error message $stats->errors[] = $message; //Echo unsuccessful char if ($arguments->verbose) { echo sprintf('F %s', $test->getFilename()) . PHP_EOL; } else { echo 'F'; } //print if immediate if ($arguments->immediate) { echo PHP_EOL . $message . PHP_EOL; } $stats->failure += 1; } ++$testIndex; //Show only 80 characters per line if (!($testIndex % 79)) { echo PHP_EOL; } } } echo PHP_EOL; if ($arguments->{'show-globals'}) { echo 'Globals:' . PHP_EOL; echo Globals::toString() . PHP_EOL; } //don't print if immediate is true if (!$arguments->immediate && !empty($stats->errors)) { echo 'Errors:' . PHP_EOL; foreach ($stats->errors as $e) { echo $e . PHP_EOL; } } echo 'Complete!' . PHP_EOL; echo 'Tests:' . $stats->tests . ', '; Binary::output('Successful: ' . $stats->success, 'green'); echo ', '; Binary::output('Ignored: ' . $stats->ignore, 'yellow'); echo ', '; Binary::output('Incomplete: ' . $stats->incomplete, 'yellow'); echo ', '; Binary::output('Error: ' . $stats->error, 'red'); echo ', '; Binary::output('Failure: ' . $stats->failure . PHP_EOL, 'red'); echo 'Memory usage: ' . (int) (memory_get_usage(true) / 1048576) . ' MB' . PHP_EOL; echo 'Elapsed time: ' . (time() - $_SERVER['REQUEST_TIME']) . ' s' . PHP_EOL; if ($stats->error > 0) { return $this->stop(1); } if ($stats->failure > 0) { return $this->stop(2); } return $this->stop(0); }
/** * Replace incline and full replace key inside a test object * @param object|array $inputObject * @return object|array * @todo add special exception, when global is not found test should * be ignored with special warning (EG unavailable) */ private function searchAndReplace($inputObject) { if (is_object($inputObject)) { $object = clone $inputObject; } else { $object = $inputObject; } $pattern_replace = Expression::getExpression(Expression::EXPRESSION_TYPE_REPLACE); $pattern_inline_replace = Expression::getExpression(Expression::EXPRESSION_TYPE_INLINE_REPLACE); list($prefix, $suffix) = Expression::getPrefixSuffix(Expression::EXPRESSION_TYPE_INLINE_REPLACE); foreach ($object as $key => &$value) { if (is_array($value) || is_object($value)) { $value = $this->searchAndReplace($value); } if (is_string($value)) { $matches = []; //Complete replace if (!!preg_match($pattern_replace, $value, $matches)) { $globalsKey = $matches['value']; //replace $value = Globals::get($globalsKey); } elseif (!!preg_match_all($pattern_inline_replace, $value, $matches)) { //Foreach variable replace in string foreach ($matches['value'] as $globalsKey) { $value = str_replace($prefix . $globalsKey . $suffix, Globals::get($globalsKey), $value); } } } } return $object; }