annotate core/modules/simpletest/tests/src/Unit/TestBaseTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Tests\simpletest\Unit;
Chris@0 4
Chris@0 5 use Drupal\Tests\UnitTestCase;
Chris@0 6
Chris@0 7 /**
Chris@0 8 * @requires extension curl
Chris@0 9 * @coversDefaultClass \Drupal\simpletest\TestBase
Chris@0 10 * @group simpletest
Chris@18 11 * @group TestBase
Chris@0 12 */
Chris@0 13 class TestBaseTest extends UnitTestCase {
Chris@0 14
Chris@0 15 /**
Chris@0 16 * Helper method for constructing a mock TestBase object.
Chris@0 17 *
Chris@0 18 * TestBase is abstract, so we have to mock it. We'll also
Chris@0 19 * mock the storeAssertion() method so we don't need the database.
Chris@0 20 *
Chris@0 21 * @param string $test_id
Chris@0 22 * An identifying name for the mocked test.
Chris@0 23 *
Chris@0 24 * @return object
Chris@0 25 * Mock of Drupal\simpletest\TestBase.
Chris@0 26 */
Chris@0 27 public function getTestBaseForAssertionTests($test_id) {
Chris@0 28 $mock_test_base = $this->getMockBuilder('Drupal\simpletest\TestBase')
Chris@0 29 ->setConstructorArgs([$test_id])
Chris@0 30 ->setMethods(['storeAssertion'])
Chris@0 31 ->getMockForAbstractClass();
Chris@0 32 // Override storeAssertion() so we don't need a database.
Chris@0 33 $mock_test_base->expects($this->any())
Chris@0 34 ->method('storeAssertion')
Chris@0 35 ->will($this->returnValue(NULL));
Chris@0 36 return $mock_test_base;
Chris@0 37 }
Chris@0 38
Chris@0 39 /**
Chris@0 40 * Invoke methods that are protected or private.
Chris@0 41 *
Chris@0 42 * @param object $object
Chris@0 43 * Object on which to invoke the method.
Chris@0 44 * @param string $method_name
Chris@0 45 * Name of the method to invoke.
Chris@0 46 * @param array $arguments
Chris@0 47 * Array of arguments to be passed to the method.
Chris@0 48 *
Chris@0 49 * @return mixed
Chris@0 50 * Value returned by the invoked method.
Chris@0 51 */
Chris@0 52 public function invokeProtectedMethod($object, $method_name, array $arguments) {
Chris@0 53 $ref_method = new \ReflectionMethod($object, $method_name);
Chris@0 54 $ref_method->setAccessible(TRUE);
Chris@0 55 return $ref_method->invokeArgs($object, $arguments);
Chris@0 56 }
Chris@0 57
Chris@0 58 /**
Chris@0 59 * Provides data for the random string validation test.
Chris@0 60 *
Chris@0 61 * @return array
Chris@0 62 * - The expected result of the validation.
Chris@0 63 * - The string to validate.
Chris@0 64 */
Chris@0 65 public function providerRandomStringValidate() {
Chris@0 66 return [
Chris@0 67 [FALSE, ' curry paste'],
Chris@0 68 [FALSE, 'curry paste '],
Chris@0 69 [FALSE, 'curry paste'],
Chris@0 70 [FALSE, 'curry paste'],
Chris@0 71 [TRUE, 'curry paste'],
Chris@0 72 [TRUE, 'thai green curry paste'],
Chris@0 73 [TRUE, '@startswithat'],
Chris@0 74 [TRUE, 'contains@at'],
Chris@0 75 ];
Chris@0 76 }
Chris@0 77
Chris@0 78 /**
Chris@0 79 * @covers ::randomStringValidate
Chris@0 80 * @dataProvider providerRandomStringValidate
Chris@0 81 */
Chris@0 82 public function testRandomStringValidate($expected, $string) {
Chris@0 83 $mock_test_base = $this->getMockForAbstractClass('Drupal\simpletest\TestBase');
Chris@0 84 $actual = $mock_test_base->randomStringValidate($string);
Chris@0 85 $this->assertEquals($expected, $actual);
Chris@0 86 }
Chris@0 87
Chris@0 88 /**
Chris@0 89 * Provides data for testRandomString() and others.
Chris@0 90 *
Chris@0 91 * @return array
Chris@0 92 * - The number of items (characters, object properties) we expect any of
Chris@0 93 * the random functions to give us.
Chris@0 94 */
Chris@0 95 public function providerRandomItems() {
Chris@0 96 return [
Chris@0 97 [NULL],
Chris@0 98 [0],
Chris@0 99 [1],
Chris@0 100 [2],
Chris@0 101 [3],
Chris@0 102 [4],
Chris@0 103 [7],
Chris@0 104 ];
Chris@0 105 }
Chris@0 106
Chris@0 107 /**
Chris@0 108 * @covers ::randomString
Chris@0 109 * @dataProvider providerRandomItems
Chris@0 110 */
Chris@0 111 public function testRandomString($length) {
Chris@0 112 $mock_test_base = $this->getMockForAbstractClass('Drupal\simpletest\TestBase');
Chris@0 113 $string = $mock_test_base->randomString($length);
Chris@0 114 $this->assertEquals($length, strlen($string));
Chris@0 115 // randomString() should always include an ampersand ('&') and a
Chris@0 116 // greater than ('>') if $length is greater than 3.
Chris@0 117 if ($length > 4) {
Chris@0 118 $this->assertContains('&', $string);
Chris@0 119 $this->assertContains('>', $string);
Chris@0 120 }
Chris@0 121 }
Chris@0 122
Chris@0 123 /**
Chris@0 124 * @covers ::randomObject
Chris@0 125 * @dataProvider providerRandomItems
Chris@0 126 */
Chris@0 127 public function testRandomObject($size) {
Chris@0 128 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 129 // Note: count((array)object) works for now, maybe not later.
Chris@0 130 $this->assertEquals($size, count((array) $test_base->randomObject($size)));
Chris@0 131 }
Chris@0 132
Chris@0 133 /**
Chris@0 134 * @covers ::checkRequirements
Chris@0 135 */
Chris@0 136 public function testCheckRequirements() {
Chris@0 137 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 138 $this->assertInternalType(
Chris@0 139 'array',
Chris@0 140 $this->invokeProtectedMethod($test_base, 'checkRequirements', [])
Chris@0 141 );
Chris@0 142 }
Chris@0 143
Chris@0 144 /**
Chris@0 145 * Data provider for testAssert().
Chris@0 146 *
Chris@0 147 * @return array
Chris@0 148 * Standard dataProvider array of arrays:
Chris@0 149 * - Expected result from assert().
Chris@0 150 * - Expected status stored in TestBase->assertions.
Chris@0 151 * - Status, passed to assert().
Chris@0 152 * - Message, passed to assert().
Chris@0 153 * - Group, passed to assert().
Chris@0 154 * - Caller, passed to assert().
Chris@0 155 */
Chris@0 156 public function providerAssert() {
Chris@0 157 return [
Chris@0 158 [TRUE, 'pass', TRUE, 'Yay pass', 'test', []],
Chris@0 159 [FALSE, 'fail', FALSE, 'Boo fail', 'test', []],
Chris@0 160 [TRUE, 'pass', 'pass', 'Yay pass', 'test', []],
Chris@0 161 [FALSE, 'fail', 'fail', 'Boo fail', 'test', []],
Chris@0 162 [FALSE, 'exception', 'exception', 'Boo fail', 'test', []],
Chris@0 163 [FALSE, 'debug', 'debug', 'Boo fail', 'test', []],
Chris@0 164 ];
Chris@0 165 }
Chris@0 166
Chris@0 167 /**
Chris@0 168 * @covers ::assert
Chris@0 169 * @dataProvider providerAssert
Chris@0 170 */
Chris@0 171 public function testAssert($expected, $assertion_status, $status, $message, $group, $caller) {
Chris@0 172 $test_id = 'luke_i_am_your_' . $assertion_status;
Chris@0 173 $test_base = $this->getTestBaseForAssertionTests($test_id);
Chris@0 174
Chris@0 175 // Verify some startup values.
Chris@0 176 $this->assertAttributeEmpty('assertions', $test_base);
Chris@0 177 if (is_string($status)) {
Chris@0 178 $this->assertEquals(0, $test_base->results['#' . $status]);
Chris@0 179 }
Chris@0 180
Chris@0 181 // assert() is protected so we have to make it accessible.
Chris@0 182 $ref_assert = new \ReflectionMethod($test_base, 'assert');
Chris@0 183 $ref_assert->setAccessible(TRUE);
Chris@0 184
Chris@0 185 // Call assert() from within our hall of mirrors.
Chris@0 186 $this->assertEquals(
Chris@0 187 $expected,
Chris@0 188 $ref_assert->invokeArgs($test_base,
Chris@0 189 [$status, $message, $group, $caller]
Chris@0 190 )
Chris@0 191 );
Chris@0 192
Chris@0 193 // Check the side-effects of assert().
Chris@0 194 if (is_string($status)) {
Chris@0 195 $this->assertEquals(1, $test_base->results['#' . $status]);
Chris@0 196 }
Chris@0 197 $this->assertAttributeNotEmpty('assertions', $test_base);
Chris@0 198 // Make a ReflectionProperty for the assertions property,
Chris@0 199 // since it's protected.
Chris@0 200 $ref_assertions = new \ReflectionProperty($test_base, 'assertions');
Chris@0 201 $ref_assertions->setAccessible(TRUE);
Chris@0 202 $assertions = $ref_assertions->getValue($test_base);
Chris@0 203 $assertion = reset($assertions);
Chris@0 204 $this->assertEquals($assertion_status, $assertion['status']);
Chris@0 205 $this->assertEquals($test_id, $assertion['test_id']);
Chris@0 206 $this->assertEquals(get_class($test_base), $assertion['test_class']);
Chris@0 207 $this->assertEquals($message, $assertion['message']);
Chris@0 208 $this->assertEquals($group, $assertion['message_group']);
Chris@0 209 }
Chris@0 210
Chris@0 211 /**
Chris@0 212 * Data provider for assertTrue().
Chris@0 213 */
Chris@0 214 public function providerAssertTrue() {
Chris@0 215 return [
Chris@0 216 [TRUE, TRUE],
Chris@0 217 [FALSE, FALSE],
Chris@0 218 ];
Chris@0 219 }
Chris@0 220
Chris@0 221 /**
Chris@0 222 * @covers ::assertTrue
Chris@0 223 * @dataProvider providerAssertTrue
Chris@0 224 */
Chris@0 225 public function testAssertTrue($expected, $value) {
Chris@0 226 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 227 $this->assertEquals(
Chris@0 228 $expected,
Chris@0 229 $this->invokeProtectedMethod($test_base, 'assertTrue', [$value])
Chris@0 230 );
Chris@0 231 }
Chris@0 232
Chris@0 233 /**
Chris@0 234 * @covers ::assertFalse
Chris@0 235 * @dataProvider providerAssertTrue
Chris@0 236 */
Chris@0 237 public function testAssertFalse($expected, $value) {
Chris@0 238 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 239 $this->assertEquals(
Chris@0 240 (!$expected),
Chris@0 241 $this->invokeProtectedMethod($test_base, 'assertFalse', [$value])
Chris@0 242 );
Chris@0 243 }
Chris@0 244
Chris@0 245 /**
Chris@0 246 * Data provider for assertNull().
Chris@0 247 */
Chris@0 248 public function providerAssertNull() {
Chris@0 249 return [
Chris@0 250 [TRUE, NULL],
Chris@0 251 [FALSE, ''],
Chris@0 252 ];
Chris@0 253 }
Chris@0 254
Chris@0 255 /**
Chris@0 256 * @covers ::assertNull
Chris@0 257 * @dataProvider providerAssertNull
Chris@0 258 */
Chris@0 259 public function testAssertNull($expected, $value) {
Chris@0 260 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 261 $this->assertEquals(
Chris@0 262 $expected,
Chris@0 263 $this->invokeProtectedMethod($test_base, 'assertNull', [$value])
Chris@0 264 );
Chris@0 265 }
Chris@0 266
Chris@0 267 /**
Chris@0 268 * @covers ::assertNotNull
Chris@0 269 * @dataProvider providerAssertNull
Chris@0 270 */
Chris@0 271 public function testAssertNotNull($expected, $value) {
Chris@0 272 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 273 $this->assertEquals(
Chris@0 274 (!$expected),
Chris@0 275 $this->invokeProtectedMethod($test_base, 'assertNotNull', [$value])
Chris@0 276 );
Chris@0 277 }
Chris@0 278
Chris@0 279 /**
Chris@0 280 * Data provider for tests of equality assertions.
Chris@0 281 *
Chris@0 282 * Used by testAssertIdentical(), testAssertEqual(), testAssertNotIdentical(),
Chris@0 283 * and testAssertNotEqual().
Chris@0 284 *
Chris@0 285 * @return
Chris@0 286 * Array of test data.
Chris@0 287 * - Expected assertion value for identical comparison.
Chris@0 288 * - Expected assertion value for equal comparison.
Chris@0 289 * - First value to compare.
Chris@0 290 * - Second value to compare.
Chris@0 291 */
Chris@0 292 public function providerEqualityAssertions() {
Chris@0 293 return [
Chris@0 294 // Integers and floats.
Chris@0 295 [TRUE, TRUE, 0, 0],
Chris@0 296 [FALSE, TRUE, 0, 0.0],
Chris@0 297 [FALSE, TRUE, '0', 0],
Chris@0 298 [FALSE, TRUE, '0.0', 0.0],
Chris@0 299 [FALSE, FALSE, 23, 77],
Chris@0 300 [TRUE, TRUE, 23.0, 23.0],
Chris@0 301 // Strings.
Chris@0 302 [FALSE, FALSE, 'foof', 'yay'],
Chris@0 303 [TRUE, TRUE, 'yay', 'yay'],
Chris@0 304 // Bools with type conversion.
Chris@0 305 [TRUE, TRUE, TRUE, TRUE],
Chris@0 306 [TRUE, TRUE, FALSE, FALSE],
Chris@0 307 [FALSE, TRUE, NULL, FALSE],
Chris@0 308 [FALSE, TRUE, 'TRUE', TRUE],
Chris@0 309 [FALSE, FALSE, 'FALSE', FALSE],
Chris@0 310 [FALSE, TRUE, 0, FALSE],
Chris@0 311 [FALSE, TRUE, 1, TRUE],
Chris@0 312 [FALSE, TRUE, -1, TRUE],
Chris@0 313 [FALSE, TRUE, '1', TRUE],
Chris@0 314 [FALSE, TRUE, '1.3', TRUE],
Chris@0 315 // Null.
Chris@0 316 [FALSE, FALSE, 'NULL', NULL],
Chris@0 317 [TRUE, TRUE, NULL, NULL],
Chris@0 318 ];
Chris@0 319 }
Chris@0 320
Chris@0 321 /**
Chris@0 322 * @covers ::assertIdentical
Chris@0 323 * @dataProvider providerEqualityAssertions
Chris@0 324 */
Chris@0 325 public function testAssertIdentical($expected_identical, $expected_equal, $first, $second) {
Chris@0 326 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 327 $this->assertEquals(
Chris@0 328 $expected_identical,
Chris@0 329 $this->invokeProtectedMethod($test_base, 'assertIdentical', [$first, $second])
Chris@0 330 );
Chris@0 331 }
Chris@0 332
Chris@0 333 /**
Chris@0 334 * @covers ::assertNotIdentical
Chris@0 335 * @dataProvider providerEqualityAssertions
Chris@0 336 */
Chris@0 337 public function testAssertNotIdentical($expected_identical, $expected_equal, $first, $second) {
Chris@0 338 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 339 $this->assertEquals(
Chris@0 340 (!$expected_identical),
Chris@0 341 $this->invokeProtectedMethod($test_base, 'assertNotIdentical', [$first, $second])
Chris@0 342 );
Chris@0 343 }
Chris@0 344
Chris@0 345 /**
Chris@0 346 * @covers ::assertEqual
Chris@0 347 * @dataProvider providerEqualityAssertions
Chris@0 348 */
Chris@0 349 public function testAssertEqual($expected_identical, $expected_equal, $first, $second) {
Chris@0 350 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 351 $this->assertEquals(
Chris@0 352 $expected_equal,
Chris@0 353 $this->invokeProtectedMethod($test_base, 'assertEqual', [$first, $second])
Chris@0 354 );
Chris@0 355 }
Chris@0 356
Chris@0 357 /**
Chris@0 358 * @covers ::assertNotEqual
Chris@0 359 * @dataProvider providerEqualityAssertions
Chris@0 360 */
Chris@0 361 public function testAssertNotEqual($expected_identical, $expected_equal, $first, $second) {
Chris@0 362 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 363 $this->assertEquals(
Chris@0 364 (!$expected_equal),
Chris@0 365 $this->invokeProtectedMethod($test_base, 'assertNotEqual', [$first, $second])
Chris@0 366 );
Chris@0 367 }
Chris@0 368
Chris@0 369 /**
Chris@0 370 * Data provider for testAssertIdenticalObject().
Chris@0 371 */
Chris@0 372 public function providerAssertIdenticalObject() {
Chris@0 373 $obj1 = new \stdClass();
Chris@0 374 $obj1->foof = 'yay';
Chris@0 375 $obj2 = $obj1;
Chris@0 376 $obj3 = clone $obj1;
Chris@0 377 $obj4 = new \stdClass();
Chris@0 378 return [
Chris@0 379 [TRUE, $obj1, $obj2],
Chris@0 380 [TRUE, $obj1, $obj3],
Chris@0 381 [FALSE, $obj1, $obj4],
Chris@0 382 ];
Chris@0 383 }
Chris@0 384
Chris@0 385 /**
Chris@0 386 * @covers ::assertIdenticalObject
Chris@0 387 * @dataProvider providerAssertIdenticalObject
Chris@0 388 */
Chris@0 389 public function testAssertIdenticalObject($expected, $first, $second) {
Chris@0 390 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 391 $this->assertEquals(
Chris@0 392 $expected,
Chris@0 393 $this->invokeProtectedMethod($test_base, 'assertIdenticalObject', [$first, $second])
Chris@0 394 );
Chris@0 395 }
Chris@0 396
Chris@0 397 /**
Chris@0 398 * @covers ::pass
Chris@0 399 */
Chris@0 400 public function testPass() {
Chris@0 401 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 402 $this->assertEquals(
Chris@0 403 TRUE,
Chris@0 404 $this->invokeProtectedMethod($test_base, 'pass', [])
Chris@0 405 );
Chris@0 406 }
Chris@0 407
Chris@0 408 /**
Chris@0 409 * @covers ::fail
Chris@0 410 */
Chris@0 411 public function testFail() {
Chris@0 412 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 413 $this->assertEquals(
Chris@0 414 FALSE,
Chris@0 415 $this->invokeProtectedMethod($test_base, 'fail', [])
Chris@0 416 );
Chris@0 417 }
Chris@0 418
Chris@0 419 /**
Chris@0 420 * Data provider for testError().
Chris@0 421 *
Chris@0 422 * @return array
Chris@0 423 * - Expected status for assertion.
Chris@0 424 * - Group for use in assert().
Chris@0 425 */
Chris@0 426 public function providerError() {
Chris@0 427 return [
Chris@0 428 ['debug', 'User notice'],
Chris@0 429 ['exception', 'Not User notice'],
Chris@0 430 ];
Chris@0 431 }
Chris@0 432
Chris@0 433 /**
Chris@0 434 * @covers ::error
Chris@0 435 * @dataProvider providerError
Chris@0 436 */
Chris@0 437 public function testError($status, $group) {
Chris@0 438 // Mock up a TestBase object.
Chris@0 439 $mock_test_base = $this->getMockBuilder('Drupal\simpletest\TestBase')
Chris@0 440 ->setMethods(['assert'])
Chris@0 441 ->getMockForAbstractClass();
Chris@0 442
Chris@0 443 // Set expectations for assert().
Chris@0 444 $mock_test_base->expects($this->once())
Chris@0 445 ->method('assert')
Chris@0 446 // The first argument to assert() should be the expected $status. This is
Chris@0 447 // the most important expectation of this test.
Chris@0 448 ->with($status)
Chris@0 449 // Arbitrary return value.
Chris@0 450 ->willReturn("$status:$group");
Chris@0 451
Chris@0 452 // Invoke error().
Chris@0 453 $this->assertEquals(
Chris@0 454 "$status:$group",
Chris@0 455 $this->invokeProtectedMethod($mock_test_base, 'error', ['msg', $group])
Chris@0 456 );
Chris@0 457 }
Chris@0 458
Chris@0 459 /**
Chris@0 460 * @covers ::getRandomGenerator
Chris@0 461 */
Chris@0 462 public function testGetRandomGenerator() {
Chris@0 463 $test_base = $this->getTestBaseForAssertionTests('test_id');
Chris@0 464 $this->assertInstanceOf(
Chris@0 465 'Drupal\Component\Utility\Random',
Chris@0 466 $this->invokeProtectedMethod($test_base, 'getRandomGenerator', [])
Chris@0 467 );
Chris@0 468 }
Chris@0 469
Chris@0 470 }