class SelectTest

Same name and namespace in other branches
  1. 11.x core/tests/Drupal/KernelTests/Core/Database/SelectTest.php \Drupal\KernelTests\Core\Database\SelectTest
  2. 10 core/tests/Drupal/KernelTests/Core/Database/SelectTest.php \Drupal\KernelTests\Core\Database\SelectTest
  3. 9 core/tests/Drupal/KernelTests/Core/Database/SelectTest.php \Drupal\KernelTests\Core\Database\SelectTest
  4. 8.9.x core/tests/Drupal/KernelTests/Core/Database/SelectTest.php \Drupal\KernelTests\Core\Database\SelectTest

Tests the Select query builder.

Attributes

#[Group('Database')] #[RunTestsInSeparateProcesses]

Hierarchy

Expanded class hierarchy of SelectTest

File

core/tests/Drupal/KernelTests/Core/Database/SelectTest.php, line 18

Namespace

Drupal\KernelTests\Core\Database
View source
class SelectTest extends DatabaseTestBase {
  
  /**
   * Tests rudimentary SELECT statements.
   */
  public function testSimpleSelect() : void {
    $query = $this->connection
      ->select('test');
    $query->addField('test', 'name');
    $query->addField('test', 'age', 'age');
    $num_records = $query->countQuery()
      ->execute()
      ->fetchField();
    $this->assertEquals(4, $num_records, 'Returned the correct number of rows.');
  }
  
  /**
   * Tests rudimentary SELECT statement with a COMMENT.
   */
  public function testSimpleComment() : void {
    $query = $this->connection
      ->select('test')
      ->comment('Testing query comments');
    $query->addField('test', 'name');
    $query->addField('test', 'age', 'age');
    $result = $query->execute();
    $records = $result->fetchAll();
    $query = (string) $query;
    $expected = "/* Testing query comments */";
    $this->assertCount(4, $records, 'Returned the correct number of rows.');
    $this->assertStringContainsString($expected, $query, 'The flattened query contains the comment string.');
  }
  
  /**
   * Tests query COMMENT system against vulnerabilities.
   */
  public function testVulnerableComment() : void {
    $query = $this->connection
      ->select('test')
      ->comment('Testing query comments */ SELECT nid FROM {node}; --');
    $query->addField('test', 'name');
    $query->addField('test', 'age', 'age');
    $result = $query->execute();
    $records = $result->fetchAll();
    $query = (string) $query;
    $expected = "/* Testing query comments  * / SELECT nid FROM {node}. -- */";
    // Check the returned number of rows.
    $this->assertCount(4, $records);
    // Check that the flattened query contains the sanitized comment string.
    $this->assertStringContainsString($expected, $query);
    $connection = Database::getConnection();
    foreach ($this->makeCommentsProvider() as $test_set) {
      [$expected, $comments] = $test_set;
      $this->assertEquals($expected, $connection->makeComment($comments));
    }
  }
  
  /**
   * Provides expected and input values for testVulnerableComment().
   */
  public function makeCommentsProvider() : array {
    return [
      [
        '/*  */ ',
        [
          '',
        ],
      ],
      // Try and close the comment early.
[
        '/* Exploit  * / DROP TABLE node. -- */ ',
        [
          'Exploit */ DROP TABLE node; --',
        ],
      ],
      // Variations on comment closing.
[
        '/* Exploit  * / * / DROP TABLE node. -- */ ',
        [
          'Exploit */*/ DROP TABLE node; --',
        ],
      ],
      [
        '/* Exploit  *  * // DROP TABLE node. -- */ ',
        [
          'Exploit **// DROP TABLE node; --',
        ],
      ],
      // Try closing the comment in the second string which is appended.
[
        '/* Exploit  * / DROP TABLE node. --. Another try  * / DROP TABLE node. -- */ ',
        [
          'Exploit */ DROP TABLE node; --',
          'Another try */ DROP TABLE node; --',
        ],
      ],
    ];
  }
  
  /**
   * Tests basic conditionals on SELECT statements.
   */
  public function testSimpleSelectConditional() : void {
    $query = $this->connection
      ->select('test');
    $name_field = $query->addField('test', 'name');
    $age_field = $query->addField('test', 'age', 'age');
    $query->condition('age', 27);
    $result = $query->execute();
    // Check that the aliases are being created the way we want.
    $this->assertEquals('name', $name_field, 'Name field alias is correct.');
    $this->assertEquals('age', $age_field, 'Age field alias is correct.');
    // Ensure that we got the right record.
    $record = $result->fetch();
    $this->assertEquals('George', $record->{$name_field}, 'Fetched name is correct.');
    $this->assertEquals(27, $record->{$age_field}, 'Fetched age is correct.');
  }
  
  /**
   * Tests SELECT statements with expressions.
   */
  public function testSimpleSelectExpression() : void {
    $query = $this->connection
      ->select('test');
    $name_field = $query->addField('test', 'name');
    $age_field = $query->addExpression("[age]*2", 'double_age');
    $query->condition('age', 27);
    $result = $query->execute();
    // Check that the aliases are being created the way we want.
    $this->assertEquals('name', $name_field, 'Name field alias is correct.');
    $this->assertEquals('double_age', $age_field, 'Age field alias is correct.');
    // Ensure that we got the right record.
    $record = $result->fetch();
    $this->assertEquals('George', $record->{$name_field}, 'Fetched name is correct.');
    $this->assertEquals(27 * 2, $record->{$age_field}, 'Fetched age expression is correct.');
  }
  
  /**
   * Tests SELECT statements with multiple expressions.
   */
  public function testSimpleSelectExpressionMultiple() : void {
    $query = $this->connection
      ->select('test');
    $name_field = $query->addField('test', 'name');
    $age_double_field = $query->addExpression("[age]*2");
    $age_triple_field = $query->addExpression("[age]*3");
    $query->condition('age', 27);
    $result = $query->execute();
    // Check that the aliases are being created the way we want.
    $this->assertEquals('expression', $age_double_field, 'Double age field alias is correct.');
    $this->assertEquals('expression_2', $age_triple_field, 'Triple age field alias is correct.');
    // Ensure that we got the right record.
    $record = $result->fetch();
    $this->assertEquals('George', $record->{$name_field}, 'Fetched name is correct.');
    $this->assertEquals(27 * 2, $record->{$age_double_field}, 'Fetched double age expression is correct.');
    $this->assertEquals(27 * 3, $record->{$age_triple_field}, 'Fetched triple age expression is correct.');
  }
  
  /**
   * Tests adding multiple fields to a SELECT statement at the same time.
   */
  public function testSimpleSelectMultipleFields() : void {
    $record = $this->connection
      ->select('test')
      ->fields('test', [
      'id',
      'name',
      'age',
      'job',
    ])
      ->condition('age', 27)
      ->execute()
      ->fetchObject();
    // Check that all fields we asked for are present.
    $this->assertNotNull($record->id, 'ID field is present.');
    $this->assertNotNull($record->name, 'Name field is present.');
    $this->assertNotNull($record->age, 'Age field is present.');
    $this->assertNotNull($record->job, 'Job field is present.');
    // Ensure that we got the right record.
    // Check that all fields we asked for are present.
    $this->assertEquals(2, $record->id, 'ID field has the correct value.');
    $this->assertEquals('George', $record->name, 'Name field has the correct value.');
    $this->assertEquals(27, $record->age, 'Age field has the correct value.');
    $this->assertEquals('Singer', $record->job, 'Job field has the correct value.');
  }
  
  /**
   * Tests adding all fields from a given table to a SELECT statement.
   */
  public function testSimpleSelectAllFields() : void {
    $record = $this->connection
      ->select('test')
      ->fields('test')
      ->condition('age', 27)
      ->execute()
      ->fetchObject();
    // Check that all fields we asked for are present.
    $this->assertNotNull($record->id, 'ID field is present.');
    $this->assertNotNull($record->name, 'Name field is present.');
    $this->assertNotNull($record->age, 'Age field is present.');
    $this->assertNotNull($record->job, 'Job field is present.');
    // Ensure that we got the right record.
    // Check that all fields we asked for are present.
    $this->assertEquals(2, $record->id, 'ID field has the correct value.');
    $this->assertEquals('George', $record->name, 'Name field has the correct value.');
    $this->assertEquals(27, $record->age, 'Age field has the correct value.');
    $this->assertEquals('Singer', $record->job, 'Job field has the correct value.');
  }
  
  /**
   * Tests that a comparison with NULL is always FALSE.
   */
  public function testNullCondition() : void {
    $this->ensureSampleDataNull();
    $names = $this->connection
      ->select('test_null', 'tn')
      ->fields('tn', [
      'name',
    ])
      ->condition('age', NULL)
      ->execute()
      ->fetchCol();
    $this->assertCount(0, $names, 'No records found when comparing to NULL.');
  }
  
  /**
   * Tests that we can find a record with a NULL value.
   */
  public function testIsNullCondition() : void {
    $this->ensureSampleDataNull();
    $names = $this->connection
      ->select('test_null', 'tn')
      ->fields('tn', [
      'name',
    ])
      ->isNull('age')
      ->execute()
      ->fetchCol();
    $this->assertCount(1, $names, 'Correct number of records found with NULL age.');
    $this->assertEquals('Ernie', $names[0], 'Correct record returned for NULL age.');
  }
  
  /**
   * Tests that we can find a record without a NULL value.
   */
  public function testIsNotNullCondition() : void {
    $this->ensureSampleDataNull();
    $names = $this->connection
      ->select('test_null', 'tn')
      ->fields('tn', [
      'name',
    ])
      ->isNotNull('tn.age')
      ->orderBy('name')
      ->execute()
      ->fetchCol();
    $this->assertCount(2, $names, 'Correct number of records found withNOT NULL age.');
    $this->assertEquals('Gonzo', $names[0], 'Correct record returned for NOT NULL age.');
    $this->assertEquals('Kermit', $names[1], 'Correct record returned for NOT NULL age.');
  }
  
  /**
   * Tests that we can force a query to return an empty result.
   */
  public function testAlwaysFalseCondition() : void {
    $names = $this->connection
      ->select('test', 'test')
      ->fields('test', [
      'name',
    ])
      ->condition('age', 27)
      ->execute()
      ->fetchCol();
    $this->assertCount(1, $names);
    $this->assertSame($names[0], 'George');
    $names = $this->connection
      ->select('test', 'test')
      ->fields('test', [
      'name',
    ])
      ->condition('age', 27)
      ->alwaysFalse()
      ->execute()
      ->fetchCol();
    $this->assertCount(0, $names);
  }
  
  /**
   * Tests that we can force an extended query to return an empty result.
   */
  public function testExtenderAlwaysFalseCondition() : void {
    $names = $this->connection
      ->select('test', 'test')
      ->extend(SelectExtender::class)
      ->fields('test', [
      'name',
    ])
      ->condition('age', 27)
      ->execute()
      ->fetchCol();
    $this->assertCount(1, $names);
    $this->assertSame($names[0], 'George');
    $names = $this->connection
      ->select('test', 'test')
      ->extend(SelectExtender::class)
      ->fields('test', [
      'name',
    ])
      ->condition('age', 27)
      ->alwaysFalse()
      ->execute()
      ->fetchCol();
    $this->assertCount(0, $names);
  }
  
  /**
   * Tests that we can UNION multiple Select queries together.
   *
   * This is semantically equal to UNION DISTINCT, so we don't explicitly test
   * that.
   */
  public function testUnion() : void {
    $query_1 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
    ])
      ->condition('age', [
      27,
      28,
    ], 'IN');
    $query_2 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
    ])
      ->condition('age', 28);
    $query_1->union($query_2);
    $names = $query_1->execute()
      ->fetchCol();
    // Ensure we only get 2 records.
    $this->assertCount(2, $names, 'UNION correctly discarded duplicates.');
    $this->assertEqualsCanonicalizing([
      'George',
      'Ringo',
    ], $names);
  }
  
  /**
   * Tests that we can UNION ALL multiple SELECT queries together.
   */
  public function testUnionAll() : void {
    $query_1 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
    ])
      ->condition('age', [
      27,
      28,
    ], 'IN');
    $query_2 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
    ])
      ->condition('age', 28);
    $query_1->union($query_2, 'ALL');
    $names = $query_1->execute()
      ->fetchCol();
    // Ensure we get all 3 records.
    $this->assertCount(3, $names, 'UNION ALL correctly preserved duplicates.');
    $this->assertEquals('George', $names[0], 'First query returned correct first name.');
    $this->assertEquals('Ringo', $names[1], 'Second query returned correct second name.');
    $this->assertEquals('Ringo', $names[2], 'Third query returned correct name.');
  }
  
  /**
   * Tests that we can get a count query for a UNION Select query.
   */
  public function testUnionCount() : void {
    $query_1 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
      'age',
    ])
      ->condition('age', [
      27,
      28,
    ], 'IN');
    $query_2 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
      'age',
    ])
      ->condition('age', 28);
    $query_1->union($query_2, 'ALL');
    $names = $query_1->execute()
      ->fetchCol();
    $count = (int) $query_1->countQuery()
      ->execute()
      ->fetchField();
    // Ensure the counts match.
    $this->assertSame(count($names), $count, "The count query's result matched the number of rows in the UNION query.");
  }
  
  /**
   * Tests that we can UNION multiple Select queries together and set the ORDER.
   */
  public function testUnionOrder() : void {
    // This gives George and Ringo.
    $query_1 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
    ])
      ->condition('age', [
      27,
      28,
    ], 'IN');
    // This gives Paul.
    $query_2 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
    ])
      ->condition('age', 26);
    $query_1->union($query_2);
    $query_1->orderBy('name', 'DESC');
    $names = $query_1->execute()
      ->fetchCol();
    // Ensure we get all 3 records.
    $this->assertCount(3, $names, 'UNION returned rows from both queries.');
    // Ensure that the names are in the correct reverse alphabetical order,
    // regardless of which query they came from.
    $this->assertEquals('Ringo', $names[0], 'First query returned correct name.');
    $this->assertEquals('Paul', $names[1], 'Second query returned correct name.');
    $this->assertEquals('George', $names[2], 'Third query returned correct name.');
  }
  
  /**
   * Tests that we can UNION multiple Select queries together with and a LIMIT.
   */
  public function testUnionOrderLimit() : void {
    // This gives George and Ringo.
    $query_1 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
    ])
      ->condition('age', [
      27,
      28,
    ], 'IN');
    // This gives Paul.
    $query_2 = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'name',
    ])
      ->condition('age', 26);
    $query_1->union($query_2);
    $query_1->orderBy('name', 'DESC');
    $query_1->range(0, 2);
    $names = $query_1->execute()
      ->fetchCol();
    // Ensure we get all only 2 of the 3 records.
    $this->assertCount(2, $names, 'UNION with a limit returned rows from both queries.');
    // Ensure that the names are in the correct reverse alphabetical order,
    // regardless of which query they came from.
    $this->assertEquals('Ringo', $names[0], 'First query returned correct name.');
    $this->assertEquals('Paul', $names[1], 'Second query returned correct name.');
  }
  
  /**
   * Tests that random ordering of queries works.
   *
   * We take the approach of testing the Drupal layer only, rather than trying
   * to test that the database's random number generator actually produces
   * random queries (which is very difficult to do without an unacceptable risk
   * of the test failing by accident).
   *
   * Therefore, in this test we simply run the same query twice and assert that
   * the two results are reordered versions of each other (as well as of the
   * same query without the random ordering). It is reasonable to assume that
   * if we run the same select query twice and the results are in a different
   * order each time, the only way this could happen is if we have successfully
   * triggered the database's random ordering functionality.
   */
  public function testRandomOrder() : void {
    // Use 52 items, so the chance that this test fails by accident will be the
    // same as the chance that a deck of cards will come out in the same order
    // after shuffling it (in other words, nearly impossible).
    $number_of_items = 52;
    while ($this->connection
      ->query("SELECT MAX([id]) FROM {test}")
      ->fetchField() < $number_of_items) {
      $this->connection
        ->insert('test')
        ->fields([
        'name' => $this->randomMachineName(),
      ])
        ->execute();
    }
    // First select the items in order and make sure we get an ordered list.
    $expected_ids = range(1, $number_of_items);
    $ordered_ids = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'id',
    ])
      ->range(0, $number_of_items)
      ->orderBy('id')
      ->execute()
      ->fetchCol();
    $this->assertEquals($expected_ids, $ordered_ids, 'A query without random ordering returns IDs in the correct order.');
    // Now perform the same query, but instead choose a random ordering. We
    // expect this to contain a differently ordered version of the original
    // result.
    $randomized_ids = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'id',
    ])
      ->range(0, $number_of_items)
      ->orderRandom()
      ->execute()
      ->fetchCol();
    $this->assertNotEquals($ordered_ids, $randomized_ids, 'A query with random ordering returns an unordered set of IDs.');
    $sorted_ids = $randomized_ids;
    sort($sorted_ids);
    $this->assertEquals($ordered_ids, $sorted_ids, 'After sorting the random list, the result matches the original query.');
    // Now perform the exact same query again, and make sure the order is
    // different.
    $randomized_ids_second_set = $this->connection
      ->select('test', 't')
      ->fields('t', [
      'id',
    ])
      ->range(0, $number_of_items)
      ->orderRandom()
      ->execute()
      ->fetchCol();
    $this->assertNotEquals($randomized_ids, $randomized_ids_second_set, 'Performing the query with random ordering a second time returns IDs in a different order.');
    $sorted_ids_second_set = $randomized_ids_second_set;
    sort($sorted_ids_second_set);
    $this->assertEquals($sorted_ids, $sorted_ids_second_set, 'After sorting the second random list, the result matches the sorted version of the first random list.');
  }
  
  /**
   * Data provider for testRegularExpressionCondition().
   *
   * @return array[]
   *   Returns data-set elements with:
   *     - the expected result of the query
   *     - the table column to do the search on.
   *     - the regular expression pattern to search for.
   *     - the regular expression operator 'REGEXP' or 'NOT REGEXP'.
   */
  public static function providerRegularExpressionCondition() : array {
    return [
      [
        [
          'John',
        ],
        'name',
        'hn$',
        'REGEXP',
      ],
      [
        [
          'Paul',
        ],
        'name',
        '^Pau',
        'REGEXP',
      ],
      [
        [
          'George',
          'Ringo',
        ],
        'name',
        'Ringo|George',
        'REGEXP',
      ],
      [
        [
          'Pete',
        ],
        'job',
        '#Drummer',
        'REGEXP',
      ],
      [
        [],
        'job',
        '#Singer',
        'REGEXP',
      ],
      [
        [
          'Paul',
          'Pete',
        ],
        'age',
        '2[6]',
        'REGEXP',
      ],
      [
        [
          'George',
          'Paul',
          'Pete',
          'Ringo',
        ],
        'name',
        'hn$',
        'NOT REGEXP',
      ],
      [
        [
          'George',
          'John',
          'Pete',
          'Ringo',
        ],
        'name',
        '^Pau',
        'NOT REGEXP',
      ],
      [
        [
          'John',
          'Paul',
          'Pete',
        ],
        'name',
        'Ringo|George',
        'NOT REGEXP',
      ],
      [
        [
          'George',
          'John',
          'Paul',
          'Ringo',
        ],
        'job',
        '#Drummer',
        'NOT REGEXP',
      ],
      [
        [
          'George',
          'John',
          'Paul',
          'Pete',
          'Ringo',
        ],
        'job',
        '#Singer',
        'NOT REGEXP',
      ],
      [
        [
          'George',
          'John',
          'Ringo',
        ],
        'age',
        '2[6]',
        'NOT REGEXP',
      ],
    ];
  }
  
  /**
   * Tests that filter by 'REGEXP' and 'NOT REGEXP' works as expected.
   */
  public function testRegularExpressionCondition(array $expected, string $column, string $pattern, string $operator) : void {
    $database = $this->container
      ->get('database');
    $database->insert('test')
      ->fields([
      'name' => 'Pete',
      'age' => 26,
      'job' => '#Drummer',
    ])
      ->execute();
    $query = $database->select('test', 't');
    $query->addField('t', 'name');
    $query->condition("t.{$column}", $pattern, $operator);
    $result = $query->execute()
      ->fetchCol();
    sort($result);
    $this->assertEquals($expected, $result);
  }
  
  /**
   * Tests that aliases are renamed when they are duplicates.
   */
  public function testSelectDuplicateAlias() : void {
    $query = $this->connection
      ->select('test', 't');
    $alias1 = $query->addField('t', 'name', 'the_alias');
    $alias2 = $query->addField('t', 'age', 'the_alias');
    $this->assertNotSame($alias1, $alias2, 'Duplicate aliases are renamed.');
  }
  
  /**
   * Tests that an invalid count query throws an exception.
   */
  public function testInvalidSelectCount() : void {
    $this->expectException(DatabaseExceptionWrapper::class);
    // This query will fail because the table does not exist.
    $this->connection
      ->select('some_table_that_does_not_exist', 't')
      ->fields('t')
      ->countQuery()
      ->execute();
  }
  
  /**
   * Tests thrown exception for IN query conditions with an empty array.
   */
  public function testEmptyInCondition() : void {
    try {
      $this->connection
        ->select('test', 't')
        ->fields('t')
        ->condition('age', [], 'IN')
        ->execute();
      $this->fail('Expected exception not thrown');
    } catch (InvalidQueryException $e) {
      $this->assertEquals("Query condition 'age IN ()' cannot be empty.", $e->getMessage());
    }
    try {
      $this->connection
        ->select('test', 't')
        ->fields('t')
        ->condition('age', [], 'NOT IN')
        ->execute();
      $this->fail('Expected exception not thrown');
    } catch (InvalidQueryException $e) {
      $this->assertEquals("Query condition 'age NOT IN ()' cannot be empty.", $e->getMessage());
    }
  }
  
  /**
   * Data provider for testNonArrayOperatorWithArrayValueCondition().
   *
   * @return array[]
   *   Array of non array compatible operators and its value in the expected
   *   exception message.
   */
  public static function providerNonArrayOperatorWithArrayValueCondition() : array {
    return [
      '=' => [
        '=',
        '=',
      ],
      '>' => [
        '>',
        '>',
      ],
      '<' => [
        '<',
        '<',
      ],
      '>=' => [
        '>=',
        '>=',
      ],
      '<=' => [
        '<=',
        '<=',
      ],
      'IS NULL' => [
        'IS NULL',
        'IS NULL',
      ],
      'IS NOT NULL' => [
        'IS NOT NULL',
        'IS NOT NULL',
      ],
      'Empty string' => [
        '',
        '=',
      ],
      'Not set' => [
        NULL,
        '=',
      ],
    ];
  }
  
  /**
   * Tests thrown exception for non array operator conditions with array value.
   */
  public function testNonArrayOperatorWithArrayValueCondition(?string $operator, string $operator_in_exception_message) : void {
    $this->expectException(InvalidQueryException::class);
    $this->expectExceptionMessage("Query condition 'age " . $operator_in_exception_message . " 26, 27' must have an array compatible operator.");
    $this->connection
      ->select('test', 't')
      ->fields('t')
      ->condition('age', [
      26,
      27,
    ], $operator)
      ->execute();
  }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
AssertContentTrait::$content protected property The current raw content.
AssertContentTrait::$drupalSettings protected property The drupalSettings value from the current raw $content.
AssertContentTrait::$elements protected property The XML structure parsed from the current raw $content.
AssertContentTrait::$plainTextContent protected property The plain-text content of raw $content (text nodes).
AssertContentTrait::assertEscaped protected function Passes if the raw text IS found escaped on the loaded page, fail otherwise.
AssertContentTrait::assertField protected function Asserts that a field exists with the given name or ID.
AssertContentTrait::assertFieldByName protected function Asserts that a field exists with the given name and value.
AssertContentTrait::assertFieldByXPath protected function Asserts that a field exists in the current page by the given XPath.
AssertContentTrait::assertFieldsByValue protected function Asserts that a field exists in the current page with a given Xpath result.
AssertContentTrait::assertLink protected function Passes if a link with the specified label is found.
AssertContentTrait::assertLinkByHref protected function Passes if a link containing a given href (part) is found.
AssertContentTrait::assertNoLink protected function Passes if a link with the specified label is not found.
AssertContentTrait::assertNoPattern protected function Triggers a pass if the perl regex pattern is not found in raw content.
AssertContentTrait::assertNoRaw protected function Passes if the raw text is NOT found on the loaded page, fail otherwise.
AssertContentTrait::assertNoText protected function Passes if the page (with HTML stripped) does not contains the text.
AssertContentTrait::assertPattern protected function Triggers a pass if the Perl regex pattern is found in the raw content.
AssertContentTrait::assertRaw protected function Passes if the raw text IS found on the loaded page, fail otherwise.
AssertContentTrait::assertText protected function Passes if the page (with HTML stripped) contains the text.
AssertContentTrait::assertTextHelper protected function Helper for assertText and assertNoText.
AssertContentTrait::assertThemeOutput protected function Asserts themed output.
AssertContentTrait::assertTitle protected function Pass if the page title is the given string.
AssertContentTrait::buildXPathQuery protected function Builds an XPath query.
AssertContentTrait::constructFieldXpath protected function Helper: Constructs an XPath for the given set of attributes and value.
AssertContentTrait::cssSelect protected function Searches elements using a CSS selector in the raw content.
AssertContentTrait::getAllOptions protected function Get all option elements, including nested options, in a select.
AssertContentTrait::getDrupalSettings protected function Gets the value of drupalSettings for the currently-loaded page.
AssertContentTrait::getRawContent protected function Gets the current raw content.
AssertContentTrait::getSelectedItem protected function Get the selected value from a select field.
AssertContentTrait::getTextContent protected function Retrieves the plain-text content from the current raw content.
AssertContentTrait::parse protected function Parse content returned from curlExec using DOM and SimpleXML.
AssertContentTrait::removeWhiteSpace protected function Removes all white-space between HTML tags from the raw content.
AssertContentTrait::setDrupalSettings protected function Sets the value of drupalSettings for the currently-loaded page.
AssertContentTrait::setRawContent protected function Sets the raw content (e.g. HTML).
AssertContentTrait::xpath protected function Performs an xpath search on the contents of the internal browser.
BrowserHtmlDebugTrait::$htmlOutputBaseUrl protected property The Base URI to use for links to the output files.
BrowserHtmlDebugTrait::$htmlOutputClassName protected property Class name for HTML output logging.
BrowserHtmlDebugTrait::$htmlOutputCounter protected property Counter for HTML output logging.
BrowserHtmlDebugTrait::$htmlOutputCounterStorage protected property Counter storage for HTML output logging.
BrowserHtmlDebugTrait::$htmlOutputDirectory protected property Directory name for HTML output logging.
BrowserHtmlDebugTrait::$htmlOutputEnabled protected property HTML output enabled.
BrowserHtmlDebugTrait::$htmlOutputTestId protected property HTML output test ID.
BrowserHtmlDebugTrait::formatHtmlOutputHeaders protected function Formats HTTP headers as string for HTML output logging.
BrowserHtmlDebugTrait::getHtmlOutputHeaders protected function Returns headers in HTML output format. 1
BrowserHtmlDebugTrait::getResponseLogHandler protected function Provides a Guzzle middleware handler to log every response received.
BrowserHtmlDebugTrait::getTestMethodCaller protected function Retrieves the current calling line in the class under test. 1
BrowserHtmlDebugTrait::htmlOutput protected function Logs a HTML output message in a text file.
BrowserHtmlDebugTrait::initBrowserOutputFile protected function Creates the directory to store browser output.
ConfigTestTrait::configImporter protected function Returns a ConfigImporter object to import test configuration.
ConfigTestTrait::copyConfig protected function Copies configuration objects from source storage to target storage.
DatabaseTestBase::$connection protected property The database connection for testing.
DatabaseTestBase::$modules protected static property Modules to install. Overrides KernelTestBase::$modules 2
DatabaseTestBase::ensureSampleDataNull public function Sets up tables for NULL handling.
DatabaseTestBase::setUp protected function Overrides KernelTestBase::setUp 1
DatabaseTestSchemaDataTrait::addSampleData protected function Sets up our sample data.
DatabaseTestSchemaInstallTrait::installSampleSchema protected function Sets up our sample table schema.
DrupalTestCaseTrait::$root protected property The Drupal root directory.
DrupalTestCaseTrait::checkErrorHandlerOnTearDown public function Checks the test error handler after test execution. 1
DrupalTestCaseTrait::getDrupalRoot protected static function Returns the Drupal root directory. 1
DrupalTestCaseTrait::setDebugDumpHandler public static function Registers the dumper CLI handler when the DebugDump extension is enabled.
ExtensionListTestTrait::getModulePath protected function Gets the path for the specified module.
ExtensionListTestTrait::getThemePath protected function Gets the path for the specified theme.
HttpKernelUiHelperTrait::$mink protected property Mink session manager.
HttpKernelUiHelperTrait::assertSession public function Returns WebAssert object.
HttpKernelUiHelperTrait::buildUrl protected function Builds a URL from a system path or a URL object.
HttpKernelUiHelperTrait::clickLink protected function Follows a link by complete name.
HttpKernelUiHelperTrait::drupalGet protected function Retrieves a Drupal path.
HttpKernelUiHelperTrait::getDefaultDriverInstance protected function Gets an instance of the default Mink driver.
HttpKernelUiHelperTrait::getNodeElementsByXpath protected function Performs an xpath search on the contents of the internal browser.
HttpKernelUiHelperTrait::getSession public function Returns Mink session.
HttpKernelUiHelperTrait::getUrl protected function Gets the current URL from the browser.
HttpKernelUiHelperTrait::initMink protected function Initializes Mink sessions.
KernelTestBase::$classLoader protected property The class loader.
KernelTestBase::$configImporter protected property The configuration importer.
KernelTestBase::$configSchemaCheckerExclusions protected static property An array of config object names that are excluded from schema checking. 4
KernelTestBase::$container protected property The test container.
KernelTestBase::$databasePrefix protected property The test database prefix.
KernelTestBase::$keyValue protected property The key_value service that must persist between container rebuilds.
KernelTestBase::$siteDirectory protected property The relative path to the test site directory.
KernelTestBase::$strictConfigSchema protected property Set to TRUE to strict check all configuration saved. 9
KernelTestBase::$usesSuperUserAccessPolicy protected property Set to TRUE to make user 1 a super user. 1
KernelTestBase::$vfsRoot protected property The virtual filesystem root directory.
KernelTestBase::assertPostConditions protected function 1
KernelTestBase::bootEnvironment protected function Bootstraps a basic test environment.
KernelTestBase::bootKernel protected function Bootstraps a kernel for a test. 1
KernelTestBase::config protected function Configuration accessor for tests. Returns non-overridden configuration.
KernelTestBase::disableModules protected function Disables modules for this test.
KernelTestBase::enableModules protected function Enables modules for this test. 2
KernelTestBase::getConfigSchemaExclusions protected function Gets the config schema exclusions for this test.
KernelTestBase::getDatabaseConnectionInfo protected function Returns the Database connection info to be used for this test. 3
KernelTestBase::getDatabasePrefix public function Gets the database prefix used for test isolation.
KernelTestBase::getExtensionsForModules private function Returns Extension objects for $modules to install.
KernelTestBase::getModulesToEnable protected static function Returns the modules to install for this test.
KernelTestBase::initFileCache protected function Initializes the FileCache component.
KernelTestBase::installConfig protected function Installs default configuration for a given list of modules.
KernelTestBase::installEntitySchema protected function Installs the storage schema for a specific entity type.
KernelTestBase::installSchema protected function Installs database tables from a module schema definition.
KernelTestBase::register public function Registers test-specific services. Overrides ServiceProviderInterface::register 40
KernelTestBase::render protected function Renders a render array. 1
KernelTestBase::setInstallProfile protected function Sets the install profile and rebuilds the container to update it.
KernelTestBase::setSetting protected function Sets an in-memory Settings variable.
KernelTestBase::setUpFilesystem protected function Sets up the filesystem, so things like the file directory. 3
KernelTestBase::tearDown protected function 10
KernelTestBase::tearDownCloseDatabaseConnection public function Additional tear down method to close the connection at the end.
KernelTestBase::vfsDump protected function Dumps the current state of the virtual filesystem to STDOUT.
KernelTestBase::__sleep public function Prevents serializing any properties.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers.
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
SelectTest::makeCommentsProvider public function Provides expected and input values for testVulnerableComment().
SelectTest::providerNonArrayOperatorWithArrayValueCondition public static function Data provider for testNonArrayOperatorWithArrayValueCondition().
SelectTest::providerRegularExpressionCondition public static function Data provider for testRegularExpressionCondition().
SelectTest::testAlwaysFalseCondition public function Tests that we can force a query to return an empty result.
SelectTest::testEmptyInCondition public function Tests thrown exception for IN query conditions with an empty array.
SelectTest::testExtenderAlwaysFalseCondition public function Tests that we can force an extended query to return an empty result.
SelectTest::testInvalidSelectCount public function Tests that an invalid count query throws an exception.
SelectTest::testIsNotNullCondition public function Tests that we can find a record without a NULL value.
SelectTest::testIsNullCondition public function Tests that we can find a record with a NULL value.
SelectTest::testNonArrayOperatorWithArrayValueCondition public function Tests thrown exception for non array operator conditions with array value.
SelectTest::testNullCondition public function Tests that a comparison with NULL is always FALSE.
SelectTest::testRandomOrder public function Tests that random ordering of queries works.
SelectTest::testRegularExpressionCondition public function Tests that filter by &#039;REGEXP&#039; and &#039;NOT REGEXP&#039; works as expected.
SelectTest::testSelectDuplicateAlias public function Tests that aliases are renamed when they are duplicates.
SelectTest::testSimpleComment public function Tests rudimentary SELECT statement with a COMMENT.
SelectTest::testSimpleSelect public function Tests rudimentary SELECT statements.
SelectTest::testSimpleSelectAllFields public function Tests adding all fields from a given table to a SELECT statement.
SelectTest::testSimpleSelectConditional public function Tests basic conditionals on SELECT statements.
SelectTest::testSimpleSelectExpression public function Tests SELECT statements with expressions.
SelectTest::testSimpleSelectExpressionMultiple public function Tests SELECT statements with multiple expressions.
SelectTest::testSimpleSelectMultipleFields public function Tests adding multiple fields to a SELECT statement at the same time.
SelectTest::testUnion public function Tests that we can UNION multiple Select queries together.
SelectTest::testUnionAll public function Tests that we can UNION ALL multiple SELECT queries together.
SelectTest::testUnionCount public function Tests that we can get a count query for a UNION Select query.
SelectTest::testUnionOrder public function Tests that we can UNION multiple Select queries together and set the ORDER.
SelectTest::testUnionOrderLimit public function Tests that we can UNION multiple Select queries together with and a LIMIT.
SelectTest::testVulnerableComment public function Tests query COMMENT system against vulnerabilities.
StorageCopyTrait::replaceStorageContents protected static function Copy the configuration from one storage to another and remove stale items.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.