2015-08-17 17:00:26 -07:00
< ? php
2016-10-06 15:16:20 -07:00
namespace Drupal\FunctionalTests ;
2015-08-17 17:00:26 -07:00
2017-04-13 15:53:35 +01:00
use Behat\Mink\Exception\ExpectationException ;
2016-10-06 15:16:20 -07:00
use Drupal\Component\Utility\Html ;
2016-06-02 15:56:09 -07:00
use Drupal\Core\Url ;
2016-04-20 09:56:34 -07:00
use Drupal\Tests\BrowserTestBase ;
2017-04-13 15:53:35 +01:00
use Drupal\Tests\Traits\Core\CronRunTrait ;
2015-08-17 17:00:26 -07:00
/**
* Tests BrowserTestBase functionality .
*
2016-10-06 15:16:20 -07:00
* @ group browsertestbase
2015-08-17 17:00:26 -07:00
*/
class BrowserTestBaseTest extends BrowserTestBase {
2017-04-13 15:53:35 +01:00
use CronRunTrait ;
2015-08-17 17:00:26 -07:00
/**
* Modules to enable .
*
* @ var array
*/
2017-04-13 15:53:35 +01:00
public static $modules = [ 'test_page_test' , 'form_test' , 'system_test' ];
2015-08-17 17:00:26 -07:00
/**
* Tests basic page test .
*/
public function testGoTo () {
$account = $this -> drupalCreateUser ();
$this -> drupalLogin ( $account );
// Visit a Drupal page that requires login.
2015-10-08 11:40:12 -07:00
$this -> drupalGet ( 'test-page' );
2015-08-17 17:00:26 -07:00
$this -> assertSession () -> statusCodeEquals ( 200 );
// Test page contains some text.
$this -> assertSession () -> pageTextContains ( 'Test page text.' );
2016-06-02 15:56:09 -07:00
2016-09-07 13:26:21 -07:00
// Check that returned plain text is correct.
$text = $this -> getTextContent ();
$this -> assertContains ( 'Test page text.' , $text );
$this -> assertNotContains ( '</html>' , $text );
2016-07-07 09:44:38 -07:00
// Response includes cache tags that we can assert.
2017-04-13 15:53:35 +01:00
$this -> assertSession () -> responseHeaderEquals ( 'X-Drupal-Cache-Tags' , 'http_response rendered' );
2016-07-07 09:44:38 -07:00
2016-08-03 13:22:33 -07:00
// Test that we can read the JS settings.
$js_settings = $this -> getDrupalSettings ();
$this -> assertSame ( 'azAZ09();.,\\\/-_{}' , $js_settings [ 'test-setting' ]);
2016-06-02 15:56:09 -07:00
// Test drupalGet with a url object.
$url = Url :: fromRoute ( 'test_page_test.render_title' );
$this -> drupalGet ( $url );
$this -> assertSession () -> statusCodeEquals ( 200 );
// Test page contains some text.
$this -> assertSession () -> pageTextContains ( 'Hello Drupal' );
2016-10-06 15:16:20 -07:00
// Test that setting headers with drupalGet() works.
2017-04-13 15:53:35 +01:00
$this -> drupalGet ( 'system-test/header' , [], [
2016-10-06 15:16:20 -07:00
'Test-Header' => 'header value' ,
2017-04-13 15:53:35 +01:00
]);
2016-10-06 15:16:20 -07:00
$returned_header = $this -> getSession () -> getResponseHeader ( 'Test-Header' );
$this -> assertSame ( 'header value' , $returned_header );
2015-08-17 17:00:26 -07:00
}
/**
* Tests basic form functionality .
*/
public function testForm () {
// Ensure the proper response code for a _form route.
2015-10-08 11:40:12 -07:00
$this -> drupalGet ( 'form-test/object-builder' );
2015-08-17 17:00:26 -07:00
$this -> assertSession () -> statusCodeEquals ( 200 );
// Ensure the form and text field exist.
$this -> assertSession () -> elementExists ( 'css' , 'form#form-test-form-test-object' );
$this -> assertSession () -> fieldExists ( 'bananas' );
2017-04-13 15:53:35 +01:00
// Check that the hidden field exists and has a specific value.
$this -> assertSession () -> hiddenFieldExists ( 'strawberry' );
$this -> assertSession () -> hiddenFieldExists ( 'red' );
$this -> assertSession () -> hiddenFieldExists ( 'redstrawberryhiddenfield' );
$this -> assertSession () -> hiddenFieldValueNotEquals ( 'strawberry' , 'brown' );
$this -> assertSession () -> hiddenFieldValueEquals ( 'strawberry' , 'red' );
// Check that a hidden field does not exist.
$this -> assertSession () -> hiddenFieldNotExists ( 'bananas' );
$this -> assertSession () -> hiddenFieldNotExists ( 'pineapple' );
2015-08-17 17:00:26 -07:00
$edit = [ 'bananas' => 'green' ];
$this -> submitForm ( $edit , 'Save' , 'form-test-form-test-object' );
$config_factory = $this -> container -> get ( 'config.factory' );
$value = $config_factory -> get ( 'form_test.object' ) -> get ( 'bananas' );
$this -> assertSame ( 'green' , $value );
2017-04-13 15:53:35 +01:00
// Test drupalPostForm().
$edit = [ 'bananas' => 'red' ];
$this -> drupalPostForm ( 'form-test/object-builder' , $edit , 'Save' );
$value = $config_factory -> get ( 'form_test.object' ) -> get ( 'bananas' );
$this -> assertSame ( 'red' , $value );
$this -> drupalPostForm ( 'form-test/object-builder' , NULL , 'Save' );
$value = $config_factory -> get ( 'form_test.object' ) -> get ( 'bananas' );
$this -> assertSame ( '' , $value );
2015-08-17 17:00:26 -07:00
}
2016-10-06 15:16:20 -07:00
/**
* Tests clickLink () functionality .
*/
public function testClickLink () {
$this -> drupalGet ( 'test-page' );
$this -> clickLink ( 'Visually identical test links' );
$this -> assertContains ( 'user/login' , $this -> getSession () -> getCurrentUrl ());
$this -> drupalGet ( 'test-page' );
$this -> clickLink ( 'Visually identical test links' , 0 );
$this -> assertContains ( 'user/login' , $this -> getSession () -> getCurrentUrl ());
$this -> drupalGet ( 'test-page' );
$this -> clickLink ( 'Visually identical test links' , 1 );
$this -> assertContains ( 'user/register' , $this -> getSession () -> getCurrentUrl ());
}
2016-04-07 11:19:57 -07:00
public function testError () {
$this -> setExpectedException ( '\Exception' , 'User notice: foo' );
$this -> drupalGet ( 'test-error' );
}
2016-10-06 15:16:20 -07:00
/**
2017-04-13 15:53:35 +01:00
* Tests linkExists () with pipe character ( | ) in locator .
*
* @ see \Drupal\Tests\WebAssert :: linkExists ()
*/
public function testPipeCharInLocator () {
$this -> drupalGet ( 'test-pipe-char' );
$this -> assertSession () -> linkExists ( 'foo|bar|baz' );
}
/**
* Tests legacy text asserts .
2016-10-06 15:16:20 -07:00
*/
2017-04-13 15:53:35 +01:00
public function testLegacyTextAsserts () {
2016-10-06 15:16:20 -07:00
$this -> drupalGet ( 'test-encoded' );
$dangerous = 'Bad html <script>alert(123);</script>' ;
$sanitized = Html :: escape ( $dangerous );
$this -> assertNoText ( $dangerous );
$this -> assertText ( $sanitized );
2017-04-13 15:53:35 +01:00
// Test getRawContent().
$this -> assertSame ( $this -> getSession () -> getPage () -> getContent (), $this -> getRawContent ());
}
/**
* Tests legacy field asserts .
*/
public function testLegacyFieldAsserts () {
$this -> drupalGet ( 'test-field-xpath' );
$this -> assertFieldsByValue ( $this -> xpath ( " //h1[@class = 'page-title'] " ), NULL );
$this -> assertFieldsByValue ( $this -> xpath ( '//table/tbody/tr[2]/td[1]' ), 'one' );
$this -> assertFieldByXPath ( '//table/tbody/tr[2]/td[1]' , 'one' );
$this -> assertFieldsByValue ( $this -> xpath ( " //input[@id = 'edit-name'] " ), 'Test name' );
$this -> assertFieldByXPath ( " //input[@id = 'edit-name'] " , 'Test name' );
$this -> assertFieldsByValue ( $this -> xpath ( " //select[@id = 'edit-options'] " ), '2' );
$this -> assertFieldByXPath ( " //select[@id = 'edit-options'] " , '2' );
$this -> assertNoFieldByXPath ( '//notexisting' );
$this -> assertNoFieldByXPath ( " //input[@id = 'edit-name'] " , 'wrong value' );
$this -> assertNoFieldById ( 'name' );
$this -> assertNoFieldById ( 'name' , 'not the value' );
$this -> assertNoFieldById ( 'notexisting' );
$this -> assertNoFieldById ( 'notexisting' , NULL );
// Test that the assertion fails correctly if no value is passed in.
try {
$this -> assertNoFieldById ( 'edit-description' );
$this -> fail ( 'The "description" field, with no value was not found.' );
}
catch ( ExpectationException $e ) {
$this -> pass ( 'The "description" field, with no value was found.' );
}
// Test that the assertion fails correctly if a NULL value is passed in.
try {
$this -> assertNoFieldById ( 'edit-name' , NULL );
$this -> fail ( 'The "name" field was not found.' );
}
catch ( ExpectationException $e ) {
$this -> pass ( 'The "name" field was found.' );
}
$this -> assertFieldById ( 'edit-name' , NULL );
$this -> assertFieldById ( 'edit-name' , 'Test name' );
$this -> assertFieldById ( 'edit-description' , NULL );
$this -> assertFieldById ( 'edit-description' );
// Test that the assertion fails correctly if no value is passed in.
try {
$this -> assertFieldById ( 'edit-name' );
$this -> fail ( 'The "edit-name" field with no value was found.' );
}
catch ( \PHPUnit_Framework_ExpectationFailedException $e ) {
$this -> pass ( 'The "edit-name" field with no value was not found.' );
}
// Test that the assertion fails correctly if NULL is passed in.
try {
$this -> assertFieldById ( 'name' , NULL );
$this -> fail ( 'The "name" field was found.' );
}
catch ( ExpectationException $e ) {
$this -> pass ( 'The "name" field was not found.' );
}
$this -> assertNoFieldByName ( 'name' );
$this -> assertNoFieldByName ( 'name' , 'not the value' );
$this -> assertNoFieldByName ( 'notexisting' );
$this -> assertNoFieldByName ( 'notexisting' , NULL );
// Test that the assertion fails correctly if no value is passed in.
try {
$this -> assertNoFieldByName ( 'description' );
$this -> fail ( 'The "description" field, with no value was not found.' );
}
catch ( ExpectationException $e ) {
$this -> pass ( 'The "description" field, with no value was found.' );
}
// Test that the assertion fails correctly if a NULL value is passed in.
try {
$this -> assertNoFieldByName ( 'name' , NULL );
$this -> fail ( 'The "name" field was not found.' );
}
catch ( ExpectationException $e ) {
$this -> pass ( 'The "name" field was found.' );
}
$this -> assertOptionByText ( 'options' , 'one' );
try {
$this -> assertOptionByText ( 'options' , 'four' );
$this -> fail ( 'The select option "four" was found.' );
}
catch ( ExpectationException $e ) {
$this -> pass ( $e -> getMessage ());
}
$this -> assertFieldById ( 'edit-save' , NULL );
// Test that the assertion fails correctly if the field value is passed in
// rather than the id.
try {
$this -> assertFieldById ( 'Save' , NULL );
$this -> fail ( 'The field with id of "Save" was found.' );
}
catch ( ExpectationException $e ) {
$this -> pass ( $e -> getMessage ());
}
$this -> assertNoFieldById ( 'Save' , NULL );
// Test that the assertion fails correctly if the id of an actual field is
// passed in.
try {
$this -> assertNoFieldById ( 'edit-save' , NULL );
$this -> fail ( 'The field with id of "edit-save" was not found.' );
}
catch ( ExpectationException $e ) {
$this -> pass ( $e -> getMessage ());
}
}
/**
* Tests the :: cronRun () method .
*/
public function testCronRun () {
$last_cron_time = \Drupal :: state () -> get ( 'system.cron_last' );
$this -> cronRun ();
$this -> assertSession () -> statusCodeEquals ( 204 );
$next_cron_time = \Drupal :: state () -> get ( 'system.cron_last' );
$this -> assertGreaterThan ( $last_cron_time , $next_cron_time );
2016-10-06 15:16:20 -07:00
}
2017-02-02 16:28:38 -08:00
/**
* Tests the Drupal install done in \Drupal\Tests\BrowserTestBase :: setUp () .
*/
public function testInstall () {
$htaccess_filename = $this -> tempFilesDirectory . '/.htaccess' ;
$this -> assertTrue ( file_exists ( $htaccess_filename ), " $htaccess_filename exists " );
}
2015-08-17 17:00:26 -07:00
}