diff --git a/.docker/nginx/app.conf b/.docker/nginx/app.conf new file mode 100644 index 0000000..00fc930 --- /dev/null +++ b/.docker/nginx/app.conf @@ -0,0 +1,15 @@ +server { + listen 0.0.0.0:80; + + root /app; + + location / { + try_files $uri $uri/index.php; + } + + location ~ \.php$ { + fastcgi_pass phpfpm:9000; + fastcgi_index index.php; + include fastcgi.conf; + } +} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..6be9e78 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,25 @@ +sudo: required + +language: php + +php: + - 7.2 + +services: + - docker + +cache: + directories: + - $HOME/.composer/cache + +before_install: + - phpenv config-rm xdebug.ini + - travis_retry composer self-update + - docker-compose -f docker-compose.testing.yaml up -d + +before_script: + - composer install --no-interaction --no-suggest + +script: + - vendor/bin/phpspec run + - vendor/bin/codecept run \ No newline at end of file diff --git a/README.md b/README.md index 9f78524..518baca 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ =================== **Obsolete package - payment with USSD is forbidden by Iranian central bank ([more info](http://khabaronline.ir/%28X%281%29S%28dja55emvz22zzic1fn5qleqc%29%29/detail/464534/Economy/macroeconomics))** +[![Travis (.org) branch](https://img.shields.io/travis/:user/:repo/:branch.svg?style=flat-square)](https://github.com/nikapps/saman-ussd/) [![Latest Stable Version](https://poser.pugx.org/nikapps/saman-ussd/v/stable)](https://packagist.org/packages/nikapps/saman-ussd) [![License](https://poser.pugx.org/nikapps/saman-ussd/license)](https://packagist.org/packages/nikapps/saman-ussd) Saman *724* A php package for connecting to [Saman *724#](http://www.724sep.ir/) payment gateway. @@ -338,17 +339,17 @@ vendor/bin/phpspec run #### Api test -Change default `endpoint` in -`tests/api.suite.yml` and `tests/api/webservice.php` +Run: -Then run: +~~~bash +docker-compose -f docker-compose.testing.yaml up -d -~~~ vendor/bin/codecept run ~~~ ## Dependencies +- `php >= 7.1` - `piotrooo/wsdl-creator` Dev dependencies: diff --git a/composer.json b/composer.json index d6ff23f..5ab851b 100644 --- a/composer.json +++ b/composer.json @@ -39,6 +39,6 @@ "require-dev": { "phpspec/phpspec": "^2.2", "phpunit/phpunit": "4.*", - "codeception/codeception": "2.0.*" + "codeception/codeception": "^2.4" } } diff --git a/docker-compose.testing.yaml b/docker-compose.testing.yaml new file mode 100644 index 0000000..c79c56c --- /dev/null +++ b/docker-compose.testing.yaml @@ -0,0 +1,18 @@ +version: '3' +services: + phpfpm: + tty: true + image: 'bitnami/php-fpm:7.2' + ports: + - 9000:9000 + volumes: + - .:/app + + web: + image: 'nginx:alpine' + depends_on: + - phpfpm + ports: + - '8000:80' + volumes: + - ./.docker/nginx/:/etc/nginx/conf.d/ diff --git a/tests/_support/ApiTester.php b/tests/_support/ApiTester.php new file mode 100644 index 0000000..aba6736 --- /dev/null +++ b/tests/_support/ApiTester.php @@ -0,0 +1,26 @@ +haveHttpHeader('Content-Type', 'application/json'); + * // all next requests will contain this header + * ?> + * ``` + * + * @param $name + * @param $value + * @part json + * @part xml + * @see \Codeception\Module\REST::haveHttpHeader() + */ + public function haveHttpHeader($name, $value) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('haveHttpHeader', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Deletes the header with the passed name. Subsequent requests + * will not have the deleted header in its request. + * + * Example: + * ```php + * haveHttpHeader('X-Requested-With', 'Codeception'); + * $I->sendGET('test-headers.php'); + * // ... + * $I->deleteHeader('X-Requested-With'); + * $I->sendPOST('some-other-page.php'); + * ?> + * ``` + * + * @param string $name the name of the header to delete. + * @part json + * @part xml + * @see \Codeception\Module\REST::deleteHeader() + */ + public function deleteHeader($name) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('deleteHeader', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks over the given HTTP header and (optionally) + * its value, asserting that are there + * + * @param $name + * @param $value + * @part json + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeHttpHeader() + */ + public function canSeeHttpHeader($name, $value = null) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeHttpHeader', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks over the given HTTP header and (optionally) + * its value, asserting that are there + * + * @param $name + * @param $value + * @part json + * @part xml + * @see \Codeception\Module\REST::seeHttpHeader() + */ + public function seeHttpHeader($name, $value = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeHttpHeader', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks over the given HTTP header and (optionally) + * its value, asserting that are not there + * + * @param $name + * @param $value + * @part json + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeHttpHeader() + */ + public function cantSeeHttpHeader($name, $value = null) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeHttpHeader', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks over the given HTTP header and (optionally) + * its value, asserting that are not there + * + * @param $name + * @param $value + * @part json + * @part xml + * @see \Codeception\Module\REST::dontSeeHttpHeader() + */ + public function dontSeeHttpHeader($name, $value = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeHttpHeader', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that http response header is received only once. + * HTTP RFC2616 allows multiple response headers with the same name. + * You can check that you didn't accidentally sent the same header twice. + * + * ``` php + * seeHttpHeaderOnce('Cache-Control'); + * ?>> + * ``` + * + * @param $name + * @part json + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeHttpHeaderOnce() + */ + public function canSeeHttpHeaderOnce($name) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeHttpHeaderOnce', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that http response header is received only once. + * HTTP RFC2616 allows multiple response headers with the same name. + * You can check that you didn't accidentally sent the same header twice. + * + * ``` php + * seeHttpHeaderOnce('Cache-Control'); + * ?>> + * ``` + * + * @param $name + * @part json + * @part xml + * @see \Codeception\Module\REST::seeHttpHeaderOnce() + */ + public function seeHttpHeaderOnce($name) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeHttpHeaderOnce', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Returns the value of the specified header name + * + * @param $name + * @param Boolean $first Whether to return the first value or all header values + * + * @return string|array The first header value if $first is true, an array of values otherwise + * @part json + * @part xml + * @see \Codeception\Module\REST::grabHttpHeader() + */ + public function grabHttpHeader($name, $first = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('grabHttpHeader', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Adds HTTP authentication via username/password. + * + * @param $username + * @param $password + * @part json + * @part xml + * @see \Codeception\Module\REST::amHttpAuthenticated() + */ + public function amHttpAuthenticated($username, $password) { + return $this->getScenario()->runStep(new \Codeception\Step\Condition('amHttpAuthenticated', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Adds Digest authentication via username/password. + * + * @param $username + * @param $password + * @part json + * @part xml + * @see \Codeception\Module\REST::amDigestAuthenticated() + */ + public function amDigestAuthenticated($username, $password) { + return $this->getScenario()->runStep(new \Codeception\Step\Condition('amDigestAuthenticated', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Adds Bearer authentication via access token. + * + * @param $accessToken + * @part json + * @part xml + * @see \Codeception\Module\REST::amBearerAuthenticated() + */ + public function amBearerAuthenticated($accessToken) { + return $this->getScenario()->runStep(new \Codeception\Step\Condition('amBearerAuthenticated', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Adds NTLM authentication via username/password. + * Requires client to be Guzzle >=6.3.0 + * Out of scope for functional modules. + * + * Example: + * ```php + * amNTLMAuthenticated('jon_snow', 'targaryen'); + * ?> + * ``` + * + * @param $username + * @param $password + * @throws ModuleException + * @part json + * @part xml + * @see \Codeception\Module\REST::amNTLMAuthenticated() + */ + public function amNTLMAuthenticated($username, $password) { + return $this->getScenario()->runStep(new \Codeception\Step\Condition('amNTLMAuthenticated', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Allows to send REST request using AWS Authorization + * Only works with PhpBrowser + * Example + * Config - + * + * modules: + * enabled: + * - REST: + * aws: + * key: accessKey + * secret: accessSecret + * service: awsService + * region: awsRegion + * + * ```php + * amAWSAuthenticated(); + * ?> + * ``` + * @param array $additionalAWSConfig + * @throws ModuleException + * @see \Codeception\Module\REST::amAWSAuthenticated() + */ + public function amAWSAuthenticated($additionalAWSConfig = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Condition('amAWSAuthenticated', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends a POST request to given uri. Parameters and files can be provided separately. + * + * Example: + * ```php + * sendPOST('/message', ['subject' => 'Read this!', 'to' => 'johndoe@example.com']); + * //simple upload method + * $I->sendPOST('/message/24', ['inline' => 0], ['attachmentFile' => codecept_data_dir('sample_file.pdf')]); + * //uploading a file with a custom name and mime-type. This is also useful to simulate upload errors. + * $I->sendPOST('/message/24', ['inline' => 0], [ + * 'attachmentFile' => [ + * 'name' => 'document.pdf', + * 'type' => 'application/pdf', + * 'error' => UPLOAD_ERR_OK, + * 'size' => filesize(codecept_data_dir('sample_file.pdf')), + * 'tmp_name' => codecept_data_dir('sample_file.pdf') + * ] + * ]); + * ``` + * + * @param $url + * @param array|\JsonSerializable $params + * @param array $files A list of filenames or "mocks" of $_FILES (each entry being an array with the following + * keys: name, type, error, size, tmp_name (pointing to the real file path). Each key works + * as the "name" attribute of a file input field. + * + * @see http://php.net/manual/en/features.file-upload.post-method.php + * @see codecept_data_dir() + * @part json + * @part xml + * @see \Codeception\Module\REST::sendPOST() + */ + public function sendPOST($url, $params = null, $files = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendPOST', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends a HEAD request to given uri. + * + * @param $url + * @param array $params + * @part json + * @part xml + * @see \Codeception\Module\REST::sendHEAD() + */ + public function sendHEAD($url, $params = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendHEAD', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends an OPTIONS request to given uri. + * + * @param $url + * @param array $params + * @part json + * @part xml + * @see \Codeception\Module\REST::sendOPTIONS() + */ + public function sendOPTIONS($url, $params = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendOPTIONS', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends a GET request to given uri. + * + * @param $url + * @param array $params + * @part json + * @part xml + * @see \Codeception\Module\REST::sendGET() + */ + public function sendGET($url, $params = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendGET', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends PUT request to given uri. + * + * @param $url + * @param array $params + * @param array $files + * @part json + * @part xml + * @see \Codeception\Module\REST::sendPUT() + */ + public function sendPUT($url, $params = null, $files = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendPUT', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends PATCH request to given uri. + * + * @param $url + * @param array $params + * @param array $files + * @part json + * @part xml + * @see \Codeception\Module\REST::sendPATCH() + */ + public function sendPATCH($url, $params = null, $files = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendPATCH', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends DELETE request to given uri. + * + * @param $url + * @param array $params + * @param array $files + * @part json + * @part xml + * @see \Codeception\Module\REST::sendDELETE() + */ + public function sendDELETE($url, $params = null, $files = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendDELETE', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends LINK request to given uri. + * + * @param $url + * @param array $linkEntries (entry is array with keys "uri" and "link-param") + * + * @link http://tools.ietf.org/html/rfc2068#section-19.6.2.4 + * + * @author samva.ua@gmail.com + * @part json + * @part xml + * @see \Codeception\Module\REST::sendLINK() + */ + public function sendLINK($url, $linkEntries) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendLINK', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Sends UNLINK request to given uri. + * + * @param $url + * @param array $linkEntries (entry is array with keys "uri" and "link-param") + * @link http://tools.ietf.org/html/rfc2068#section-19.6.2.4 + * @author samva.ua@gmail.com + * @part json + * @part xml + * @see \Codeception\Module\REST::sendUNLINK() + */ + public function sendUNLINK($url, $linkEntries) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('sendUNLINK', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether last response was valid JSON. + * This is done with json_last_error function. + * + * @part json + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseIsJson() + */ + public function canSeeResponseIsJson() { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseIsJson', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether last response was valid JSON. + * This is done with json_last_error function. + * + * @part json + * @see \Codeception\Module\REST::seeResponseIsJson() + */ + public function seeResponseIsJson() { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseIsJson', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether the last response contains text. + * + * @param $text + * @part json + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseContains() + */ + public function canSeeResponseContains($text) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseContains', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether the last response contains text. + * + * @param $text + * @part json + * @part xml + * @see \Codeception\Module\REST::seeResponseContains() + */ + public function seeResponseContains($text) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseContains', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether last response do not contain text. + * + * @param $text + * @part json + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeResponseContains() + */ + public function cantSeeResponseContains($text) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeResponseContains', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether last response do not contain text. + * + * @param $text + * @part json + * @part xml + * @see \Codeception\Module\REST::dontSeeResponseContains() + */ + public function dontSeeResponseContains($text) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeResponseContains', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether the last JSON response contains provided array. + * The response is converted to array with json_decode($response, true) + * Thus, JSON is represented by associative array. + * This method matches that response array contains provided array. + * + * Examples: + * + * ``` php + * seeResponseContainsJson(array('name' => 'john')); + * + * // response {user: john, profile: { email: john@gmail.com }} + * $I->seeResponseContainsJson(array('email' => 'john@gmail.com')); + * + * ?> + * ``` + * + * This method recursively checks if one array can be found inside of another. + * + * @param array $json + * @part json + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseContainsJson() + */ + public function canSeeResponseContainsJson($json = null) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseContainsJson', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether the last JSON response contains provided array. + * The response is converted to array with json_decode($response, true) + * Thus, JSON is represented by associative array. + * This method matches that response array contains provided array. + * + * Examples: + * + * ``` php + * seeResponseContainsJson(array('name' => 'john')); + * + * // response {user: john, profile: { email: john@gmail.com }} + * $I->seeResponseContainsJson(array('email' => 'john@gmail.com')); + * + * ?> + * ``` + * + * This method recursively checks if one array can be found inside of another. + * + * @param array $json + * @part json + * @see \Codeception\Module\REST::seeResponseContainsJson() + */ + public function seeResponseContainsJson($json = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseContainsJson', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Returns current response so that it can be used in next scenario steps. + * + * Example: + * + * ``` php + * grabResponse(); + * $I->sendPUT('/user', array('id' => $user_id, 'name' => 'davert')); + * ?> + * ``` + * + * @version 1.1 + * @return string + * @part json + * @part xml + * @see \Codeception\Module\REST::grabResponse() + */ + public function grabResponse() { + return $this->getScenario()->runStep(new \Codeception\Step\Action('grabResponse', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Returns data from the current JSON response using [JSONPath](http://goessner.net/articles/JsonPath/) as selector. + * JsonPath is XPath equivalent for querying Json structures. + * Try your JsonPath expressions [online](http://jsonpath.curiousconcept.com/). + * Even for a single value an array is returned. + * + * This method **require [`flow/jsonpath` > 0.2](https://github.com/FlowCommunications/JSONPath/) library to be installed**. + * + * Example: + * + * ``` php + * grabDataFromResponseByJsonPath('$..users[0].id'); + * $I->sendPUT('/user', array('id' => $firstUserId[0], 'name' => 'davert')); + * ?> + * ``` + * + * @param string $jsonPath + * @return array Array of matching items + * @version 2.0.9 + * @throws \Exception + * @part json + * @see \Codeception\Module\REST::grabDataFromResponseByJsonPath() + */ + public function grabDataFromResponseByJsonPath($jsonPath) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('grabDataFromResponseByJsonPath', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if json structure in response matches the xpath provided. + * JSON is not supposed to be checked against XPath, yet it can be converted to xml and used with XPath. + * This assertion allows you to check the structure of response json. + * * + * ```json + * { "store": { + * "book": [ + * { "category": "reference", + * "author": "Nigel Rees", + * "title": "Sayings of the Century", + * "price": 8.95 + * }, + * { "category": "fiction", + * "author": "Evelyn Waugh", + * "title": "Sword of Honour", + * "price": 12.99 + * } + * ], + * "bicycle": { + * "color": "red", + * "price": 19.95 + * } + * } + * } + * ``` + * + * ```php + * seeResponseJsonMatchesXpath('//store/book/author'); + * // first book in store has author + * $I->seeResponseJsonMatchesXpath('//store/book[1]/author'); + * // at least one item in store has price + * $I->seeResponseJsonMatchesXpath('/store//price'); + * ?> + * ``` + * @param string $xpath + * @part json + * @version 2.0.9 + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseJsonMatchesXpath() + */ + public function canSeeResponseJsonMatchesXpath($xpath) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseJsonMatchesXpath', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if json structure in response matches the xpath provided. + * JSON is not supposed to be checked against XPath, yet it can be converted to xml and used with XPath. + * This assertion allows you to check the structure of response json. + * * + * ```json + * { "store": { + * "book": [ + * { "category": "reference", + * "author": "Nigel Rees", + * "title": "Sayings of the Century", + * "price": 8.95 + * }, + * { "category": "fiction", + * "author": "Evelyn Waugh", + * "title": "Sword of Honour", + * "price": 12.99 + * } + * ], + * "bicycle": { + * "color": "red", + * "price": 19.95 + * } + * } + * } + * ``` + * + * ```php + * seeResponseJsonMatchesXpath('//store/book/author'); + * // first book in store has author + * $I->seeResponseJsonMatchesXpath('//store/book[1]/author'); + * // at least one item in store has price + * $I->seeResponseJsonMatchesXpath('/store//price'); + * ?> + * ``` + * @param string $xpath + * @part json + * @version 2.0.9 + * @see \Codeception\Module\REST::seeResponseJsonMatchesXpath() + */ + public function seeResponseJsonMatchesXpath($xpath) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseJsonMatchesXpath', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Opposite to seeResponseJsonMatchesXpath + * + * @param string $xpath + * @part json + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeResponseJsonMatchesXpath() + */ + public function cantSeeResponseJsonMatchesXpath($xpath) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeResponseJsonMatchesXpath', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Opposite to seeResponseJsonMatchesXpath + * + * @param string $xpath + * @part json + * @see \Codeception\Module\REST::dontSeeResponseJsonMatchesXpath() + */ + public function dontSeeResponseJsonMatchesXpath($xpath) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeResponseJsonMatchesXpath', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if json structure in response matches [JsonPath](http://goessner.net/articles/JsonPath/). + * JsonPath is XPath equivalent for querying Json structures. + * Try your JsonPath expressions [online](http://jsonpath.curiousconcept.com/). + * This assertion allows you to check the structure of response json. + * + * This method **require [`flow/jsonpath` > 0.2](https://github.com/FlowCommunications/JSONPath/) library to be installed**. + * + * ```json + * { "store": { + * "book": [ + * { "category": "reference", + * "author": "Nigel Rees", + * "title": "Sayings of the Century", + * "price": 8.95 + * }, + * { "category": "fiction", + * "author": "Evelyn Waugh", + * "title": "Sword of Honour", + * "price": 12.99 + * } + * ], + * "bicycle": { + * "color": "red", + * "price": 19.95 + * } + * } + * } + * ``` + * + * ```php + * seeResponseJsonMatchesJsonPath('$.store.book[*].author'); + * // first book in store has author + * $I->seeResponseJsonMatchesJsonPath('$.store.book[0].author'); + * // at least one item in store has price + * $I->seeResponseJsonMatchesJsonPath('$.store..price'); + * ?> + * ``` + * + * @param string $jsonPath + * @part json + * @version 2.0.9 + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseJsonMatchesJsonPath() + */ + public function canSeeResponseJsonMatchesJsonPath($jsonPath) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseJsonMatchesJsonPath', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if json structure in response matches [JsonPath](http://goessner.net/articles/JsonPath/). + * JsonPath is XPath equivalent for querying Json structures. + * Try your JsonPath expressions [online](http://jsonpath.curiousconcept.com/). + * This assertion allows you to check the structure of response json. + * + * This method **require [`flow/jsonpath` > 0.2](https://github.com/FlowCommunications/JSONPath/) library to be installed**. + * + * ```json + * { "store": { + * "book": [ + * { "category": "reference", + * "author": "Nigel Rees", + * "title": "Sayings of the Century", + * "price": 8.95 + * }, + * { "category": "fiction", + * "author": "Evelyn Waugh", + * "title": "Sword of Honour", + * "price": 12.99 + * } + * ], + * "bicycle": { + * "color": "red", + * "price": 19.95 + * } + * } + * } + * ``` + * + * ```php + * seeResponseJsonMatchesJsonPath('$.store.book[*].author'); + * // first book in store has author + * $I->seeResponseJsonMatchesJsonPath('$.store.book[0].author'); + * // at least one item in store has price + * $I->seeResponseJsonMatchesJsonPath('$.store..price'); + * ?> + * ``` + * + * @param string $jsonPath + * @part json + * @version 2.0.9 + * @see \Codeception\Module\REST::seeResponseJsonMatchesJsonPath() + */ + public function seeResponseJsonMatchesJsonPath($jsonPath) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseJsonMatchesJsonPath', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Opposite to seeResponseJsonMatchesJsonPath + * + * @param string $jsonPath + * @part json + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeResponseJsonMatchesJsonPath() + */ + public function cantSeeResponseJsonMatchesJsonPath($jsonPath) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeResponseJsonMatchesJsonPath', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Opposite to seeResponseJsonMatchesJsonPath + * + * @param string $jsonPath + * @part json + * @see \Codeception\Module\REST::dontSeeResponseJsonMatchesJsonPath() + */ + public function dontSeeResponseJsonMatchesJsonPath($jsonPath) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeResponseJsonMatchesJsonPath', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Opposite to seeResponseContainsJson + * + * @part json + * @param array $json + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeResponseContainsJson() + */ + public function cantSeeResponseContainsJson($json = null) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeResponseContainsJson', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Opposite to seeResponseContainsJson + * + * @part json + * @param array $json + * @see \Codeception\Module\REST::dontSeeResponseContainsJson() + */ + public function dontSeeResponseContainsJson($json = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeResponseContainsJson', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that Json matches provided types. + * In case you don't know the actual values of JSON data returned you can match them by type. + * Starts check with a root element. If JSON data is array it will check the first element of an array. + * You can specify the path in the json which should be checked with JsonPath + * + * Basic example: + * + * ```php + * seeResponseMatchesJsonType([ + * 'user_id' => 'integer', + * 'name' => 'string|null', + * 'is_active' => 'boolean' + * ]); + * + * // narrow down matching with JsonPath: + * // {"users": [{ "name": "davert"}, {"id": 1}]} + * $I->seeResponseMatchesJsonType(['name' => 'string'], '$.users[0]'); + * ?> + * ``` + * + * In this case you can match that record contains fields with data types you expected. + * The list of possible data types: + * + * * string + * * integer + * * float + * * array (json object is array as well) + * * boolean + * + * You can also use nested data type structures: + * + * ```php + * seeResponseMatchesJsonType([ + * 'user_id' => 'integer|string', // multiple types + * 'company' => ['name' => 'string'] + * ]); + * ?> + * ``` + * + * You can also apply filters to check values. Filter can be applied with `:` char after the type declaration. + * + * Here is the list of possible filters: + * + * * `integer:>{val}` - checks that integer is greater than {val} (works with float and string types too). + * * `integer:<{val}` - checks that integer is lower than {val} (works with float and string types too). + * * `string:url` - checks that value is valid url. + * * `string:date` - checks that value is date in JavaScript format: https://weblog.west-wind.com/posts/2014/Jan/06/JavaScript-JSON-Date-Parsing-and-real-Dates + * * `string:email` - checks that value is a valid email according to http://emailregex.com/ + * * `string:regex({val})` - checks that string matches a regex provided with {val} + * + * This is how filters can be used: + * + * ```php + * 'davert@codeception.com'} + * $I->seeResponseMatchesJsonType([ + * 'user_id' => 'string:>0:<1000', // multiple filters can be used + * 'email' => 'string:regex(~\@~)' // we just check that @ char is included + * ]); + * + * // {'user_id': '1'} + * $I->seeResponseMatchesJsonType([ + * 'user_id' => 'string:>0', // works with strings as well + * } + * ?> + * ``` + * + * You can also add custom filters y accessing `JsonType::addCustomFilter` method. + * See [JsonType reference](http://codeception.com/docs/reference/JsonType). + * + * @part json + * @version 2.1.3 + * @param array $jsonType + * @param string $jsonPath + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseMatchesJsonType() + */ + public function canSeeResponseMatchesJsonType($jsonType, $jsonPath = null) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseMatchesJsonType', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that Json matches provided types. + * In case you don't know the actual values of JSON data returned you can match them by type. + * Starts check with a root element. If JSON data is array it will check the first element of an array. + * You can specify the path in the json which should be checked with JsonPath + * + * Basic example: + * + * ```php + * seeResponseMatchesJsonType([ + * 'user_id' => 'integer', + * 'name' => 'string|null', + * 'is_active' => 'boolean' + * ]); + * + * // narrow down matching with JsonPath: + * // {"users": [{ "name": "davert"}, {"id": 1}]} + * $I->seeResponseMatchesJsonType(['name' => 'string'], '$.users[0]'); + * ?> + * ``` + * + * In this case you can match that record contains fields with data types you expected. + * The list of possible data types: + * + * * string + * * integer + * * float + * * array (json object is array as well) + * * boolean + * + * You can also use nested data type structures: + * + * ```php + * seeResponseMatchesJsonType([ + * 'user_id' => 'integer|string', // multiple types + * 'company' => ['name' => 'string'] + * ]); + * ?> + * ``` + * + * You can also apply filters to check values. Filter can be applied with `:` char after the type declaration. + * + * Here is the list of possible filters: + * + * * `integer:>{val}` - checks that integer is greater than {val} (works with float and string types too). + * * `integer:<{val}` - checks that integer is lower than {val} (works with float and string types too). + * * `string:url` - checks that value is valid url. + * * `string:date` - checks that value is date in JavaScript format: https://weblog.west-wind.com/posts/2014/Jan/06/JavaScript-JSON-Date-Parsing-and-real-Dates + * * `string:email` - checks that value is a valid email according to http://emailregex.com/ + * * `string:regex({val})` - checks that string matches a regex provided with {val} + * + * This is how filters can be used: + * + * ```php + * 'davert@codeception.com'} + * $I->seeResponseMatchesJsonType([ + * 'user_id' => 'string:>0:<1000', // multiple filters can be used + * 'email' => 'string:regex(~\@~)' // we just check that @ char is included + * ]); + * + * // {'user_id': '1'} + * $I->seeResponseMatchesJsonType([ + * 'user_id' => 'string:>0', // works with strings as well + * } + * ?> + * ``` + * + * You can also add custom filters y accessing `JsonType::addCustomFilter` method. + * See [JsonType reference](http://codeception.com/docs/reference/JsonType). + * + * @part json + * @version 2.1.3 + * @param array $jsonType + * @param string $jsonPath + * @see \Codeception\Module\REST::seeResponseMatchesJsonType() + */ + public function seeResponseMatchesJsonType($jsonType, $jsonPath = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseMatchesJsonType', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Opposite to `seeResponseMatchesJsonType`. + * + * @part json + * @see seeResponseMatchesJsonType + * @param $jsonType jsonType structure + * @param null $jsonPath optionally set specific path to structure with JsonPath + * @version 2.1.3 + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeResponseMatchesJsonType() + */ + public function cantSeeResponseMatchesJsonType($jsonType, $jsonPath = null) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeResponseMatchesJsonType', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Opposite to `seeResponseMatchesJsonType`. + * + * @part json + * @see seeResponseMatchesJsonType + * @param $jsonType jsonType structure + * @param null $jsonPath optionally set specific path to structure with JsonPath + * @version 2.1.3 + * @see \Codeception\Module\REST::dontSeeResponseMatchesJsonType() + */ + public function dontSeeResponseMatchesJsonType($jsonType, $jsonPath = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeResponseMatchesJsonType', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if response is exactly the same as provided. + * + * @part json + * @part xml + * @param $response + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseEquals() + */ + public function canSeeResponseEquals($expected) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseEquals', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if response is exactly the same as provided. + * + * @part json + * @part xml + * @param $response + * @see \Codeception\Module\REST::seeResponseEquals() + */ + public function seeResponseEquals($expected) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseEquals', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks response code equals to provided value. + * + * ```php + * seeResponseCodeIs(200); + * + * // preferred to use \Codeception\Util\HttpCode + * $I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); + * ``` + * + * @part json + * @part xml + * @param $code + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseCodeIs() + */ + public function canSeeResponseCodeIs($code) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseCodeIs', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks response code equals to provided value. + * + * ```php + * seeResponseCodeIs(200); + * + * // preferred to use \Codeception\Util\HttpCode + * $I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); + * ``` + * + * @part json + * @part xml + * @param $code + * @see \Codeception\Module\REST::seeResponseCodeIs() + */ + public function seeResponseCodeIs($code) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseCodeIs', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that response code is not equal to provided value. + * + * ```php + * dontSeeResponseCodeIs(200); + * + * // preferred to use \Codeception\Util\HttpCode + * $I->dontSeeResponseCodeIs(\Codeception\Util\HttpCode::OK); + * ``` + * + * @part json + * @part xml + * @param $code + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeResponseCodeIs() + */ + public function cantSeeResponseCodeIs($code) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeResponseCodeIs', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that response code is not equal to provided value. + * + * ```php + * dontSeeResponseCodeIs(200); + * + * // preferred to use \Codeception\Util\HttpCode + * $I->dontSeeResponseCodeIs(\Codeception\Util\HttpCode::OK); + * ``` + * + * @part json + * @part xml + * @param $code + * @see \Codeception\Module\REST::dontSeeResponseCodeIs() + */ + public function dontSeeResponseCodeIs($code) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeResponseCodeIs', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that the response code is 2xx + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseCodeIsSuccessful() + */ + public function canSeeResponseCodeIsSuccessful() { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseCodeIsSuccessful', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that the response code is 2xx + * @see \Codeception\Module\REST::seeResponseCodeIsSuccessful() + */ + public function seeResponseCodeIsSuccessful() { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseCodeIsSuccessful', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that the response code 3xx + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseCodeIsRedirection() + */ + public function canSeeResponseCodeIsRedirection() { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseCodeIsRedirection', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that the response code 3xx + * @see \Codeception\Module\REST::seeResponseCodeIsRedirection() + */ + public function seeResponseCodeIsRedirection() { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseCodeIsRedirection', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that the response code is 4xx + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseCodeIsClientError() + */ + public function canSeeResponseCodeIsClientError() { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseCodeIsClientError', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that the response code is 4xx + * @see \Codeception\Module\REST::seeResponseCodeIsClientError() + */ + public function seeResponseCodeIsClientError() { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseCodeIsClientError', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that the response code is 5xx + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseCodeIsServerError() + */ + public function canSeeResponseCodeIsServerError() { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseCodeIsServerError', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks that the response code is 5xx + * @see \Codeception\Module\REST::seeResponseCodeIsServerError() + */ + public function seeResponseCodeIsServerError() { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseCodeIsServerError', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether last response was valid XML. + * This is done with libxml_get_last_error function. + * + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeResponseIsXml() + */ + public function canSeeResponseIsXml() { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseIsXml', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether last response was valid XML. + * This is done with libxml_get_last_error function. + * + * @part xml + * @see \Codeception\Module\REST::seeResponseIsXml() + */ + public function seeResponseIsXml() { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseIsXml', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether XML response matches XPath + * + * ```php + * seeXmlResponseMatchesXpath('//root/user[@id=1]'); + * ``` + * @part xml + * @param $xpath + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeXmlResponseMatchesXpath() + */ + public function canSeeXmlResponseMatchesXpath($xpath) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeXmlResponseMatchesXpath', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether XML response matches XPath + * + * ```php + * seeXmlResponseMatchesXpath('//root/user[@id=1]'); + * ``` + * @part xml + * @param $xpath + * @see \Codeception\Module\REST::seeXmlResponseMatchesXpath() + */ + public function seeXmlResponseMatchesXpath($xpath) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeXmlResponseMatchesXpath', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether XML response does not match XPath + * + * ```php + * dontSeeXmlResponseMatchesXpath('//root/user[@id=1]'); + * ``` + * @part xml + * @param $xpath + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeXmlResponseMatchesXpath() + */ + public function cantSeeXmlResponseMatchesXpath($xpath) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeXmlResponseMatchesXpath', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks whether XML response does not match XPath + * + * ```php + * dontSeeXmlResponseMatchesXpath('//root/user[@id=1]'); + * ``` + * @part xml + * @param $xpath + * @see \Codeception\Module\REST::dontSeeXmlResponseMatchesXpath() + */ + public function dontSeeXmlResponseMatchesXpath($xpath) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeXmlResponseMatchesXpath', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Finds and returns text contents of element. + * Element is matched by either CSS or XPath + * + * @param $cssOrXPath + * @return string + * @part xml + * @see \Codeception\Module\REST::grabTextContentFromXmlElement() + */ + public function grabTextContentFromXmlElement($cssOrXPath) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('grabTextContentFromXmlElement', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Finds and returns attribute of element. + * Element is matched by either CSS or XPath + * + * @param $cssOrXPath + * @param $attribute + * @return string + * @part xml + * @see \Codeception\Module\REST::grabAttributeFromXmlElement() + */ + public function grabAttributeFromXmlElement($cssOrXPath, $attribute) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('grabAttributeFromXmlElement', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks XML response equals provided XML. + * Comparison is done by canonicalizing both xml`s. + * + * Parameters can be passed either as DOMDocument, DOMNode, XML string, or array (if no attributes). + * + * @param $xml + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeXmlResponseEquals() + */ + public function canSeeXmlResponseEquals($xml) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeXmlResponseEquals', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks XML response equals provided XML. + * Comparison is done by canonicalizing both xml`s. + * + * Parameters can be passed either as DOMDocument, DOMNode, XML string, or array (if no attributes). + * + * @param $xml + * @part xml + * @see \Codeception\Module\REST::seeXmlResponseEquals() + */ + public function seeXmlResponseEquals($xml) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeXmlResponseEquals', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks XML response does not equal to provided XML. + * Comparison is done by canonicalizing both xml`s. + * + * Parameter can be passed either as XmlBuilder, DOMDocument, DOMNode, XML string, or array (if no attributes). + * + * @param $xml + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeXmlResponseEquals() + */ + public function cantSeeXmlResponseEquals($xml) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeXmlResponseEquals', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks XML response does not equal to provided XML. + * Comparison is done by canonicalizing both xml`s. + * + * Parameter can be passed either as XmlBuilder, DOMDocument, DOMNode, XML string, or array (if no attributes). + * + * @param $xml + * @part xml + * @see \Codeception\Module\REST::dontSeeXmlResponseEquals() + */ + public function dontSeeXmlResponseEquals($xml) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeXmlResponseEquals', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks XML response includes provided XML. + * Comparison is done by canonicalizing both xml`s. + * Parameter can be passed either as XmlBuilder, DOMDocument, DOMNode, XML string, or array (if no attributes). + * + * Example: + * + * ``` php + * seeXmlResponseIncludes("1"); + * ?> + * ``` + * + * @param $xml + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeXmlResponseIncludes() + */ + public function canSeeXmlResponseIncludes($xml) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeXmlResponseIncludes', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks XML response includes provided XML. + * Comparison is done by canonicalizing both xml`s. + * Parameter can be passed either as XmlBuilder, DOMDocument, DOMNode, XML string, or array (if no attributes). + * + * Example: + * + * ``` php + * seeXmlResponseIncludes("1"); + * ?> + * ``` + * + * @param $xml + * @part xml + * @see \Codeception\Module\REST::seeXmlResponseIncludes() + */ + public function seeXmlResponseIncludes($xml) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeXmlResponseIncludes', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks XML response does not include provided XML. + * Comparison is done by canonicalizing both xml`s. + * Parameter can be passed either as XmlBuilder, DOMDocument, DOMNode, XML string, or array (if no attributes). + * + * @param $xml + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeXmlResponseIncludes() + */ + public function cantSeeXmlResponseIncludes($xml) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeXmlResponseIncludes', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks XML response does not include provided XML. + * Comparison is done by canonicalizing both xml`s. + * Parameter can be passed either as XmlBuilder, DOMDocument, DOMNode, XML string, or array (if no attributes). + * + * @param $xml + * @part xml + * @see \Codeception\Module\REST::dontSeeXmlResponseIncludes() + */ + public function dontSeeXmlResponseIncludes($xml) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeXmlResponseIncludes', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if the hash of a binary response is exactly the same as provided. + * Parameter can be passed as any hash string supported by hash(), with an + * optional second parameter to specify the hash type, which defaults to md5. + * + * Example: Using md5 hash key + * + * ```php + * seeBinaryResponseEquals("8c90748342f19b195b9c6b4eff742ded"); + * ?> + * ``` + * + * Example: Using md5 for a file contents + * + * ```php + * seeBinaryResponseEquals(md5($fileData)); + * ?> + * ``` + * Example: Using sha256 hash + * + * ```php + * seeBinaryResponseEquals(hash("sha256", base64_decode($fileData)), 'sha256'); + * ?> + * ``` + * + * @param $hash the hashed data response expected + * @param $algo the hash algorithm to use. Default md5. + * @part json + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::seeBinaryResponseEquals() + */ + public function canSeeBinaryResponseEquals($hash, $algo = null) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeBinaryResponseEquals', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if the hash of a binary response is exactly the same as provided. + * Parameter can be passed as any hash string supported by hash(), with an + * optional second parameter to specify the hash type, which defaults to md5. + * + * Example: Using md5 hash key + * + * ```php + * seeBinaryResponseEquals("8c90748342f19b195b9c6b4eff742ded"); + * ?> + * ``` + * + * Example: Using md5 for a file contents + * + * ```php + * seeBinaryResponseEquals(md5($fileData)); + * ?> + * ``` + * Example: Using sha256 hash + * + * ```php + * seeBinaryResponseEquals(hash("sha256", base64_decode($fileData)), 'sha256'); + * ?> + * ``` + * + * @param $hash the hashed data response expected + * @param $algo the hash algorithm to use. Default md5. + * @part json + * @part xml + * @see \Codeception\Module\REST::seeBinaryResponseEquals() + */ + public function seeBinaryResponseEquals($hash, $algo = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeBinaryResponseEquals', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if the hash of a binary response is not the same as provided. + * + * ```php + * dontSeeBinaryResponseEquals("8c90748342f19b195b9c6b4eff742ded"); + * ?> + * ``` + * Opposite to `seeBinaryResponseEquals` + * + * @param $hash the hashed data response expected + * @param $algo the hash algorithm to use. Default md5. + * @part json + * @part xml + * Conditional Assertion: Test won't be stopped on fail + * @see \Codeception\Module\REST::dontSeeBinaryResponseEquals() + */ + public function cantSeeBinaryResponseEquals($hash, $algo = null) { + return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeBinaryResponseEquals', func_get_args())); + } + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Checks if the hash of a binary response is not the same as provided. + * + * ```php + * dontSeeBinaryResponseEquals("8c90748342f19b195b9c6b4eff742ded"); + * ?> + * ``` + * Opposite to `seeBinaryResponseEquals` + * + * @param $hash the hashed data response expected + * @param $algo the hash algorithm to use. Default md5. + * @part json + * @part xml + * @see \Codeception\Module\REST::dontSeeBinaryResponseEquals() + */ + public function dontSeeBinaryResponseEquals($hash, $algo = null) { + return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeBinaryResponseEquals', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Deprecated since 2.0.9 and removed since 2.1.0 + * + * @param $path + * @throws ModuleException + * @deprecated + * @see \Codeception\Module\REST::grabDataFromJsonResponse() + */ + public function grabDataFromJsonResponse($path) { + return $this->getScenario()->runStep(new \Codeception\Step\Action('grabDataFromJsonResponse', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Prevents automatic redirects to be followed by the client + * + * ```php + * stopFollowingRedirects(); + * ``` + * + * @part xml + * @part json + * @see \Codeception\Module\REST::stopFollowingRedirects() + */ + public function stopFollowingRedirects() { + return $this->getScenario()->runStep(new \Codeception\Step\Action('stopFollowingRedirects', func_get_args())); + } + + + /** + * [!] Method is generated. Documentation taken from corresponding module. + * + * Enables automatic redirects to be followed by the client + * + * ```php + * startFollowingRedirects(); + * ``` + * + * @part xml + * @part json + * @see \Codeception\Module\REST::startFollowingRedirects() + */ + public function startFollowingRedirects() { + return $this->getScenario()->runStep(new \Codeception\Step\Action('startFollowingRedirects', func_get_args())); + } +} diff --git a/tests/api.suite.yml b/tests/api.suite.yml index 5152a9f..1e4a9b8 100644 --- a/tests/api.suite.yml +++ b/tests/api.suite.yml @@ -1,8 +1,7 @@ class_name: ApiTester modules: - enabled: [PhpBrowser, REST, ApiHelper] - config: - PhpBrowser: - url: http://saman-ussd.dev - REST: - url: http://saman-ussd.dev/tests/api \ No newline at end of file + enabled: + - REST: + depends: PhpBrowser + url: http://127.0.0.1:8000/tests/api/ + - ApiHelper: \ No newline at end of file diff --git a/tests/api/webservice.php b/tests/api/webservice.php index 5f31614..4d48cc9 100644 --- a/tests/api/webservice.php +++ b/tests/api/webservice.php @@ -36,7 +36,7 @@ ->successful(); }); -$endpoint = 'http://saman-ussd.dev/tests/api/webservice.php'; +$endpoint = 'http://web/tests/api/webservice.php'; $samanUssd->endpoint($endpoint); $samanUssd->handle(); \ No newline at end of file