$30 off During Our Annual Pro Sale. View Details »

Drupal Testing Workshop

Drupal Testing Workshop

Workshop on automated testing in Drupal with PHPUnit. Presented at Drupal Bristol user group.

Oliver Davies

June 27, 2018
Tweet

More Decks by Oliver Davies

Other Decks in Technology

Transcript

  1. ▸ Module and theme developers ▸ Want to know more

    about automated testing ▸ Looking to start writing your first tests
  2. ▸ Full stack Web Developer & System Administrator ▸ Senior

    Developer at Microserve ▸ Part-time freelancer ▸ Acquia certified Drupal 8 Grand Master ▸ Drupal 7 & 8 core contributor ▸ opdavies (Drupal.org, GitHub, Twitter) ▸ www.oliverdavies.uk
  3. WHY WRITE TESTS? ▸ Catch bugs earlier ▸ Piece of

    mind ▸ Prevent regressions ▸ Write less code ▸ Documentation ▸ Drupal core requirement - https://www.drupal.org/core/gates#testing ▸ More important with regular D8 releases
  4. TESTING IN DRUPAL ▸ Drupal 7 - Simpletest (testing) module

    provided as part of core ▸ Drupal 8 - PHPUnit added as a core dependency ▸ PHPUnit Initiative - Simpletest to be deprecated and removed in Drupal 9
  5. DOCKSAL ▸ Docker based local development environment ▸ Microserve standard

    ▸ Open source ▸ Per site configuration and customisation ▸ fin CLI, Apache, MySQL, Solr, Varnish, Mailhog, PHPMyAdmin etc ▸ Virtualbox or native Docker ▸ Can slow down tests ▸ Provides consistency
  6. PREREQUISITE (CREATING A PHPUNIT.XML FILE) ▸ Configures PHPUnit ▸ Needed

    to run some types of tests ▸ Ignored by Git by default ▸ Copy core/phpunit.xml.dist to core/phpunit.xml ▸ Add and change as needed ▸ SIMPLETEST_BASE_URL, SIMPLETEST_DB, BROWSERTEST_OUTPUT_DIRECTORY ▸ stopOnFailure="true"
  7. PRO-TIP: ADD PATHS TO $PATH # ~/.zshrc export PATH=$HOME/bin:/usr/local/bin:$PATH export

    PATH=vendor/bin:$PATH export PATH=../vendor/bin:$PATH export PATH=node_modules/.bin:$PATH
  8. ▸ Custom Docksal command ▸ Submitted to the Docksal addons

    repo ▸ fin addon install phpunit ▸ Wrapper around phpunit command ▸ Copies a stub phpunit.xml file if exists, or duplicates phpunit.xml.dist ▸ Shorter command, combines two actions
  9. fin phpunit web/modules/contrib/examples/phpunit_example Copying /var/www/.docksal/drupal/core/phpunit.xml to /var/www/web/core/phpunit.xml PHPUnit 6.5.8 by

    Sebastian Bergmann and contributors. Testing web/modules/contrib/examples/phpunit_example .................................. 34 / 34 (100%) Time: 46.8 seconds, Memory: 6.00MB OK (34 tests, 41 assertions)
  10. fin phpunit web/modules/contrib/examples/phpunit_example PHPUnit 6.5.8 by Sebastian Bergmann and contributors.

    Testing web/modules/contrib/examples/phpunit_example .................................. 34 / 34 (100%) Time: 48.62 seconds, Memory: 6.00MB OK (34 tests, 41 assertions)
  11. FUNCTIONAL TESTS ▸ Tests functionality ▸ Interacts with database ▸

    Full Drupal installation ▸ Slower to run ▸ With/without JavaScript
  12. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing Drupal\Tests\drupalbristol\Functional\ExampleFunctionalTest Behat\Mink\Exception\ExpectationException

    : Current response status code is 404, but 200 expected. /var/www/vendor/behat/mink/src/WebAssert.php:768 /var/www/vendor/behat/mink/src/WebAssert.php:130 /var/www/web/modules/custom/drupalbristol/tests/src/Functional/ExampleFunctionalTest.php:14 Time: 18.2 seconds, Memory: 6.00MB ERRORS! Tests: 1, Assertions: 2, Errors: 1.
  13. KERNEL TESTS ▸ Integration tests ▸ Can install modules, interact

    with services, container, database ▸ Minimal Drupal bootstrap ▸ Faster than functional tests ▸ More setup required
  14. ▸ Create a _tests/src/Kernel directory ▸ Create an ExampleKernelTest.php file

    ▸ Create a Service ▸ Use the service within the test to perform an action
  15. // tests/src/Kernel/ExampleKernelTest.php public function testUserDeleter { $user = $this->createUser(); $this->assertInstanceOf(User::class,

    $user); /** @var \Drupal\drupalbristol\Services\UserDeleter $user_deleter */ $user_deleter = \Drupal::service('drupalbristol.user_deleter'); $user_deleter->delete($user); $user = $this->reloadEntity($user); $this->assertNull($user); }
  16. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing Drupal\Tests\drupalbristol\Kernel\ExampleKernelTest Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException

    : You have requested a non-existent service "drupalbristol.user_deleter". /var/www/vendor/symfony/dependency-injection/ContainerBuilder.php:1043 /var/www/vendor/symfony/dependency-injection/ContainerBuilder.php:610 /var/www/vendor/symfony/dependency-injection/ContainerBuilder.php:588 /var/www/web/core/lib/Drupal.php:159 /var/www/web/modules/custom/drupalbristol/tests/src/Kernel/ExampleKernelTest.php:24 Time: 7.06 seconds, Memory: 6.00MB ERRORS! Tests: 1, Assertions: 3, Errors: 1. Process finished with exit code 2
  17. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing Drupal\Tests\drupalbristol\Kernel\ExampleKernelTest Drupal\Core\Entity\EntityStorageException

    : SQLSTATE[HY000]: General error: 1 no such table: test89378988.users_data: DELETE FROM {users_data} WHERE uid IN (:db_condition_placeholder_0); Array ( [:db_condition_placeholder_0] => 1 ) /var/www/web/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php:777 /var/www/web/core/includes/entity.inc:281 /var/www/web/core/modules/user/user.module:878 /var/www/web/core/modules/user/user.module:865 /var/www/web/modules/custom/drupalbristol/src/Services/UserDeleter.php:10 /var/www/web/modules/custom/drupalbristol/tests/src/Kernel/ExampleKernelTest.php:25 Caused by Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[HY000]: General error: 1 no such table: test89378988.users_data: DELETE FROM {users_data} WHERE uid IN (:db_condition_placeholder_0); Array ( [:db_condition_placeholder_0] => 1 ) Time: 6.55 seconds, Memory: 6.00MB ERRORS! Tests: 1, Assertions: 3, Errors: 1. Process finished with exit code 2
  18. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing Drupal\Tests\drupalbristol\Kernel\ExampleKernelTest Time:

    7.38 seconds, Memory: 6.00MB OK (1 test, 5 assertions) Process finished with exit code 0
  19. UNIT TESTS ▸ Tests PHP logic ▸ No database interaction

    ▸ Fast to run ▸ Tightly coupled ▸ Mocking dependencies ▸ Hard to refactor
  20. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing Drupal\Tests\drupalbristol\Unit\ExampleUnitTest Error

    : Class 'Drupal\Tests\drupalbristol\Unit\Calculator' not found /var/www/web/modules/custom/drupalbristol/tests/src/Unit/Services/ExampleUnitTest.php:10 Time: 5.13 seconds, Memory: 6.00MB ERRORS! Tests: 1, Assertions: 0, Errors: 1.
  21. // src/Services/Calculator.php namespace Drupal\drupalbristol\Services; class Calculator { private $total; public

    function __construct($value) { $this->total = $value; } public function add($value) { $this->total += $value; return $this; } public function calculate() { return $this->total; } }
  22. TEST DRIVEN DEVELOPMENT ▸ Write a test ▸ Test fails

    ▸ Write code ▸ Test passes ▸ Refactor ▸ Repeat
  23. HOW I WRITE TESTS - "OUTSIDE IN" ▸ Start with

    functional tests ▸ Drop down to kernel or unit tests where needed ▸ Programming by wishful thinking ▸ Write comments first, then fill in the code ▸ Sometimes write assertions first
  24. ACCEPTANCE CRITERIA ▸ As a site visitor ▸ I want

    to see a list of published articles at /blog ▸ Ordered by post date
  25. TASKS ▸ Ensure the blog page exists ▸ Ensure only

    published articles are shown ▸ Ensure the articles are shown in the correct order
  26. IMPLEMENTATION ▸ Use views module ▸ Do the mininum amount

    at each step, make no assumptions, let the tests guide us ▸ Start with functional test
  27. <?php // tests/src/Functional/BlogPageTest.php namespace Drupal\Tests\tdd_blog\Functional; use Drupal\Tests\BrowserTestBase; class BlogPageTest extends

    BrowserTestBase { protected static $modules = ['tdd_blog']; public function testBlogPageExists() { $this->drupalGet('/blog'); $this->assertSession()->statusCodeEquals(200); } }
  28. <?php // tests/src/Functional/BlogPageTest.php namespace Drupal\Tests\tdd_blog\Functional; use Drupal\Tests\BrowserTestBase; class BlogPageTest extends

    BrowserTestBase { protected static $modules = ['tdd_blog']; public function testBlogPageExists() { $this->drupalGet('/blog'); $this->assertSession()->statusCodeEquals(200); } }
  29. <?php // tests/src/Functional/BlogPageTest.php namespace Drupal\Tests\tdd_blog\Functional; use Drupal\Tests\BrowserTestBase; class BlogPageTest extends

    BrowserTestBase { protected static $modules = ['tdd_blog']; public function testBlogPageExists() { $this->drupalGet('/blog'); $this->assertSession()->statusCodeEquals(200); } }
  30. <?php // tests/src/Functional/BlogPageTest.php namespace Drupal\Tests\tdd_blog\Functional; use Drupal\Tests\BrowserTestBase; class BlogPageTest extends

    BrowserTestBase { protected static $modules = ['tdd_blog']; public function testBlogPageExists() { $this->drupalGet('/blog'); $this->assertSession()->statusCodeEquals(200); } }
  31. <?php // tests/src/Functional/BlogPageTest.php namespace Drupal\Tests\tdd_blog\Functional; use Drupal\Tests\BrowserTestBase; class BlogPageTest extends

    BrowserTestBase { protected static $modules = ['tdd_blog']; public function testBlogPageExists() { $this->drupalGet('/blog'); $this->assertSession()->statusCodeEquals(200); } }
  32. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog E 1 / 1 (100%) Time: 19.31 seconds, Memory: 6.00MB There was 1 error: 1) Drupal\Tests\tdd_blog\Functional\BlogPageTest::testBlogPageExists Behat\Mink\Exception\ExpectationException: Current response status code is 404, but 200 expected. /var/www/vendor/behat/mink/src/WebAssert.php:768 /var/www/vendor/behat/mink/src/WebAssert.php:130 /var/www/web/modules/custom/tdd_blog/tests/src/Functional/BlogPageTest.php:13 ERRORS! Tests: 1, Assertions: 3, Errors: 1.
  33. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog E 1 / 1 (100%) Time: 19.31 seconds, Memory: 6.00MB There was 1 error: 1) Drupal\Tests\tdd_blog\Functional\BlogPageTest::testBlogPageExists Behat\Mink\Exception\ExpectationException: Current response status code is 404, but 200 expected. /var/www/vendor/behat/mink/src/WebAssert.php:768 /var/www/vendor/behat/mink/src/WebAssert.php:130 /var/www/web/modules/custom/tdd_blog/tests/src/Functional/BlogPageTest.php:13 ERRORS! Tests: 1, Assertions: 3, Errors: 1.
  34. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog E 1 / 1 (100%) Time: 19.31 seconds, Memory: 6.00MB There was 1 error: 1) Drupal\Tests\tdd_blog\Functional\BlogPageTest::testBlogPageExists Behat\Mink\Exception\ExpectationException: Current response status code is 404, but 200 expected. /var/www/vendor/behat/mink/src/WebAssert.php:768 /var/www/vendor/behat/mink/src/WebAssert.php:130 /var/www/web/modules/custom/tdd_blog/tests/src/Functional/BlogPageTest.php:13 ERRORS! Tests: 1, Assertions: 3, Errors: 1.
  35. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog E 1 / 1 (100%) Time: 19.31 seconds, Memory: 6.00MB There was 1 error: 1) Drupal\Tests\tdd_blog\Functional\BlogPageTest::testBlogPageExists Behat\Mink\Exception\ExpectationException: Current response status code is 404, but 200 expected. /var/www/vendor/behat/mink/src/WebAssert.php:768 /var/www/vendor/behat/mink/src/WebAssert.php:130 /var/www/web/modules/custom/tdd_blog/tests/src/Functional/BlogPageTest.php:13 ERRORS! Tests: 1, Assertions: 3, Errors: 1.
  36. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog E 1 / 1 (100%) Time: 19.31 seconds, Memory: 6.00MB There was 1 error: 1) Drupal\Tests\tdd_blog\Functional\BlogPageTest::testBlogPageExists Behat\Mink\Exception\ExpectationException: Current response status code is 404, but 200 expected. /var/www/vendor/behat/mink/src/WebAssert.php:768 /var/www/vendor/behat/mink/src/WebAssert.php:130 /var/www/web/modules/custom/tdd_blog/tests/src/Functional/BlogPageTest.php:13 ERRORS! Tests: 1, Assertions: 3, Errors: 1.
  37. ▸ The view has not been created ▸ Create a

    new view ▸ Set the path ▸ Export the config ▸ Copy it into the module's config/install directory
  38. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog E 1 / 1 (100%) Time: 16.02 seconds, Memory: 6.00MB There was 1 error: 1) Drupal\Tests\tdd_blog\Functional\BlogPageTest::testBlogPageExists Drupal\Core\Config\UnmetDependenciesException: Configuration objects provided by <em class="placeholder">tdd_blog</em> have unmet dependencies: <em class="placeholder">views.view.blog (node.type.article, node, views)</em> /var/www/web/core/lib/Drupal/Core/Config/UnmetDependenciesException.php:98 /var/www/web/core/lib/Drupal/Core/Config/ConfigInstaller.php:469 /var/www/web/core/lib/Drupal/Core/ProxyClass/Config/ConfigInstaller.php:132 /var/www/web/core/lib/Drupal/Core/Extension/ModuleInstaller.php:145 /var/www/web/core/lib/Drupal/Core/ProxyClass/Extension/ModuleInstaller.php:83 /var/www/web/core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php:437 /var/www/web/core/tests/Drupal/Tests/BrowserTestBase.php:1055 /var/www/web/core/tests/Drupal/Tests/BrowserTestBase.php:490 ERRORS! Tests: 1, Assertions: 0, Errors: 1.
  39. # tdd_blog.info.yml name: 'TDD Dublin' description: 'A demo module to

    show test driven module development.' core: 8.x type: module dependencies: - 'drupal:node' - 'drupal:views'
  40. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog E 1 / 1 (100%) Time: 20 seconds, Memory: 6.00MB There was 1 error: 1) Drupal\Tests\tdd_blog\Functional\BlogPageTest::testBlogPageExists Drupal\Core\Config\UnmetDependenciesException: Configuration objects provided by <em class="placeholder">tdd_blog</em> have unmet dependencies: <em class="placeholder">views.view.blog (node.type.article)</em> /var/www/web/core/lib/Drupal/Core/Config/UnmetDependenciesException.php:98 /var/www/web/core/lib/Drupal/Core/Config/ConfigInstaller.php:469 /var/www/web/core/lib/Drupal/Core/ProxyClass/Config/ConfigInstaller.php:132 /var/www/web/core/lib/Drupal/Core/Extension/ModuleInstaller.php:145 /var/www/web/core/lib/Drupal/Core/ProxyClass/Extension/ModuleInstaller.php:83 /var/www/web/core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php:437 /var/www/web/core/tests/Drupal/Tests/BrowserTestBase.php:1055 /var/www/web/core/tests/Drupal/Tests/BrowserTestBase.php:490 ERRORS! Tests: 1, Assertions: 0, Errors: 1.
  41. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog . 1 / 1 (100%) Time: 23.36 seconds, Memory: 6.00MB OK (1 test, 3 assertions)
  42. TASKS ▸ Ensure the blog page exists ▸ Ensure only

    published articles are shown ▸ Ensure the articles are shown in the correct order
  43. public function testOnlyPublishedArticlesAreShown() { // Given I have a mixture

    of published and unpublished articles, // as well as other types of content. // When I view the blog page. // I should only see the published articles. }
  44. // modules/custom/tdd_blog/tests/src/Functional/BlogPageTest.php public function testOnlyPublishedArticlesAreShown() { // Given I have

    a mixture of published and unpublished articles, // as well as other types of content. $node1 = $this->drupalCreateNode(['type' => 'page', 'status' => 1]); $node2 = $this->drupalCreateNode(['type' => 'article', 'status' => 1]); $node3 = $this->drupalCreateNode(['type' => 'article', 'status' => 0]); // When I view the blog page. $this->drupalGet('/blog'); // I should only see the published articles. $assert = $this->assertSession(); $assert->pageTextContains($node2->label()); $assert->pageTextNotContains($node1->label()); $assert->pageTextNotContains($node3->label()); }
  45. // modules/custom/tdd_blog/tests/src/Functional/BlogPageTest.php public function testOnlyPublishedArticlesAreShown() { // Given I have

    a mixture of published and unpublished articles, // as well as other types of content. $node1 = $this->drupalCreateNode(['type' => 'page', 'status' => 1]); $node2 = $this->drupalCreateNode(['type' => 'article', 'status' => 1]); $node3 = $this->drupalCreateNode(['type' => 'article', 'status' => 0]); // When I view the blog page. $this->drupalGet('/blog'); // I should only see the published articles. $assert = $this->assertSession(); $assert->pageTextContains($node2->label()); $assert->pageTextNotContains($node1->label()); $assert->pageTextNotContains($node3->label()); }
  46. // modules/custom/tdd_blog/tests/src/Functional/BlogPageTest.php public function testOnlyPublishedArticlesAreShown() { // Given I have

    a mixture of published and unpublished articles, // as well as other types of content. $node1 = $this->drupalCreateNode(['type' => 'page', 'status' => 1]); $node2 = $this->drupalCreateNode(['type' => 'article', 'status' => 1]); $node3 = $this->drupalCreateNode(['type' => 'article', 'status' => 0]); // When I view the blog page. $this->drupalGet('/blog'); // I should only see the published articles. $assert = $this->assertSession(); $assert->pageTextContains($node2->label()); $assert->pageTextNotContains($node1->label()); $assert->pageTextNotContains($node3->label()); }
  47. <?php namespace Drupal\Tests\tdd_blog\Kernel; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\Tests\node\Traits\NodeCreationTrait; class BlogPageTest extends

    EntityKernelTestBase { use NodeCreationTrait; public static $modules = ['node']; public function testOnlyPublishedArticlesAreShown() { $this->createNode(['type' => 'page', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); } }
  48. <?php namespace Drupal\Tests\tdd_blog\Kernel; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\Tests\node\Traits\NodeCreationTrait; class BlogPageTest extends

    EntityKernelTestBase { use NodeCreationTrait; public static $modules = ['node']; public function testOnlyPublishedArticlesAreShown() { $this->createNode(['type' => 'page', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); } }
  49. <?php namespace Drupal\Tests\tdd_blog\Kernel; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\Tests\node\Traits\NodeCreationTrait; class BlogPageTest extends

    EntityKernelTestBase { use NodeCreationTrait; public static $modules = ['node']; public function testOnlyPublishedArticlesAreShown() { $this->createNode(['type' => 'page', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); } }
  50. <?php namespace Drupal\Tests\tdd_blog\Kernel; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\Tests\node\Traits\NodeCreationTrait; class BlogPageTest extends

    EntityKernelTestBase { use NodeCreationTrait; public static $modules = ['node']; public function testOnlyPublishedArticlesAreShown() { $this->createNode(['type' => 'page', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); } }
  51. docker@cli:/var/www/web$ ../vendor/bin/phpunit -c core modules/custom/tdd_blog/tests/src/Kernel/ PHPUnit 6.5.8 by Sebastian Bergmann

    and contributors. Testing modules/custom/tdd_blog/tests/src/Kernel/ E 1 / 1 (100%) Time: 6.22 seconds, Memory: 6.00MB There was 1 error: 1) Drupal\Tests\tdd_blog\Kernel\BlogPageTest::testOnlyPublishedArticlesAreShown Error: Call to a member function id() on boolean /var/www/web/core/modules/filter/filter.module:212 /var/www/web/core/modules/node/tests/src/Traits/NodeCreationTrait.php:73 /var/www/web/modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php:13 ERRORS! Tests: 1, Assertions: 2, Errors: 1.
  52. public function testOnlyPublishedArticlesAreShown() { $this->installConfig(['filter']); $this->createNode(['type' => 'page', 'status' =>

    1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); }
  53. public function testOnlyPublishedArticlesAreShown() { $this->installConfig(['filter']); $this->createNode(['type' => 'page', 'status' =>

    1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); $results = views_get_view_result('blog'); }
  54. ... public static $modules = ['node', 'tdd_blog', 'views']; public function

    testOnlyPublishedArticlesAreShown() { $this->installConfig(['filter', 'tdd_blog']); $this->createNode(['type' => 'page', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); $results = views_get_view_result('blog'); $this->assertCount(1, $results); $this->assertEquals(2, $results[0]->_entity->id()); }
  55. ... public static $modules = ['node', 'tdd_blog', 'views']; public function

    testOnlyPublishedArticlesAreShown() { $this->installConfig(['filter', 'tdd_blog']); $this->createNode(['type' => 'page', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); $results = views_get_view_result('blog'); $this->assertCount(1, $results); $this->assertEquals(2, $results[0]->_entity->id()); }
  56. ... public static $modules = ['node', 'tdd_blog', 'views']; public function

    testOnlyPublishedArticlesAreShown() { $this->installConfig(['filter', 'tdd_blog']); $this->createNode(['type' => 'page', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 1]); $this->createNode(['type' => 'article', 'status' => 0]); $results = views_get_view_result('blog'); $this->assertCount(1, $results); $this->assertEquals(2, $results[0]->_entity->id()); }
  57. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing web/modules/custom/tdd_blog/tests/src/Kernel F

    1 / 1 (100%) Time: 2.16 seconds, Memory: 6.00MB There was 1 failure: 1) Drupal\Tests\tdd_blog\Kernel\BlogPageTest::testOnlyPublishedArticlesAreShown Failed asserting that actual size 3 matches expected size 1. /Users/opdavies/Code/drupal-testing-workshop/web/modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php:23 FAILURES! Tests: 1, Assertions: 4, Failures: 1.
  58. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing web/modules/custom/tdd_blog/tests/src/Kernel F

    1 / 1 (100%) Time: 2.16 seconds, Memory: 6.00MB There was 1 failure: 1) Drupal\Tests\tdd_blog\Kernel\BlogPageTest::testOnlyPublishedArticlesAreShown Failed asserting that actual size 3 matches expected size 1. /Users/opdavies/Code/drupal-testing-workshop/web/modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php:23 FAILURES! Tests: 1, Assertions: 4, Failures: 1.
  59. ▸ There are no filters on the view ▸ Add

    the filters ▸ Export and save the view
  60. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing web/modules/custom/tdd_blog/tests/src/Kernel .

    1 / 1 (100%) Time: 2.02 seconds, Memory: 6.00MB OK (1 test, 6 assertions)
  61. TASKS ▸ Ensure the blog page exists ▸ Ensure only

    published articles are shown ▸ Ensure the articles are shown in the correct order
  62. // modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php public function testArticlesAreOrderedByDate() { // Given that I

    have numerous articles with different post dates. // When I go to the blog page. // The articles are ordered by post date. }
  63. // modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php public function testArticlesAreOrderedByDate() { // Given that I

    have numerous articles with different post dates. $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 day')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 month')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+3 days')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 hour')->getTimestamp()]); // When I go to the blog page. // The articles are ordered by post date. }
  64. // modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php public function testArticlesAreOrderedByDate() { // Given that I

    have numerous articles with different post dates. $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 day')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 month')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+3 days')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 hour')->getTimestamp()]); // When I go to the blog page. $results = views_get_view_result('blog'); // The articles are ordered by post date. }
  65. // modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php public function testArticlesAreOrderedByDate() { // Given that I

    have numerous articles with different post dates. $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 day')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 month')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+3 days')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 hour')->getTimestamp()]); // When I go to the blog page. $results = views_get_view_result('blog'); $nids = array_map(function(ResultRow $result) { return $result->_entity->id(); }, $results); // The articles are ordered by post date. }
  66. // modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php public function testArticlesAreOrderedByDate() { // Given that I

    have numerous articles with different post dates. $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 day')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 month')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+3 days')->getTimestamp()]); $this->createNode(['type' => 'article', 'created' => (new \DateTime())->modify('+1 hour')->getTimestamp()]); // When I go to the blog page. $results = views_get_view_result('blog'); $nids = array_map(function(ResultRow $result) { return $result->_entity->id(); }, $results); // The articles are ordered by post date. $this->assertEquals([4, 1, 3, 2], $nids); }
  67. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing web/modules/custom/tdd_blog/tests/src/Kernel F

    1 / 1 (100%) Time: 1.42 seconds, Memory: 6.00MB There was 1 failure: 1) Drupal\Tests\tdd_blog\Kernel\BlogPageTest::testArticlesAreOrderedByDate Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ Array ( - 0 => 4 - 1 => 1 - 2 => 3 - 3 => 2 + 0 => '3' + 1 => '2' + 2 => '4' + 3 => '1' /Users/opdavies/Code/drupal-testing-workshop/web/core/tests/Drupal/KernelTests/KernelTestBase.php:1114 /Users/opdavies/Code/drupal-testing-workshop/web/modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php:43 FAILURES! Tests: 1, Assertions: 4, Failures: 1.
  68. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing web/modules/custom/tdd_blog/tests/src/Kernel F

    1 / 1 (100%) Time: 1.42 seconds, Memory: 6.00MB There was 1 failure: 1) Drupal\Tests\tdd_blog\Kernel\BlogPageTest::testArticlesAreOrderedByDate Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ Array ( - 0 => 4 - 1 => 1 - 2 => 3 - 3 => 2 + 0 => '3' + 1 => '2' + 2 => '4' + 3 => '1' /Users/opdavies/Code/drupal-testing-workshop/web/core/tests/Drupal/KernelTests/KernelTestBase.php:1114 /Users/opdavies/Code/drupal-testing-workshop/web/modules/custom/tdd_blog/tests/src/Kernel/BlogPageTest.php:43 FAILURES! Tests: 1, Assertions: 4, Failures: 1.
  69. ▸ There is no sort order defined on the view

    ▸ Add the sort order ▸ Re-export the view
  70. PHPUnit 6.5.8 by Sebastian Bergmann and contributors. Testing web/modules/custom/tdd_blog/tests/src/Kernel .

    1 / 1 (100%) Time: 1.74 seconds, Memory: 6.00MB OK (1 test, 5 assertions)
  71. TASKS ▸ Ensure the blog page exists ▸ Ensure only

    published articles are shown ▸ Ensure the articles are shown in the correct order