diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..e58a6c6 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,50 @@ +name: CI + +on: [push, pull_request] + +jobs: + tests: + runs-on: ubuntu-latest + + strategy: + matrix: + php: [5.6, 7.0, 7.1, 7.4, 8.0] + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: zip, pdo, sqlite + coverage: none + + - name: Checkout Laravel Sample + uses: actions/checkout@v2 + with: + repository: codeception/codeception-laravel5-sample + path: framework-tests + ref: codeception-4.1 + + - name: Install Laravel Sample + run: | + composer remove --no-update --dev codeception/module-laravel5 + composer update --no-dev --prefer-dist --no-interaction + cp .env.testing .env + touch storage/testing.sqlite + php artisan migrate --env=testing --database=sqlite_testing --force + php artisan config:clear + working-directory: framework-tests + + - name: Validate composer.json and composer.lock + run: composer validate + + - name: Install dependencies + run: composer install --prefer-dist --no-progress --no-interaction --no-suggest + + - name: Run test suite + run: | + php vendor/bin/codecept build -c framework-tests + php vendor/bin/codecept run functional -c framework-tests diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9d2ba47..0000000 --- a/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: php - -php: - - 5.6 - - 7.0 - - 7.1 - - 7.2 - - 7.3 - -# faster builds on new travis setup not using sudo -sudo: false - -services: - - mysql - -install: - - '[[ -z "$CI_USER_TOKEN" ]] || composer config github-oauth.github.com ${CI_USER_TOKEN};' - - travis_retry composer self-update && composer --version - - travis_retry composer update --prefer-dist --no-interaction - - git clone -q --depth=1 -b codeception-3.0 https://github.com/codeception/codeception-laravel5-sample.git framework-tests - - git --git-dir framework-tests/.git log -n 1 - - travis_retry composer update -d framework-tests --no-dev --prefer-dist --no-interaction - - php ./vendor/bin/codecept build -c framework-tests - -before_script: - - touch framework-tests/storage/testing.sqlite - - php framework-tests/artisan migrate --env=testing --database=sqlite_testing --force - - php framework-tests/artisan config:clear -script: - - php ./vendor/bin/codecept run functional -c framework-tests diff --git a/Robofile.php b/Robofile.php deleted file mode 100644 index 50d7575..0000000 --- a/Robofile.php +++ /dev/null @@ -1,21 +0,0 @@ - 

Module reference is taken from the source code. Help us to improve documentation. Edit module reference
'; - $documentationFile = 'documentation.md'; - $this->generateDocumentationForClass($className, $documentationFile, $sourceMessage); - } -} \ No newline at end of file diff --git a/composer.json b/composer.json index e29d008..c9436ed 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name":"codeception/module-laravel5", "description":"Codeception module for Laravel 5 framework", "keywords":["codeception", "laravel5"], - "homepage":"http://codeception.com/", + "homepage":"https://codeception.com/", "type":"library", "license":"MIT", "authors":[ @@ -14,14 +14,12 @@ } ], "minimum-stability": "RC", - "require": { - "php": ">=5.6.0 <8.0", + "php": ">=5.6.0 <9.0", "codeception/lib-innerbrowser": "^1.0", "codeception/codeception": "^4.0" }, "require-dev": { - "codeception/util-robohelpers": "dev-master", "codeception/module-asserts": "^1.0", "codeception/module-rest": "^1.0" }, diff --git a/documentation.md b/documentation.md deleted file mode 100644 index 48683f0..0000000 --- a/documentation.md +++ /dev/null @@ -1,1982 +0,0 @@ -# Laravel5 - - - -This module allows you to run functional tests for Laravel 5.1+ -It should **not** be used for acceptance tests. -See the Acceptance tests section below for more details. - -## Demo project - - -## Config - -* cleanup: `boolean`, default `true` - all database queries will be run in a transaction, - which will be rolled back at the end of each test. -* run_database_migrations: `boolean`, default `false` - run database migrations before each test. -* database_migrations_path: `string`, default `null` - path to the database migrations, relative to the root of the application. -* run_database_seeder: `boolean`, default `false` - run database seeder before each test. -* database_seeder_class: `string`, default `` - database seeder class name. -* environment_file: `string`, default `.env` - the environment file to load for the tests. -* bootstrap: `string`, default `bootstrap/app.php` - relative path to app.php config file. -* root: `string`, default `` - root path of the application. -* packages: `string`, default `workbench` - root path of application packages (if any). -* vendor_dir: `string`, default `vendor` - optional relative path to vendor directory. -* disable_exception_handling: `boolean`, default `true` - disable Laravel exception handling. -* disable_middleware: `boolean`, default `false` - disable all middleware. -* disable_events: `boolean`, default `false` - disable events (does not disable model events). -* disable_model_events: `boolean`, default `false` - disable model events. -* url: `string`, default `` - the application URL. - -### Example #1 (`functional.suite.yml`) - -Enabling module: - -```yml -modules: - enabled: - - Laravel5 -``` - -### Example #2 (`functional.suite.yml`) - -Enabling module with custom .env file - -```yml -modules: - enabled: - - Laravel5: - environment_file: .env.testing -``` - -## API - -* app - `Illuminate\Foundation\Application` -* config - `array` - -## Parts - -* ORM - only include the database methods of this module: - * have - * haveMultiple - * haveRecord - * grabRecord - * seeRecord - * dontSeeRecord - -## Acceptance tests - -You should not use this module for acceptance tests. -If you want to use Eloquent within your acceptance tests (paired with WebDriver) enable only -ORM part of this module: - -### Example (`acceptance.suite.yml`) - -```yaml -modules: - enabled: - - WebDriver: - browser: chrome - url: http://127.0.0.1:8000 - - Laravel5: - part: ORM - environment_file: .env.testing -``` - -## Actions - -### _findElements - -*hidden API method, expected to be used from Helper classes* - -Locates element using available Codeception locator types: - -* XPath -* CSS -* Strict Locator - -Use it in Helpers or GroupObject or Extension classes: - -```php -getModule('Laravel5')->_findElements('.items'); -$els = $this->getModule('Laravel5')->_findElements(['name' => 'username']); - -$editLinks = $this->getModule('Laravel5')->_findElements(['link' => 'Edit']); -// now you can iterate over $editLinks and check that all them have valid hrefs -``` - -WebDriver module returns `Facebook\WebDriver\Remote\RemoteWebElement` instances -PhpBrowser and Framework modules return `Symfony\Component\DomCrawler\Crawler` instances - - * `param` $locator - * `return` array of interactive elements - - -### _getResponseContent - -*hidden API method, expected to be used from Helper classes* - -Returns content of the last response -Use it in Helpers when you want to retrieve response of request performed by another module. - -```php -assertStringContainsString($text, $this->getModule('Laravel5')->_getResponseContent(), "response contains"); -} -?> -``` - - * `return` string -@throws ModuleException - - -### _loadPage - -*hidden API method, expected to be used from Helper classes* - -Opens a page with arbitrary request parameters. -Useful for testing multi-step forms on a specific step. - -```php -getModule('Laravel5')->_loadPage('POST', '/checkout/step2', ['order' => $orderId]); -} -?> -``` - - * `param` $method - * `param` $uri - * `param array` $parameters - * `param array` $files - * `param array` $server - * `param null` $content - - -### _request - -*hidden API method, expected to be used from Helper classes* - -Send custom request to a backend using method, uri, parameters, etc. -Use it in Helpers to create special request actions, like accessing API -Returns a string with response body. - -```php -getModule('Laravel5')->_request('POST', '/api/v1/users', ['name' => $name]); - $user = json_decode($userData); - return $user->id; -} -?> -``` -Does not load the response into the module so you can't interact with response page (click, fill forms). -To load arbitrary page for interaction, use `_loadPage` method. - - * `param` $method - * `param` $uri - * `param array` $parameters - * `param array` $files - * `param array` $server - * `param null` $content - * `return` mixed|Crawler -@throws ExternalUrlException -@see `_loadPage` - - -### _savePageSource - -*hidden API method, expected to be used from Helper classes* - -Saves page source of to a file - -```php -$this->getModule('Laravel5')->_savePageSource(codecept_output_dir().'page.html'); -``` - * `param` $filename - - -### amHttpAuthenticated - -Authenticates user for HTTP_AUTH - - * `param` $username - * `param` $password - - -### amLoggedAs - -Set the currently logged in user for the application. -Takes either an object that implements the User interface or -an array of credentials. - -``` php -amLoggedAs(['username' => 'jane@example.com', 'password' => 'password']); - -// provide User object -$I->amLoggedAs( new User ); - -// can be verified with $I->seeAuthentication(); -?> -``` - * `param` \Illuminate\Contracts\Auth\User|array $user - * `param` string|null $driver The authentication driver for Laravel <= 5.1.*, guard name for Laravel >= 5.2 - * `return` void - - -### amOnAction - -Opens web page by action name - -``` php -amOnAction('PostsController@index'); -?> -``` - - * `param` $action - * `param array` $params - - -### amOnPage - -Opens the page for the given relative URI. - -``` php -amOnPage('/'); -// opens /register page -$I->amOnPage('/register'); -``` - - * `param string` $page - - -### amOnRoute - -Opens web page using route name and parameters. - -``` php -amOnRoute('posts.create'); -?> -``` - - * `param` $routeName - * `param array` $params - - -### attachFile - -Attaches a file relative to the Codeception `_data` directory to the given file upload field. - -``` php -attachFile('input[@type="file"]', 'prices.xls'); -?> -``` - - * `param` $field - * `param` $filename - - -### callArtisan - -Call an Artisan command. - -``` php -callArtisan('command:name'); -$I->callArtisan('command:name', ['parameter' => 'value']); -``` -Use 3rd parameter to pass in custom `OutputInterface` - - * `param string` $command - * `param array` $parameters - * `param OutputInterface` $output - * `return` string - - -### checkOption - -Ticks a checkbox. For radio buttons, use the `selectOption` method instead. - -``` php -checkOption('#agree'); -?> -``` - - * `param` $option - - -### clearApplicationHandlers - -Clear the registered application handlers. - -``` php -clearApplicationHandlers(); -?> -``` - - - -### click - -Perform a click on a link or a button, given by a locator. -If a fuzzy locator is given, the page will be searched for a button, link, or image matching the locator string. -For buttons, the "value" attribute, "name" attribute, and inner text are searched. -For links, the link text is searched. -For images, the "alt" attribute and inner text of any parent links are searched. - -The second parameter is a context (CSS or XPath locator) to narrow the search. - -Note that if the locator matches a button of type `submit`, the form will be submitted. - -``` php -click('Logout'); -// button of form -$I->click('Submit'); -// CSS button -$I->click('#form input[type=submit]'); -// XPath -$I->click('//form/*[@type="submit"]'); -// link in context -$I->click('Logout', '#nav'); -// using strict locator -$I->click(['link' => 'Login']); -?> -``` - - * `param` $link - * `param` $context - - -### deleteHeader - -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->amOnPage('test-headers.php'); -// ... -$I->deleteHeader('X-Requested-With'); -$I->amOnPage('some-other-page.php'); -?> -``` - - * `param string` $name the name of the header to delete. - - -### disableEvents - -Disable events for the next requests. -This method does not disable model events. -To disable model events you have to use the disableModelEvents() method. - -``` php -disableEvents(); -?> -``` - - -### disableExceptionHandling - -Disable Laravel exception handling. - -``` php -disableExceptionHandling(); -?> -``` - - -### disableMiddleware - -Disable middleware for the next requests. - -``` php -disableMiddleware(); -?> -``` - - -### disableModelEvents - -Disable model events for the next requests. - -``` php -disableModelEvents(); -?> -``` - - -### dontSee - -Checks that the current page doesn't contain the text specified (case insensitive). -Give a locator as the second parameter to match a specific region. - -```php -dontSee('Login'); // I can suppose user is already logged in -$I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page -$I->dontSee('Sign Up','//body/h1'); // with XPath -$I->dontSee('Sign Up', ['css' => 'body h1']); // with strict CSS locator -``` - -Note that the search is done after stripping all HTML tags from the body, -so `$I->dontSee('strong')` will fail on strings like: - - - `

I am Stronger than thou

` - - `` - -But will ignore strings like: - - - `Home` - - `
Home` - - `` - -For checking the raw source code, use `seeInSource()`. - - * `param string` $text - * `param array|string` $selector optional - - -### dontSeeAuthentication - -Check that user is not authenticated. -You can specify the guard that should be use for Laravel >= 5.2. - * `param string|null` $guard - - -### dontSeeCheckboxIsChecked - -Check that the specified checkbox is unchecked. - -``` php -dontSeeCheckboxIsChecked('#agree'); // I suppose user didn't agree to terms -$I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user didn't check the first checkbox in form. -?> -``` - - * `param` $checkbox - - -### dontSeeCookie - -Checks that there isn't a cookie with the given name. -You can set additional cookie params like `domain`, `path` as array passed in last argument. - - * `param` $cookie - - * `param array` $params - - -### dontSeeCurrentUrlEquals - -Checks that the current URL doesn't equal the given string. -Unlike `dontSeeInCurrentUrl`, this only matches the full URL. - -``` php -dontSeeCurrentUrlEquals('/'); -?> -``` - - * `param string` $uri - - -### dontSeeCurrentUrlMatches - -Checks that current url doesn't match the given regular expression. - -``` php -dontSeeCurrentUrlMatches('~^/users/(\d+)~'); -?> -``` - - * `param string` $uri - - -### dontSeeElement - -Checks that the given element is invisible or not present on the page. -You can also specify expected attributes of this element. - -``` php -dontSeeElement('.error'); -$I->dontSeeElement('//form/input[1]'); -$I->dontSeeElement('input', ['name' => 'login']); -$I->dontSeeElement('input', ['value' => '123456']); -?> -``` - - * `param` $selector - * `param array` $attributes - - -### dontSeeEventTriggered - -Make sure events did not fire during the test. - -``` php -dontSeeEventTriggered('App\MyEvent'); -$I->dontSeeEventTriggered(new App\Events\MyEvent()); -$I->dontSeeEventTriggered('App\MyEvent', 'App\MyOtherEvent'); -$I->dontSeeEventTriggered(['App\MyEvent', 'App\MyOtherEvent']); -?> -``` - * `param` $events - - -### dontSeeFormErrors - -Assert that there are no form errors bound to the View. - -``` php -dontSeeFormErrors(); -?> -``` - - * `return` void - - -### dontSeeInCurrentUrl - -Checks that the current URI doesn't contain the given string. - -``` php -dontSeeInCurrentUrl('/users/'); -?> -``` - - * `param string` $uri - - -### dontSeeInField - -Checks that an input field or textarea doesn't contain the given value. -For fuzzy locators, the field is matched by label text, CSS and XPath. - -``` php -dontSeeInField('Body','Type your comment here'); -$I->dontSeeInField('form textarea[name=body]','Type your comment here'); -$I->dontSeeInField('form input[type=hidden]','hidden_value'); -$I->dontSeeInField('#searchform input','Search'); -$I->dontSeeInField('//form/*[@name=search]','Search'); -$I->dontSeeInField(['name' => 'search'], 'Search'); -?> -``` - - * `param` $field - * `param` $value - - -### dontSeeInFormFields - -Checks if the array of form parameters (name => value) are not set on the form matched with -the passed selector. - -``` php -dontSeeInFormFields('form[name=myform]', [ - 'input1' => 'non-existent value', - 'input2' => 'other non-existent value', -]); -?> -``` - -To check that an element hasn't been assigned any one of many values, an array can be passed -as the value: - -``` php -dontSeeInFormFields('.form-class', [ - 'fieldName' => [ - 'This value shouldn\'t be set', - 'And this value shouldn\'t be set', - ], -]); -?> -``` - -Additionally, checkbox values can be checked with a boolean. - -``` php -dontSeeInFormFields('#form-id', [ - 'checkbox1' => true, // fails if checked - 'checkbox2' => false, // fails if unchecked -]); -?> -``` - - * `param` $formSelector - * `param` $params - - -### dontSeeInSource - -Checks that the current page contains the given string in its -raw source code. - -```php -dontSeeInSource('

Green eggs & ham

'); -``` - - * `param` $raw - - -### dontSeeInTitle - -Checks that the page title does not contain the given string. - - * `param` $title - - - -### dontSeeLink - -Checks that the page doesn't contain a link with the given string. -If the second parameter is given, only links with a matching "href" attribute will be checked. - -``` php -dontSeeLink('Logout'); // I suppose user is not logged in -$I->dontSeeLink('Checkout now', '/store/cart.php'); -?> -``` - - * `param string` $text - * `param string` $url optional - - -### dontSeeOptionIsSelected - -Checks that the given option is not selected. - -``` php -dontSeeOptionIsSelected('#form input[name=payment]', 'Visa'); -?> -``` - - * `param` $selector - * `param` $optionText - - - -### dontSeeRecord - -Checks that record does not exist in database. -You can pass the name of a database table or the class name of an Eloquent model as the first argument. - -``` php -dontSeeRecord('users', array('name' => 'davert')); -$I->dontSeeRecord('App\User', array('name' => 'davert')); -?> -``` - - * `param string` $table - * `param array` $attributes - * `[Part]` orm - - -### dontSeeResponseCodeIs - -Checks that response code is equal to value provided. - -```php -dontSeeResponseCodeIs(200); - -// recommended \Codeception\Util\HttpCode -$I->dontSeeResponseCodeIs(\Codeception\Util\HttpCode::OK); -``` - * `param` $code - - -### enableExceptionHandling - -Enable Laravel exception handling. - -``` php -enableExceptionHandling(); -?> -``` - - -### fillField - -Fills a text field or textarea with the given string. - -``` php -fillField("//input[@type='text']", "Hello World!"); -$I->fillField(['name' => 'email'], 'jon@mail.com'); -?> -``` - - * `param` $field - * `param` $value - - -### getApplication - -Provides access the Laravel application object. - - * `return` \Illuminate\Foundation\Application - - -### grabAttributeFrom - -Grabs the value of the given attribute value from the given element. -Fails if element is not found. - -``` php -grabAttributeFrom('#tooltip', 'title'); -?> -``` - - * `param` $cssOrXpath - * `param` $attribute - - - -### grabCookie - -Grabs a cookie value. -You can set additional cookie params like `domain`, `path` in array passed as last argument. - - * `param` $cookie - - * `param array` $params - - -### grabFromCurrentUrl - -Executes the given regular expression against the current URI and returns the first capturing group. -If no parameters are provided, the full URI is returned. - -``` php -grabFromCurrentUrl('~^/user/(\d+)/~'); -$uri = $I->grabFromCurrentUrl(); -?> -``` - - * `param string` $uri optional - - - -### grabMultiple - -Grabs either the text content, or attribute values, of nodes -matched by $cssOrXpath and returns them as an array. - -```html -First -Second -Third -``` - -```php -grabMultiple('a'); - -// would return ['#first', '#second', '#third'] -$aLinks = $I->grabMultiple('a', 'href'); -?> -``` - - * `param` $cssOrXpath - * `param` $attribute - * `return` string[] - - -### grabNumRecords - -Retrieves number of records from database -You can pass the name of a database table or the class name of an Eloquent model as the first argument. - -``` php -grabNumRecords('users', array('name' => 'davert')); -$I->grabNumRecords('App\User', array('name' => 'davert')); -?> -``` - - * `param string` $table - * `param array` $attributes - * `return` integer - * `[Part]` orm - - -### grabPageSource - -Grabs current page source code. - -@throws ModuleException if no page was opened. - - * `return` string Current page source code. - - -### grabRecord - -Retrieves record from database -If you pass the name of a database table as the first argument, this method returns an array. -You can also pass the class name of an Eloquent model, in that case this method returns an Eloquent model. - -``` php -grabRecord('users', array('name' => 'davert')); // returns array -$record = $I->grabRecord('App\User', array('name' => 'davert')); // returns Eloquent model -?> -``` - - * `param string` $table - * `param array` $attributes - * `return` array|EloquentModel - * `[Part]` orm - - -### grabService - -Return an instance of a class from the Laravel service container. -(https://laravel.com/docs/master/container) - -``` php -grabService('foo'); - -// Will return an instance of FooBar, also works for singletons. -?> -``` - - * `param` string $class - - -### grabTextFrom - -Finds and returns the text contents of the given element. -If a fuzzy locator is used, the element is found using CSS, XPath, -and by matching the full page source by regular expression. - -``` php -grabTextFrom('h1'); -$heading = $I->grabTextFrom('descendant-or-self::h1'); -$value = $I->grabTextFrom('~ -``` - - * `param` $cssOrXPathOrRegex - - - -### grabValueFrom - - * `param` $field - - * `return` array|mixed|null|string - - -### have - -Use Laravel's model factory to create a model. -Can only be used with Laravel 5.1 and later. - -``` php -have('App\User'); -$I->have('App\User', ['name' => 'John Doe']); -$I->have('App\User', [], 'admin'); -?> -``` - -@see http://laravel.com/docs/5.1/testing#model-factories - * `param string` $model - * `param array` $attributes - * `param string` $name - * `[Part]` orm - - -### haveApplicationHandler - -Register a handler than can be used to modify the Laravel application object after it is initialized. -The Laravel application object will be passed as an argument to the handler. - -``` php -haveApplicationHandler(function($app) { - $app->make('config')->set(['test_value' => '10']); -}); -?> -``` - - * `param` $handler - - -### haveBinding - -Add a binding to the Laravel service container. -(https://laravel.com/docs/master/container) - -``` php -haveBinding('My\Interface', 'My\Implementation'); -?> -``` - - * `param` $abstract - * `param` $concrete - - -### haveContextualBinding - -Add a contextual binding to the Laravel service container. -(https://laravel.com/docs/master/container) - -``` php -haveContextualBinding('My\Class', '$variable', 'value'); - -// This is similar to the following in your Laravel application -$app->when('My\Class') - ->needs('$variable') - ->give('value'); -?> -``` - - * `param` $concrete - * `param` $abstract - * `param` $implementation - - -### haveHttpHeader - -Sets the HTTP header to the passed value - which is used on -subsequent HTTP requests through PhpBrowser. - -Example: -```php -haveHttpHeader('X-Requested-With', 'Codeception'); -$I->amOnPage('test-headers.php'); -?> -``` - -To use special chars in Header Key use HTML Character Entities: -Example: -Header with underscore - 'Client_Id' -should be represented as - 'Client_Id' or 'Client_Id' - -```php -haveHttpHeader('Client_Id', 'Codeception'); -?> -``` - - * `param string` $name the name of the request header - * `param string` $value the value to set it to for subsequent - requests - - -### haveInstance - -Add an instance binding to the Laravel service container. -(https://laravel.com/docs/master/container) - -``` php -haveInstance('My\Class', new My\Class()); -?> -``` - - * `param` $abstract - * `param` $instance - - -### haveMultiple - -Use Laravel's model factory to create multiple models. -Can only be used with Laravel 5.1 and later. - -``` php -haveMultiple('App\User', 10); -$I->haveMultiple('App\User', 10, ['name' => 'John Doe']); -$I->haveMultiple('App\User', 10, [], 'admin'); -?> -``` - -@see http://laravel.com/docs/5.1/testing#model-factories - * `param string` $model - * `param int` $times - * `param array` $attributes - * `param string` $name - * `[Part]` orm - - -### haveRecord - -Inserts record into the database. -If you pass the name of a database table as the first argument, this method returns an integer ID. -You can also pass the class name of an Eloquent model, in that case this method returns an Eloquent model. - -``` php -haveRecord('users', array('name' => 'Davert')); // returns integer -$user = $I->haveRecord('App\User', array('name' => 'Davert')); // returns Eloquent model -?> -``` - - * `param string` $table - * `param array` $attributes - * `return` EloquentModel|int -@throws \RuntimeException - * `[Part]` orm - - -### haveSingleton - -Add a singleton binding to the Laravel service container. -(https://laravel.com/docs/master/container) - -``` php -haveSingleton('My\Interface', 'My\Singleton'); -?> -``` - - * `param` $abstract - * `param` $concrete - - -### logout - -Logout user. - - -### make - -Use Laravel's model factory to make a model instance. -Can only be used with Laravel 5.1 and later. - -``` php -make('App\User'); -$I->make('App\User', ['name' => 'John Doe']); -$I->make('App\User', [], 'admin'); -?> -``` - -@see http://laravel.com/docs/5.1/testing#model-factories - * `param string` $model - * `param array` $attributes - * `param string` $name - * `[Part]` orm - - -### makeHtmlSnapshot - -Saves current page's HTML into a temprary file. -Use this method in debug mode within an interactive pause to get a source code of current page. - -```php -makeHtmlSnapshot('edit_page'); -// saved to: tests/_output/debug/edit_page.html -$I->makeHtmlSnapshot(); -// saved to: tests/_output/debug/2017-05-26_14-24-11_4b3403665fea6.html -``` - - * `param null` $name - - -### makeMultiple - -Use Laravel's model factory to make multiple model instances. -Can only be used with Laravel 5.1 and later. - -``` php -makeMultiple('App\User', 10); -$I->makeMultiple('App\User', 10, ['name' => 'John Doe']); -$I->makeMultiple('App\User', 10, [], 'admin'); -?> -``` - -@see http://laravel.com/docs/5.1/testing#model-factories - * `param string` $model - * `param int` $times - * `param array` $attributes - * `param string` $name - * `[Part]` orm - - -### moveBack - -Moves back in history. - - * `param int` $numberOfSteps (default value 1) - - -### resetCookie - -Unsets cookie with the given name. -You can set additional cookie params like `domain`, `path` in array passed as last argument. - - * `param` $cookie - - * `param array` $params - - -### see - -Checks that the current page contains the given string (case insensitive). - -You can specify a specific HTML element (via CSS or XPath) as the second -parameter to only search within that element. - -``` php -see('Logout'); // I can suppose user is logged in -$I->see('Sign Up', 'h1'); // I can suppose it's a signup page -$I->see('Sign Up', '//body/h1'); // with XPath -$I->see('Sign Up', ['css' => 'body h1']); // with strict CSS locator -``` - -Note that the search is done after stripping all HTML tags from the body, -so `$I->see('strong')` will return true for strings like: - - - `

I am Stronger than thou

` - - `` - -But will *not* be true for strings like: - - - `Home` - - `
Home` - - `` - -For checking the raw source code, use `seeInSource()`. - - * `param string` $text - * `param array|string` $selector optional - - -### seeAuthentication - -Checks that a user is authenticated. -You can specify the guard that should be use for Laravel >= 5.2. - * `param string|null` $guard - - -### seeCheckboxIsChecked - -Checks that the specified checkbox is checked. - -``` php -seeCheckboxIsChecked('#agree'); // I suppose user agreed to terms -$I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user agreed to terms, If there is only one checkbox in form. -$I->seeCheckboxIsChecked('//form/input[@type=checkbox and @name=agree]'); -?> -``` - - * `param` $checkbox - - -### seeCookie - -Checks that a cookie with the given name is set. -You can set additional cookie params like `domain`, `path` as array passed in last argument. - -``` php -seeCookie('PHPSESSID'); -?> -``` - - * `param` $cookie - * `param array` $params - - -### seeCurrentActionIs - -Checks that current url matches action - -``` php -seeCurrentActionIs('PostsController@index'); -?> -``` - - * `param` $action - - -### seeCurrentRouteIs - -Checks that current url matches route - -``` php -seeCurrentRouteIs('posts.index'); -?> -``` - * `param` $routeName - - -### seeCurrentUrlEquals - -Checks that the current URL is equal to the given string. -Unlike `seeInCurrentUrl`, this only matches the full URL. - -``` php -seeCurrentUrlEquals('/'); -?> -``` - - * `param string` $uri - - -### seeCurrentUrlMatches - -Checks that the current URL matches the given regular expression. - -``` php -seeCurrentUrlMatches('~^/users/(\d+)~'); -?> -``` - - * `param string` $uri - - -### seeElement - -Checks that the given element exists on the page and is visible. -You can also specify expected attributes of this element. - -``` php -seeElement('.error'); -$I->seeElement('//form/input[1]'); -$I->seeElement('input', ['name' => 'login']); -$I->seeElement('input', ['value' => '123456']); - -// strict locator in first arg, attributes in second -$I->seeElement(['css' => 'form input'], ['name' => 'login']); -?> -``` - - * `param` $selector - * `param array` $attributes -@return - - -### seeEventTriggered - -Make sure events fired during the test. - -``` php -seeEventTriggered('App\MyEvent'); -$I->seeEventTriggered(new App\Events\MyEvent()); -$I->seeEventTriggered('App\MyEvent', 'App\MyOtherEvent'); -$I->seeEventTriggered(['App\MyEvent', 'App\MyOtherEvent']); -?> -``` - * `param` $events - - -### seeFormErrorMessage - -Assert that a specific form error message is set in the view. - -If you want to assert that there is a form error message for a specific key -but don't care about the actual error message you can omit `$expectedErrorMessage`. - -If you do pass `$expectedErrorMessage`, this method checks if the actual error message for a key -contains `$expectedErrorMessage`. - -``` php -seeFormErrorMessage('username'); -$I->seeFormErrorMessage('username', 'Invalid Username'); -?> -``` - * `param string` $key - * `param string|null` $expectedErrorMessage - - -### seeFormErrorMessages - -Assert that specific form error messages are set in the view. - -This method calls `seeFormErrorMessage` for each entry in the `$bindings` array. - -``` php -seeFormErrorMessages([ - 'username' => 'Invalid Username', - 'password' => null, -]); -?> -``` - * `param array` $bindings - - -### seeFormHasErrors - -Assert that form errors are bound to the View. - -``` php -seeFormHasErrors(); -?> -``` - - * `return` void - - -### seeInCurrentUrl - -Checks that current URI contains the given string. - -``` php -seeInCurrentUrl('home'); -// to match: /users/1 -$I->seeInCurrentUrl('/users/'); -?> -``` - - * `param string` $uri - - -### seeInField - -Checks that the given input field or textarea *equals* (i.e. not just contains) the given value. -Fields are matched by label text, the "name" attribute, CSS, or XPath. - -``` php -seeInField('Body','Type your comment here'); -$I->seeInField('form textarea[name=body]','Type your comment here'); -$I->seeInField('form input[type=hidden]','hidden_value'); -$I->seeInField('#searchform input','Search'); -$I->seeInField('//form/*[@name=search]','Search'); -$I->seeInField(['name' => 'search'], 'Search'); -?> -``` - - * `param` $field - * `param` $value - - -### seeInFormFields - -Checks if the array of form parameters (name => value) are set on the form matched with the -passed selector. - -``` php -seeInFormFields('form[name=myform]', [ - 'input1' => 'value', - 'input2' => 'other value', -]); -?> -``` - -For multi-select elements, or to check values of multiple elements with the same name, an -array may be passed: - -``` php -seeInFormFields('.form-class', [ - 'multiselect' => [ - 'value1', - 'value2', - ], - 'checkbox[]' => [ - 'a checked value', - 'another checked value', - ], -]); -?> -``` - -Additionally, checkbox values can be checked with a boolean. - -``` php -seeInFormFields('#form-id', [ - 'checkbox1' => true, // passes if checked - 'checkbox2' => false, // passes if unchecked -]); -?> -``` - -Pair this with submitForm for quick testing magic. - -``` php - 'value', - 'field2' => 'another value', - 'checkbox1' => true, - // ... -]; -$I->submitForm('//form[@id=my-form]', $form, 'submitButton'); -// $I->amOnPage('/path/to/form-page') may be needed -$I->seeInFormFields('//form[@id=my-form]', $form); -?> -``` - - * `param` $formSelector - * `param` $params - - -### seeInSession - -Assert that a session variable exists. - -``` php -seeInSession('key'); -$I->seeInSession('key', 'value'); -?> -``` - - * `param` string|array $key - * `param` mixed|null $value - * `return` void - - -### seeInSource - -Checks that the current page contains the given string in its -raw source code. - -``` php -seeInSource('

Green eggs & ham

'); -``` - - * `param` $raw - - -### seeInTitle - -Checks that the page title contains the given string. - -``` php -seeInTitle('Blog - Post #1'); -?> -``` - - * `param` $title - - - -### seeLink - -Checks that there's a link with the specified text. -Give a full URL as the second parameter to match links with that exact URL. - -``` php -seeLink('Logout'); // matches Logout -$I->seeLink('Logout','/logout'); // matches Logout -?> -``` - - * `param string` $text - * `param string` $url optional - - -### seeNumRecords - -Checks that number of given records were found in database. -You can pass the name of a database table or the class name of an Eloquent model as the first argument. - -``` php -seeNumRecords(1, 'users', array('name' => 'davert')); -$I->seeNumRecords(1, 'App\User', array('name' => 'davert')); -?> -``` - - * `param integer` $expectedNum - * `param string` $table - * `param array` $attributes - * `[Part]` orm - - -### seeNumberOfElements - -Checks that there are a certain number of elements matched by the given locator on the page. - -``` php -seeNumberOfElements('tr', 10); -$I->seeNumberOfElements('tr', [0,10]); // between 0 and 10 elements -?> -``` - * `param` $selector - * `param mixed` $expected int or int[] - - -### seeOptionIsSelected - -Checks that the given option is selected. - -``` php -seeOptionIsSelected('#form input[name=payment]', 'Visa'); -?> -``` - - * `param` $selector - * `param` $optionText - - - -### seePageNotFound - -Asserts that current page has 404 response status code. - - -### seeRecord - -Checks that record exists in database. -You can pass the name of a database table or the class name of an Eloquent model as the first argument. - -``` php -seeRecord('users', array('name' => 'davert')); -$I->seeRecord('App\User', array('name' => 'davert')); -?> -``` - - * `param string` $table - * `param array` $attributes - * `[Part]` orm - - -### seeResponseCodeIs - -Checks that response code is equal to value provided. - -```php -seeResponseCodeIs(200); - -// recommended \Codeception\Util\HttpCode -$I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); -``` - - * `param` $code - - -### seeResponseCodeIsBetween - -Checks that response code is between a certain range. Between actually means [from <= CODE <= to] - - * `param` $from - * `param` $to - - -### seeResponseCodeIsClientError - -Checks that the response code is 4xx - - -### seeResponseCodeIsRedirection - -Checks that the response code 3xx - - -### seeResponseCodeIsServerError - -Checks that the response code is 5xx - - -### seeResponseCodeIsSuccessful - -Checks that the response code 2xx - - -### seeSessionHasValues - -Assert that the session has a given list of values. - -``` php -seeSessionHasValues(['key1', 'key2']); -$I->seeSessionHasValues(['key1' => 'value1', 'key2' => 'value2']); -?> -``` - - * `param` array $bindings - * `return` void - - -### selectOption - -Selects an option in a select tag or in radio button group. - -``` php -selectOption('form select[name=account]', 'Premium'); -$I->selectOption('form input[name=payment]', 'Monthly'); -$I->selectOption('//form/select[@name=account]', 'Monthly'); -?> -``` - -Provide an array for the second argument to select multiple options: - -``` php -selectOption('Which OS do you use?', array('Windows','Linux')); -?> -``` - -Or provide an associative array for the second argument to specifically define which selection method should be used: - -``` php -selectOption('Which OS do you use?', array('text' => 'Windows')); // Only search by text 'Windows' -$I->selectOption('Which OS do you use?', array('value' => 'windows')); // Only search by value 'windows' -?> -``` - - * `param` $select - * `param` $option - - -### sendAjaxGetRequest - -If your page triggers an ajax request, you can perform it manually. -This action sends a GET ajax request with specified params. - -See ->sendAjaxPostRequest for examples. - - * `param` $uri - * `param` $params - - -### sendAjaxPostRequest - -If your page triggers an ajax request, you can perform it manually. -This action sends a POST ajax request with specified params. -Additional params can be passed as array. - -Example: - -Imagine that by clicking checkbox you trigger ajax request which updates user settings. -We emulate that click by running this ajax request manually. - -``` php -sendAjaxPostRequest('/updateSettings', array('notifications' => true)); // POST -$I->sendAjaxGetRequest('/updateSettings', array('notifications' => true)); // GET - -``` - - * `param` $uri - * `param` $params - - -### sendAjaxRequest - -If your page triggers an ajax request, you can perform it manually. -This action sends an ajax request with specified method and params. - -Example: - -You need to perform an ajax request specifying the HTTP method. - -``` php -sendAjaxRequest('PUT', '/posts/7', array('title' => 'new title')); - -``` - - * `param` $method - * `param` $uri - * `param` $params - - -### setApplication - - * `param` $app - - -### setCookie - -Sets a cookie with the given name and value. -You can set additional cookie params like `domain`, `path`, `expires`, `secure` in array passed as last argument. - -``` php -setCookie('PHPSESSID', 'el4ukv0kqbvoirg7nkp4dncpk3'); -?> -``` - - * `param` $name - * `param` $val - * `param array` $params - - - -### submitForm - -Submits the given form on the page, with the given form -values. Pass the form field's values as an array in the second -parameter. - -Although this function can be used as a short-hand version of -`fillField()`, `selectOption()`, `click()` etc. it has some important -differences: - - * Only field *names* may be used, not CSS/XPath selectors nor field labels - * If a field is sent to this function that does *not* exist on the page, - it will silently be added to the HTTP request. This is helpful for testing - some types of forms, but be aware that you will *not* get an exception - like you would if you called `fillField()` or `selectOption()` with - a missing field. - -Fields that are not provided will be filled by their values from the page, -or from any previous calls to `fillField()`, `selectOption()` etc. -You don't need to click the 'Submit' button afterwards. -This command itself triggers the request to form's action. - -You can optionally specify which button's value to include -in the request with the last parameter (as an alternative to -explicitly setting its value in the second parameter), as -button values are not otherwise included in the request. - -Examples: - -``` php -submitForm('#login', [ - 'login' => 'davert', - 'password' => '123456' -]); -// or -$I->submitForm('#login', [ - 'login' => 'davert', - 'password' => '123456' -], 'submitButtonName'); - -``` - -For example, given this sample "Sign Up" form: - -``` html -
- Login: -
- Password: -
- Do you agree to our terms? -
- Select pricing plan: - - -
-``` - -You could write the following to submit it: - -``` php -submitForm( - '#userForm', - [ - 'user' => [ - 'login' => 'Davert', - 'password' => '123456', - 'agree' => true - ] - ], - 'submitButton' -); -``` -Note that "2" will be the submitted value for the "plan" field, as it is -the selected option. - -You can also emulate a JavaScript submission by not specifying any -buttons in the third parameter to submitForm. - -```php -submitForm( - '#userForm', - [ - 'user' => [ - 'login' => 'Davert', - 'password' => '123456', - 'agree' => true - ] - ] -); -``` - -This function works well when paired with `seeInFormFields()` -for quickly testing CRUD interfaces and form validation logic. - -``` php - 'value', - 'field2' => 'another value', - 'checkbox1' => true, - // ... -]; -$I->submitForm('#my-form', $form, 'submitButton'); -// $I->amOnPage('/path/to/form-page') may be needed -$I->seeInFormFields('#my-form', $form); -``` - -Parameter values can be set to arrays for multiple input fields -of the same name, or multi-select combo boxes. For checkboxes, -you can use either the string value or boolean `true`/`false` which will -be replaced by the checkbox's value in the DOM. - -``` php -submitForm('#my-form', [ - 'field1' => 'value', - 'checkbox' => [ - 'value of first checkbox', - 'value of second checkbox', - ], - 'otherCheckboxes' => [ - true, - false, - false - ], - 'multiselect' => [ - 'first option value', - 'second option value' - ] -]); -``` - -Mixing string and boolean values for a checkbox's value is not supported -and may produce unexpected results. - -Field names ending in `[]` must be passed without the trailing square -bracket characters, and must contain an array for its value. This allows -submitting multiple values with the same name, consider: - -```php -submitForm('#my-form', [ - 'field[]' => 'value', - 'field[]' => 'another value', // 'field[]' is already a defined key -]); -``` - -The solution is to pass an array value: - -```php -submitForm('#my-form', [ - 'field' => [ - 'value', - 'another value', - ] -]); -``` - - * `param` $selector - * `param` $params - * `param` $button - - -### switchToIframe - -Switch to iframe or frame on the page. - -Example: -``` html -