From 4dfdc2769b5b283262767474b9456507e3e28fe2 Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Wed, 30 Dec 2020 15:35:44 +0200 Subject: [PATCH] Replace Laravel5 module with Laravel module --- RoboFile.php | 2 + _includes/modules.html | 2 +- composer.json | 2 +- docs/modules/Laravel.md | 2238 +++++++++++++++++++++++++++++++++++++ docs/modules/Laravel5.md | 2253 +------------------------------------- 5 files changed, 2243 insertions(+), 2254 deletions(-) create mode 100644 docs/modules/Laravel.md mode change 100644 => 120000 docs/modules/Laravel5.md diff --git a/RoboFile.php b/RoboFile.php index d382fdfd2..b7b41df69 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -146,7 +146,9 @@ public function buildDocsModules() $this->generateDocumentationForClass($className, $documentationFile, $sourceMessage); $this->postProcessModuleDocFile($documentationFile, $moduleName, $source); } + //Page of old module displays content of new module $this->taskFilesystemStack()->symlink('Mezzio.md', 'docs/modules/ZendExpressive.md')->run(); + $this->taskFilesystemStack()->symlink('Laravel.md', 'docs/modules/Laravel5.md')->run(); } private function postProcessModuleDocFile($documentationFile, $name, $source) diff --git a/_includes/modules.html b/_includes/modules.html index d87c38137..b62bfac43 100644 --- a/_includes/modules.html +++ b/_includes/modules.html @@ -7,7 +7,7 @@
  • Doctrine2
  • FTP
  • Filesystem
  • -
  • Laravel5
  • +
  • Laravel
  • Lumen
  • Memcache
  • Mezzio
  • diff --git a/composer.json b/composer.json index abc553da4..8cdd301c8 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "codeception/module-doctrine2": "*", "codeception/module-filesystem": "*", "codeception/module-ftp": "*", - "codeception/module-laravel5": "*", + "codeception/module-laravel": "*", "codeception/module-lumen": "*", "codeception/module-memcache": "*", "codeception/module-mezzio": "*", diff --git a/docs/modules/Laravel.md b/docs/modules/Laravel.md new file mode 100644 index 000000000..9d9cbe0d9 --- /dev/null +++ b/docs/modules/Laravel.md @@ -0,0 +1,2238 @@ +--- +layout: doc +title: Laravel - Codeception - Documentation +--- + + + +
    Changelogsource3.12.51.8
    + +# Laravel +### Installation + +If you use Codeception installed using composer, install this module with the following command: + +{% highlight yaml %} +composer require --dev codeception/module-laravel + +{% endhighlight %} + +Alternatively, you can enable `Laravel` module in suite configuration file and run + +{% highlight yaml %} +codecept init upgrade4 + +{% endhighlight %} + +This module was bundled with Codeception 2 and 3, but since version 4 it is necessary to install it separately. +Some modules are bundled with PHAR files. +Warning. Using PHAR file and composer in the same project can cause unexpected errors. + +### Description + + + + +This module allows you to run functional tests for Laravel 6.0+ +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: + +{% highlight yaml %} +yml +modules: + enabled: + - Laravel + +{% endhighlight %} + +#### Example #2 (`functional.suite.yml`) + +Enabling module with custom .env file + +{% highlight yaml %} +yml +modules: + enabled: + - Laravel: + environment_file: .env.testing + +{% endhighlight %} + +### API + +* app - `Illuminate\Foundation\Application` +* config - `array` + +### Parts + +* `ORM`: Only include the database methods of this module: + * dontSeeRecord + * grabNumRecords + * grabRecord + * have + * haveMultiple + * haveRecord + * make + * makeMultiple + * seeNumRecords + * seeRecord + +See [WebDriver module](https://codeception.com/docs/modules/WebDriver#Loading-Parts-from-other-Modules) +for general information on how to load parts of a framework module. + +### 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`) + +{% highlight yaml %} + +modules: + enabled: + - WebDriver: + browser: chrome + url: http://127.0.0.1:8000 + - Laravel: + part: ORM + environment_file: .env.testing + +{% endhighlight %} + +### 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: + +{% highlight php %} + +getModule('Laravel')->_findElements('.items'); +$els = $this->getModule('Laravel')->_findElements(['name' => 'username']); + +$editLinks = $this->getModule('Laravel')->_findElements(['link' => 'Edit']); +// now you can iterate over $editLinks and check that all them have valid hrefs + +{% endhighlight %} + +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. + +{% highlight php %} + +assertStringContainsString($text, $this->getModule('Laravel')->_getResponseContent(), "response contains"); +} +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +getModule('Laravel')->_loadPage('POST', '/checkout/step2', ['order' => $orderId]); +} +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +getModule('Laravel')->_request('POST', '/api/v1/users', ['name' => $name]); + $user = json_decode($userData); + return $user->id; +} +?> + +{% endhighlight %} +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 + +{% highlight php %} + +$this->getModule('Laravel')->_savePageSource(codecept_output_dir().'page.html'); + +{% endhighlight %} + * `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. + +{% highlight php %} + +amLoggedAs(['username' => 'jane@example.com', 'password' => 'password']); + +// provide User object +$I->amLoggedAs( new User ); + +// can be verified with $I->seeAuthentication(); + +{% endhighlight %} + * `param Authenticatable|array` $user + * `param string|null` $guardName The guard name + + +#### amOnAction + +Opens web page by action name + +{% highlight php %} + +amOnAction('PostsController@index'); + +// Laravel 8+: +$I->amOnAction(PostsController::class . '@index'); + +{% endhighlight %} + + * `param string` $action + * `param mixed` $parameters + + +#### amOnPage + +Opens the page for the given relative URI. + +{% highlight php %} + +amOnPage('/'); +// opens /register page +$I->amOnPage('/register'); + +{% endhighlight %} + + * `param string` $page + + +#### amOnRoute + +Opens web page using route name and parameters. + +{% highlight php %} + +amOnRoute('posts.create'); + +{% endhighlight %} + + * `param string` $routeName + * `param mixed` $params + + +#### attachFile + +Attaches a file relative to the Codeception `_data` directory to the given file upload field. + +{% highlight php %} + +attachFile('input[@type="file"]', 'prices.xls'); +?> + +{% endhighlight %} + + * `param` $field + * `param` $filename + + +#### callArtisan + +Call an Artisan command. + +{% highlight php %} + +callArtisan('command:name'); +$I->callArtisan('command:name', ['parameter' => 'value']); + +{% endhighlight %} +Use 3rd parameter to pass in custom `OutputInterface` + + * `param string` $command + * `param array` $parameters + * `param OutputInterface|null` $output + * `return` string|void + + +#### checkOption + +Ticks a checkbox. For radio buttons, use the `selectOption` method instead. + +{% highlight php %} + +checkOption('#agree'); +?> + +{% endhighlight %} + + * `param` $option + + +#### clearApplicationHandlers + +Clear the registered application handlers. + +{% highlight php %} + +clearApplicationHandlers(); + +{% endhighlight %} + + +#### 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. + +{% highlight 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']); +?> + +{% endhighlight %} + + * `param` $link + * `param` $context + + +#### deleteHeader + +Deletes the header with the passed name. Subsequent requests +will not have the deleted header in its request. + +Example: +{% highlight php %} + +haveHttpHeader('X-Requested-With', 'Codeception'); +$I->amOnPage('test-headers.php'); +// ... +$I->deleteHeader('X-Requested-With'); +$I->amOnPage('some-other-page.php'); +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +disableEvents(); + +{% endhighlight %} + + +#### disableExceptionHandling + +Disable Laravel exception handling. + +{% highlight php %} + +disableExceptionHandling(); + +{% endhighlight %} + + +#### disableMiddleware + +Disable middleware for the next requests. + +{% highlight php %} + +disableMiddleware(); + +{% endhighlight %} + + +#### disableModelEvents + +Disable model events for the next requests. + +{% highlight php %} + +disableModelEvents(); + +{% endhighlight %} + + +#### 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. + +{% highlight 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 + +{% endhighlight %} + +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 as second parameter. + + * `param string|null` $guard + + +#### dontSeeCheckboxIsChecked + +Check that the specified checkbox is unchecked. + +{% highlight 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. +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +dontSeeCurrentUrlEquals('/'); +?> + +{% endhighlight %} + + * `param string` $uri + + +#### dontSeeCurrentUrlMatches + +Checks that current url doesn't match the given regular expression. + +{% highlight php %} + +dontSeeCurrentUrlMatches('~^/users/(\d+)~'); +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +dontSeeElement('.error'); +$I->dontSeeElement('//form/input[1]'); +$I->dontSeeElement('input', ['name' => 'login']); +$I->dontSeeElement('input', ['value' => '123456']); +?> + +{% endhighlight %} + + * `param` $selector + * `param array` $attributes + + +#### dontSeeEventTriggered + +Make sure events did not fire during the test. + +{% highlight php %} + +dontSeeEventTriggered('App\MyEvent'); +$I->dontSeeEventTriggered(new App\Events\MyEvent()); +$I->dontSeeEventTriggered(['App\MyEvent', 'App\MyOtherEvent']); + +{% endhighlight %} + * `param string|object|string[]` $expected + + +#### dontSeeFormErrors + +Assert that there are no form errors bound to the View. + +{% highlight php %} + +dontSeeFormErrors(); + +{% endhighlight %} + + +#### dontSeeInCurrentUrl + +Checks that the current URI doesn't contain the given string. + +{% highlight php %} + +dontSeeInCurrentUrl('/users/'); +?> + +{% endhighlight %} + + * `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. + +{% highlight 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'); +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +dontSeeInFormFields('form[name=myform]', [ + 'input1' => 'non-existent value', + 'input2' => 'other non-existent value', +]); +?> + +{% endhighlight %} + +To check that an element hasn't been assigned any one of many values, an array can be passed +as the value: + +{% highlight php %} + +dontSeeInFormFields('.form-class', [ + 'fieldName' => [ + 'This value shouldn\'t be set', + 'And this value shouldn\'t be set', + ], +]); +?> + +{% endhighlight %} + +Additionally, checkbox values can be checked with a boolean. + +{% highlight php %} + +dontSeeInFormFields('#form-id', [ + 'checkbox1' => true, // fails if checked + 'checkbox2' => false, // fails if unchecked +]); +?> + +{% endhighlight %} + + * `param` $formSelector + * `param` $params + + +#### dontSeeInSource + +Checks that the current page contains the given string in its +raw source code. + +{% highlight php %} + +dontSeeInSource('

    Green eggs & ham

    '); + +{% endhighlight %} + + * `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. + +{% highlight php %} + +dontSeeLink('Logout'); // I suppose user is not logged in +$I->dontSeeLink('Checkout now', '/store/cart.php'); +?> + +{% endhighlight %} + + * `param string` $text + * `param string` $url optional + + +#### dontSeeOptionIsSelected + +Checks that the given option is not selected. + +{% highlight php %} + +dontSeeOptionIsSelected('#form input[name=payment]', 'Visa'); +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +dontSeeRecord('users', ['name' => 'davert']); +$I->dontSeeRecord('App\Models\User', ['name' => 'davert']); + +{% endhighlight %} + + * `param string` $table + * `param array` $attributes + * `[Part]` orm + + +#### dontSeeResponseCodeIs + +Checks that response code is equal to value provided. + +{% highlight php %} + +dontSeeResponseCodeIs(200); + +// recommended \Codeception\Util\HttpCode +$I->dontSeeResponseCodeIs(\Codeception\Util\HttpCode::OK); + +{% endhighlight %} + * `param` $code + + +#### enableExceptionHandling + +Enable Laravel exception handling. + +{% highlight php %} + +enableExceptionHandling(); + +{% endhighlight %} + + +#### fillField + +Fills a text field or textarea with the given string. + +{% highlight php %} + +fillField("//input[@type='text']", "Hello World!"); +$I->fillField(['name' => 'email'], 'jon@mail.com'); +?> + +{% endhighlight %} + + * `param` $field + * `param` $value + + +#### getApplication + +Provides access the Laravel application object. + + * `return` \Illuminate\Contracts\Foundation\Application + + +#### grabAttributeFrom + +Grabs the value of the given attribute value from the given element. +Fails if element is not found. + +{% highlight php %} + +grabAttributeFrom('#tooltip', 'title'); +?> + +{% endhighlight %} + + * `param` $cssOrXpath + * `param` $attribute + + + +#### grabCookie + +Grabs a cookie value. +You can set additional cookie params like `domain`, `path` in array passed as last argument. +If the cookie is set by an ajax request (XMLHttpRequest), there might be some delay caused by the browser, so try `$I->wait(0.1)`. + + * `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. + +{% highlight php %} + +grabFromCurrentUrl('~^/user/(\d+)/~'); +$uri = $I->grabFromCurrentUrl(); +?> + +{% endhighlight %} + + * `param string` $uri optional + + + +#### grabMultiple + +Grabs either the text content, or attribute values, of nodes +matched by $cssOrXpath and returns them as an array. + +{% highlight html %} + +First +Second +Third + +{% endhighlight %} + +{% highlight php %} + +grabMultiple('a'); + +// would return ['#first', '#second', '#third'] +$aLinks = $I->grabMultiple('a', 'href'); +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +grabNumRecords('users', ['name' => 'davert']); +$I->grabNumRecords('App\Models\User', ['name' => 'davert']); + +{% endhighlight %} + + * `param string` $table + * `param array` $attributes + * `return` int + * `[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. + +{% highlight php %} + +grabRecord('users', ['name' => 'davert']); // returns array +$record = $I->grabRecord('App\Models\User', ['name' => 'davert']); // returns Eloquent model + +{% endhighlight %} + + * `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) + +{% highlight php %} + +grabService('foo'); + +// Will return an instance of FooBar, also works for singletons. + +{% endhighlight %} + + * `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. + +{% highlight php %} + +grabTextFrom('h1'); +$heading = $I->grabTextFrom('descendant-or-self::h1'); +$value = $I->grabTextFrom('~ + +{% endhighlight %} + + * `param` $cssOrXPathOrRegex + + + +#### grabValueFrom + + * `param` $field + + * `return` array|mixed|null|string + + +#### have + +Use Laravel model factory to create a model. + +{% highlight php %} + +have('App\Models\User'); +$I->have('App\Models\User', ['name' => 'John Doe']); +$I->have('App\Models\User', [], 'admin'); + +{% endhighlight %} + +@see https://laravel.com/docs/6.x/database-testing#using-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. + +{% highlight php %} + +haveApplicationHandler(function($app) { + $app->make('config')->set(['test_value' => '10']); +}); + +{% endhighlight %} + + * `param callable` $handler + + +#### haveBinding + +Add a binding to the Laravel service container. +(https://laravel.com/docs/master/container) + +{% highlight php %} + +haveBinding('My\Interface', 'My\Implementation'); + +{% endhighlight %} + + * `param string` $abstract + * `param Closure|string|null` $concrete + * `param bool` $shared + + +#### haveContextualBinding + +Add a contextual binding to the Laravel service container. +(https://laravel.com/docs/master/container) + +{% highlight php %} + +haveContextualBinding('My\Class', '$variable', 'value'); + +// This is similar to the following in your Laravel application +$app->when('My\Class') + ->needs('$variable') + ->give('value'); + +{% endhighlight %} + + * `param string` $concrete + * `param string` $abstract + * `param Closure|string` $implementation + + +#### haveHttpHeader + +Sets the HTTP header to the passed value - which is used on +subsequent HTTP requests through PhpBrowser. + +Example: +{% highlight php %} + +haveHttpHeader('X-Requested-With', 'Codeception'); +$I->amOnPage('test-headers.php'); +?> + +{% endhighlight %} + +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' + +{% highlight php %} + +haveHttpHeader('Client_Id', 'Codeception'); +?> + +{% endhighlight %} + + * `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) + +{% highlight php %} + +haveInstance('App\MyClass', new App\MyClass()); + +{% endhighlight %} + + * `param string` $abstract + * `param mixed` $instance + + +#### haveMultiple + +Use Laravel model factory to create multiple models. + +{% highlight php %} + +haveMultiple('App\Models\User', 10); +$I->haveMultiple('App\Models\User', 10, ['name' => 'John Doe']); +$I->haveMultiple('App\Models\User', 10, [], 'admin'); + +{% endhighlight %} + +@see https://laravel.com/docs/6.x/database-testing#using-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. + +{% highlight php %} + +haveRecord('users', ['name' => 'Davert']); // returns integer +$user = $I->haveRecord('App\Models\User', ['name' => 'Davert']); // returns Eloquent model + +{% endhighlight %} + + * `param string` $table + * `param array` $attributes + * `return` EloquentModel|int +@throws RuntimeException + * `[Part]` orm + + +#### haveServerParameter + +Sets SERVER parameter valid for all next requests. + +{% highlight php %} + +$I->haveServerParameter('name', 'value'); + +{% endhighlight %} + * `param` $name + * `param` $value + + +#### haveSingleton + +Add a singleton binding to the Laravel service container. +(https://laravel.com/docs/master/container) + +{% highlight php %} + +haveSingleton('App\MyInterface', 'App\MySingleton'); + +{% endhighlight %} + + * `param string` $abstract + * `param Closure|string|null` $concrete + + +#### logout + +Logout user. + + +#### make + +Use Laravel model factory to make a model instance. + +{% highlight php %} + +make('App\Models\User'); +$I->make('App\Models\User', ['name' => 'John Doe']); +$I->make('App\Models\User', [], 'admin'); + +{% endhighlight %} + +@see https://laravel.com/docs/6.x/database-testing#using-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. + +{% highlight 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 + +{% endhighlight %} + + * `param null` $name + + +#### makeMultiple + +Use Laravel model factory to make multiple model instances. + +{% highlight php %} + +makeMultiple('App\Models\User', 10); +$I->makeMultiple('App\Models\User', 10, ['name' => 'John Doe']); +$I->makeMultiple('App\Models\User', 10, [], 'admin'); + +{% endhighlight %} + +@see https://laravel.com/docs/6.x/database-testing#using-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. + +{% highlight 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 + +{% endhighlight %} + +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 as second parameter. + + * `param string|null` $guard + + +#### seeCheckboxIsChecked + +Checks that the specified checkbox is checked. + +{% highlight 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]'); +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +seeCookie('PHPSESSID'); +?> + +{% endhighlight %} + + * `param` $cookie + * `param array` $params + + +#### seeCurrentActionIs + +Checks that current url matches action + +{% highlight php %} + +seeCurrentActionIs('PostsController@index'); + +// Laravel 8+: +$I->seeCurrentActionIs(PostsController::class . '@index'); + +{% endhighlight %} + + * `param string` $action + + +#### seeCurrentRouteIs + +Checks that current url matches route + +{% highlight php %} + +seeCurrentRouteIs('posts.index'); + +{% endhighlight %} + * `param string` $routeName + + +#### seeCurrentUrlEquals + +Checks that the current URL is equal to the given string. +Unlike `seeInCurrentUrl`, this only matches the full URL. + +{% highlight php %} + +seeCurrentUrlEquals('/'); +?> + +{% endhighlight %} + + * `param string` $uri + + +#### seeCurrentUrlMatches + +Checks that the current URL matches the given regular expression. + +{% highlight php %} + +seeCurrentUrlMatches('~^/users/(\d+)~'); +?> + +{% endhighlight %} + + * `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. + +{% highlight 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']); +?> + +{% endhighlight %} + + * `param` $selector + * `param array` $attributes +@return + + +#### seeEventTriggered + +Make sure events fired during the test. + +{% highlight php %} + +seeEventTriggered('App\MyEvent'); +$I->seeEventTriggered(new App\Events\MyEvent()); +$I->seeEventTriggered(['App\MyEvent', 'App\MyOtherEvent']); + +{% endhighlight %} + * `param string|object|string[]` $expected + + +#### 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`. + +{% highlight php %} + +seeFormErrorMessage('username'); +$I->seeFormErrorMessage('username', 'Invalid Username'); + +{% endhighlight %} + * `param string` $field + * `param string|null` $errorMessage + + +#### seeFormErrorMessages + +Verifies that multiple fields on a form have errors. + +This method will validate that the expected error message +is contained in the actual error message, that is, +you can specify either the entire error message or just a part of it: + +{% highlight php %} + +seeFormErrorMessages([ + 'address' => 'The address is too long', + 'telephone' => 'too short' // the full error message is 'The telephone is too short' +]); + +{% endhighlight %} + +If you don't want to specify the error message for some fields, +you can pass `null` as value instead of the message string. +If that is the case, it will be validated that +that field has at least one error of any type: + +{% highlight php %} + +seeFormErrorMessages([ + 'telephone' => 'too short', + 'address' => null +]); + +{% endhighlight %} + + * `param array` $expectedErrors + + +#### seeFormHasErrors + +Assert that form errors are bound to the View. + +{% highlight php %} + +seeFormHasErrors(); + +{% endhighlight %} + + +#### seeInCurrentUrl + +Checks that current URI contains the given string. + +{% highlight php %} + +seeInCurrentUrl('home'); +// to match: /users/1 +$I->seeInCurrentUrl('/users/'); +?> + +{% endhighlight %} + + * `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. + +{% highlight 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'); +?> + +{% endhighlight %} + + * `param` $field + * `param` $value + + +#### seeInFormFields + +Checks if the array of form parameters (name => value) are set on the form matched with the +passed selector. + +{% highlight php %} + +seeInFormFields('form[name=myform]', [ + 'input1' => 'value', + 'input2' => 'other value', +]); +?> + +{% endhighlight %} + +For multi-select elements, or to check values of multiple elements with the same name, an +array may be passed: + +{% highlight php %} + +seeInFormFields('.form-class', [ + 'multiselect' => [ + 'value1', + 'value2', + ], + 'checkbox[]' => [ + 'a checked value', + 'another checked value', + ], +]); +?> + +{% endhighlight %} + +Additionally, checkbox values can be checked with a boolean. + +{% highlight php %} + +seeInFormFields('#form-id', [ + 'checkbox1' => true, // passes if checked + 'checkbox2' => false, // passes if unchecked +]); +?> + +{% endhighlight %} + +Pair this with submitForm for quick testing magic. + +{% highlight 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); +?> + +{% endhighlight %} + + * `param` $formSelector + * `param` $params + + +#### seeInSession + +Assert that a session variable exists. + +{% highlight php %} + +seeInSession('key'); +$I->seeInSession('key', 'value'); + +{% endhighlight %} + + * `param string|array` $key + * `param mixed|null` $value + + +#### seeInSource + +Checks that the current page contains the given string in its +raw source code. + +{% highlight php %} + +seeInSource('

    Green eggs & ham

    '); + +{% endhighlight %} + + * `param` $raw + + +#### seeInTitle + +Checks that the page title contains the given string. + +{% highlight php %} + +seeInTitle('Blog - Post #1'); +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +seeLink('Logout'); // matches Logout +$I->seeLink('Logout','/logout'); // matches Logout +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +seeNumRecords(1, 'users', ['name' => 'davert']); +$I->seeNumRecords(1, 'App\Models\User', ['name' => 'davert']); + +{% endhighlight %} + + * `param int` $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. + +{% highlight php %} + +seeNumberOfElements('tr', 10); +$I->seeNumberOfElements('tr', [0,10]); // between 0 and 10 elements +?> + +{% endhighlight %} + * `param` $selector + * `param mixed` $expected int or int[] + + +#### seeOptionIsSelected + +Checks that the given option is selected. + +{% highlight php %} + +seeOptionIsSelected('#form input[name=payment]', 'Visa'); +?> + +{% endhighlight %} + + * `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. + +{% highlight php %} + +seeRecord('users', ['name' => 'davert']); +$I->seeRecord('App\Models\User', ['name' => 'davert']); + +{% endhighlight %} + + * `param string` $table + * `param array` $attributes + * `[Part]` orm + + +#### seeResponseCodeIs + +Checks that response code is equal to value provided. + +{% highlight php %} + +seeResponseCodeIs(200); + +// recommended \Codeception\Util\HttpCode +$I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); + +{% endhighlight %} + + * `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. + +{% highlight php %} + +seeSessionHasValues(['key1', 'key2']); +$I->seeSessionHasValues(['key1' => 'value1', 'key2' => 'value2']); + +{% endhighlight %} + + * `param array` $bindings + + +#### selectOption + +Selects an option in a select tag or in radio button group. + +{% highlight php %} + +selectOption('form select[name=account]', 'Premium'); +$I->selectOption('form input[name=payment]', 'Monthly'); +$I->selectOption('//form/select[@name=account]', 'Monthly'); +?> + +{% endhighlight %} + +Provide an array for the second argument to select multiple options: + +{% highlight php %} + +selectOption('Which OS do you use?', array('Windows','Linux')); +?> + +{% endhighlight %} + +Or provide an associative array for the second argument to specifically define which selection method should be used: + +{% highlight 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' +?> + +{% endhighlight %} + + * `param` $select + * `param` $option + + +#### sendAjaxGetRequest + +Sends an ajax GET request with the passed parameters. +See `sendAjaxPostRequest()` + + * `param` $uri + * `param` $params + + +#### sendAjaxPostRequest + +Sends an ajax POST request with the passed parameters. +The appropriate HTTP header is added automatically: +`X-Requested-With: XMLHttpRequest` +Example: +{% highlight php %} + +sendAjaxPostRequest('/add-task', ['task' => 'lorem ipsum']); + +{% endhighlight %} +Some frameworks (e.g. Symfony) create field names in the form of an "array": +`` +In this case you need to pass the fields like this: +{% highlight php %} + +sendAjaxPostRequest('/add-task', ['form' => [ + 'task' => 'lorem ipsum', + 'category' => 'miscellaneous', +]]); + +{% endhighlight %} + + * `param string` $uri + * `param array` $params + + +#### sendAjaxRequest + +Sends an ajax request, using the passed HTTP method. +See `sendAjaxPostRequest()` +Example: +{% highlight php %} + +sendAjaxRequest('PUT', '/posts/7', ['title' => 'new title']); + +{% endhighlight %} + + * `param` $method + * `param` $uri + * `param` $params + + +#### setApplication + + * `param \Illuminate\Contracts\Foundation\Application` $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. + +{% highlight php %} + +setCookie('PHPSESSID', 'el4ukv0kqbvoirg7nkp4dncpk3'); +?> + +{% endhighlight %} + + * `param` $name + * `param` $val + * `param array` $params + + + +#### setServerParameters + +Sets SERVER parameters valid for all next requests. +this will remove old ones. + +{% highlight php %} + +$I->setServerParameters([]); + +{% endhighlight %} + * `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: + +{% highlight php %} + +submitForm('#login', [ + 'login' => 'davert', + 'password' => '123456' +]); +// or +$I->submitForm('#login', [ + 'login' => 'davert', + 'password' => '123456' +], 'submitButtonName'); + + +{% endhighlight %} + +For example, given this sample "Sign Up" form: + +{% highlight html %} + +
    + Login: +
    + Password: +
    + Do you agree to our terms? +
    + Select pricing plan: + + +
    + +{% endhighlight %} + +You could write the following to submit it: + +{% highlight php %} + +submitForm( + '#userForm', + [ + 'user' => [ + 'login' => 'Davert', + 'password' => '123456', + 'agree' => true + ] + ], + 'submitButton' +); + +{% endhighlight %} +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. + +{% highlight php %} + +submitForm( + '#userForm', + [ + 'user' => [ + 'login' => 'Davert', + 'password' => '123456', + 'agree' => true + ] + ] +); + +{% endhighlight %} + +This function works well when paired with `seeInFormFields()` +for quickly testing CRUD interfaces and form validation logic. + +{% highlight 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); + +{% endhighlight %} + +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. + +{% highlight 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' + ] +]); + +{% endhighlight %} + +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: + +{% highlight php %} + +submitForm('#my-form', [ + 'field[]' => 'value', + 'field[]' => 'another value', // 'field[]' is already a defined key +]); + +{% endhighlight %} + +The solution is to pass an array value: + +{% highlight php %} + +submitForm('#my-form', [ + 'field' => [ + 'value', + 'another value', + ] +]); + +{% endhighlight %} + + * `param` $selector + * `param` $params + * `param` $button + + +#### switchToIframe + +Switch to iframe or frame on the page. + +Example: +{% highlight html %} + +