Completing the prototype of Mailhandler
This article is part of the Google Summer of Code blog series.
In order to finish the prototype and merge the feature branch, I had to provide automated test coverage.
Drupal provides two types of automated tests:
- Functional tests test the functionality of Drupal systems at a higher level and consist of:
- Web tests - executed via Drupal's specific simpletest framework and used to test the web output of Drupal
- Kernel tests - do not require Drupal web output. As of Drupal 8.2.x, PHPUnit is used to run Kernel tests instead of Simpletest
- Unit tests - based on PHPUnit testing framework, test the functionality of classes at a low level
To tests our Mailhandler prototype, I decided to write Kernel and Web tests.
Writing Web tests
Each web test has to be in the specific namespace (in my case that is
namespace Drupal\mailhandler_d8\Tests) and needs to extend
Drupal\simpletest\WebTestBase class to be found by
The web test needs to have a static array of modules that are going to be enabled on a test run. A great thing about web tests is they resolve module dependencies recursively. Thus, for a basic module test coverage, we just need to add a module dependency.
Beside the modules array, the web test needs to have
setUp method (executes only once) and at least one test method. Our test method -
testMailhandlerNodeUi asserts that default handler configuration is correctly displayed and updated. Also, it tests the edge case when there are no content types available. The full web test for
MailhandlerNode plugin can be found on Github.
Writing Kernel tests
The namespace and base class are a bit different for functional Kernel tests. We have to put the test into
Drupal\Tests\mailhandler_d8\Kernel and extend
Drupal\KernelTests\KernelTestBase class. As opposed to Web tests, static array of enabled modules must contain all the modules that are going to be used in the test. Also,
setUp method needs to contain entity schemas and default configuration of relevant entities/modules. Sometimes, this can be time-consuming. The kernel test is available on Github as well.
To run the tests we will need to have
simpletest module enabled. The module can be enabled via user interface or using Drush ("command line shell and Unix scripting interface for Drupal") by typing
drush en simpletest -y in terminal. If you are not using Drush already, I highly recommend you to give it a try.
Like many things in Drupal, we can run tests through user interface or command line using the following command:
php /drupal_root/core/scripts/run-tests.sh --browser --url http://drupal.domain --module mailhandler_d8
simpletest to open test results in a browser. It can be useful in case you want to know more about your test fails.
--url specifies the base URL of the Drupal root directory.
--module we set the module we want to run tests from. In case we want to test a specific test or even a test method we could use
How to run tests through command line is explained on the official documentation page.
For the third week of GSoC the plan is to extend the module with authentication methods. I will update you how we can authenticate a mail sender using "from" mail header field. Also, we are going to provide better security by adding support for digitally signed emails. Until next time!