123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- <?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2006-2015 http://thinkphp.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: yunwuxin <448901948@qq.com>
- // +----------------------------------------------------------------------
- namespace think\testing;
- use think\App;
- use think\Config;
- use think\Cookie;
- use think\Error;
- use think\Exception;
- use think\helper\Arr;
- use think\helper\Str;
- use think\Request;
- use think\Response;
- trait CrawlerTrait
- {
- use InteractsWithPages;
- protected $currentUri;
- protected $serverVariables = [];
- /** @var Response */
- protected $response;
- public function get($uri, array $headers = [])
- {
- $server = $this->transformHeadersToServerVars($headers);
- $this->call('GET', $uri, [], [], [], $server);
- return $this;
- }
- public function post($uri, array $data = [], array $headers = [])
- {
- $server = $this->transformHeadersToServerVars($headers);
- $this->call('POST', $uri, $data, [], [], $server);
- return $this;
- }
- public function put($uri, array $data = [], array $headers = [])
- {
- $server = $this->transformHeadersToServerVars($headers);
- $this->call('PUT', $uri, $data, [], [], $server);
- return $this;
- }
- public function delete($uri, array $data = [], array $headers = [])
- {
- $server = $this->transformHeadersToServerVars($headers);
- $this->call('DELETE', $uri, $data, [], [], $server);
- return $this;
- }
- public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
- {
- $this->currentUri = $this->prepareUrlForRequest($uri);
- $request = Request::create(
- $this->currentUri, $method, $parameters,
- $cookies, $files, array_replace($this->serverVariables, $server)
- );
- try {
- $response = App::run($request);
- } catch (Exception $e) {
- $response = Error::getExceptionHandler()->render($e);
- } catch (\Throwable $e) {
- $response = Error::getExceptionHandler()->render($e);
- }
- return $this->response = $response;
- }
- public function seeJson($data = null, $negate = false)
- {
- if (is_null($data)) {
- $this->assertJson(
- $this->response->getContent(), "JSON was not returned from [{$this->currentUri}]."
- );
- return $this;
- }
- return $this->seeJsonContains($data, $negate);
- }
- public function seeJsonEquals(array $data)
- {
- $actual = json_encode(Arr::sortRecursive(
- json_decode($this->response->getContent(), true)
- ));
- $this->assertEquals(json_encode(Arr::sortRecursive($data)), $actual);
- return $this;
- }
- protected function seeJsonContains(array $data, $negate = false)
- {
- $method = $negate ? 'assertFalse' : 'assertTrue';
- $actual = json_decode($this->response->getContent(), true);
- if (is_null($actual) || $actual === false) {
- return $this->fail('Invalid JSON was returned from the route. Perhaps an exception was thrown?');
- }
- $actual = json_encode(Arr::sortRecursive(
- (array)$actual
- ));
- foreach (Arr::sortRecursive($data) as $key => $value) {
- $expected = $this->formatToExpectedJson($key, $value);
- $this->{$method}(
- Str::contains($actual, $expected),
- ($negate ? 'Found unexpected' : 'Unable to find') . " JSON fragment [{$expected}] within [{$actual}]."
- );
- }
- return $this;
- }
- /**
- * Format the given key and value into a JSON string for expectation checks.
- *
- * @param string $key
- * @param mixed $value
- * @return string
- */
- protected function formatToExpectedJson($key, $value)
- {
- $expected = json_encode([$key => $value]);
- if (Str::startsWith($expected, '{')) {
- $expected = substr($expected, 1);
- }
- if (Str::endsWith($expected, '}')) {
- $expected = substr($expected, 0, -1);
- }
- return $expected;
- }
- protected function seeModule($module)
- {
- $this->assertEquals($module, request()->module());
- return $this;
- }
- protected function seeController($controller)
- {
- $this->assertEquals($controller, request()->controller());
- return $this;
- }
- protected function seeAction($action)
- {
- $this->assertEquals($action, request()->action());
- return $this;
- }
- protected function seeStatusCode($status)
- {
- $this->assertEquals($status, $this->response->getCode());
- return $this;
- }
- protected function seeHeader($headerName, $value = null)
- {
- $headers = $this->response->getHeader();
- $this->assertTrue(!empty($headers[$headerName]), "Header [{$headerName}] not present on response.");
- if (!is_null($value)) {
- $this->assertEquals(
- $headers[$headerName], $value,
- "Header [{$headerName}] was found, but value [{$headers[$headerName]}] does not match [{$value}]."
- );
- }
- return $this;
- }
- protected function seeCookie($cookieName, $value = null)
- {
- $exist = Cookie::has($cookieName);
- $this->assertTrue($exist, "Cookie [{$cookieName}] not present on response.");
- if (!is_null($value)) {
- $cookie = Cookie::get($cookieName);
- $this->assertEquals(
- $cookie, $value,
- "Cookie [{$cookieName}] was found, but value [{$cookie}] does not match [{$value}]."
- );
- }
- return $this;
- }
- protected function withServerVariables(array $server)
- {
- $this->serverVariables = $server;
- return $this;
- }
- protected function transformHeadersToServerVars(array $headers)
- {
- $server = [];
- $prefix = 'HTTP_';
- foreach ($headers as $name => $value) {
- $name = strtr(strtoupper($name), '-', '_');
- if (!Str::startsWith($name, $prefix) && $name != 'CONTENT_TYPE') {
- $name = $prefix . $name;
- }
- $server[$name] = $value;
- }
- return $server;
- }
- }
|