Skip to content

Commit

Permalink
Merge pull request #122 from wunderio/feature/lando-phpunit-php-7.4
Browse files Browse the repository at this point in the history
Upgrade local & Silta PHP to 7.4 & add PHPUnit testing setup.
  • Loading branch information
tormi committed Jun 7, 2021
2 parents d4deb49 + 43ae54a commit 6d5a9fb
Show file tree
Hide file tree
Showing 15 changed files with 388 additions and 41 deletions.
8 changes: 4 additions & 4 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ orbs:
silta: silta/silta@0.1

executors:
cicd73:
cicd74:
docker:
- image: eu.gcr.io/silta-images/cicd:circleci-php7.3-node12-composer1-v0.1
- image: eu.gcr.io/silta-images/cicd:circleci-php7.4-node14-composer2-v0.1

workflows:
version: 2
commit:
jobs:
- silta/drupal-validate:
name: validate
executor: cicd73
executor: cicd74
post-validation:
- run: echo "You can add additional validation here!"

Expand All @@ -25,7 +25,7 @@ workflows:

- silta/drupal-build-deploy: &build-deploy
name: build-deploy
executor: cicd73
executor: cicd74
codebase-build:
- silta/drupal-composer-install
- silta/npm-install-build
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
# Ignore Drupal's file directory
/web/sites/*/files/

# Ignore SimpleTest multi-site environment.
# Ignore testing directories.
/web/sites/simpletest
/web/tmp

# Ignore files generated by PhpStorm
/.idea/
Expand Down
29 changes: 17 additions & 12 deletions .lando.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: silta
recipe: drupal9

config:
php: "7.3"
php: "7.4"
via: nginx
webroot: web
database: "mariadb:10.3"
Expand All @@ -18,6 +18,15 @@ tooling:
npm:
description: "Runs npm commands"
service: node
phpunit:
description: Runs PHPUnit commands
user: www-data
cmd:
- appserver: "php /app/vendor/bin/phpunit -c /app/phpunit.xml --testdox"
regenerate-phpunit-config:
description: "Regenerates fresh PHPUnit configuration."
cmd:
- appserver: /app/.lando/phpunit.sh
xdebug:
description: "Loads Xdebug in the selected mode"
cmd:
Expand All @@ -38,18 +47,14 @@ services:
DB_HOST_DRUPAL: database
# Support debugging with XDEBUG 3.
XDEBUG_MODE:
# Support debugging Drush with XDEBUG 3.
PHP_IDE_CONFIG: serverName=appserver
# chrome:
# type: compose
# services:
# image: selenium/standalone-chrome
# user: root
# ports:
# - "4444:4444"
# volumes:
# - /dev/shm:/dev/shm
# command: /opt/bin/entry_point.sh
# PHPUnit settings. @see: .lando/phpunit.sh
MINK_DRIVER_ARGS_WEBDRIVER: '["chrome", {"browserName":"chrome","chromeOptions":{"args":["--disable-gpu","--headless"]}}, "http://chrome:9515"]'
chrome:
type: compose
services:
image: drupalci/webdriver-chromedriver:production
command: chromedriver --log-path=/tmp/chromedriver.log --verbose --whitelisted-ips=
# elasticsearch:
# type: "elasticsearch:7.12.0"
# # Replace `true` with `9200` for proxy http://localhost:9200.
Expand Down
33 changes: 33 additions & 0 deletions .lando/phpunit.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/bin/sh
set -exu

# Configure PHPUnit tests for the Lando environment.
# @see: https://agile.coop/blog/drupal-phpunit-tests-lando/
#
# Initially this was part of lando build process but we decided
# to commit the phpunit.xml. Still the functionality of this
# script could be useful as it always gets the latest distributed
# configuration from core. From time to time it wouldn't hurt
# try and update the file with 'lando regenerate-phpunit-config'.

PHPUNIT_CONFIG=/app/phpunit.xml

if [ -f "$PHPUNIT_CONFIG" ]; then
rm "$PHPUNIT_CONFIG"
fi

cd /app
cp -n web/core/phpunit.xml.dist "$PHPUNIT_CONFIG"
sed -i 's|tests\/bootstrap\.php|./web/core/tests/bootstrap.php|g' "$PHPUNIT_CONFIG"
sed -i 's|\.\/tests\/|./web/core/tests/|g' "$PHPUNIT_CONFIG"
sed -i 's|directory>\.\/|directory>./web/core/|g' "$PHPUNIT_CONFIG"
sed -i 's|directory>\.\.\/|directory>./web/core/|g' "$PHPUNIT_CONFIG"
sed -i 's|<env name="SIMPLETEST_BASE_URL" value=""\/>|<env name="SIMPLETEST_BASE_URL" value="http://appserver_nginx" force="true"/>|g' "$PHPUNIT_CONFIG"
sed -i 's|<env name="SIMPLETEST_DB" value=""\/>|<env name="SIMPLETEST_DB" value="sqlite://localhost/tmp/db.sqlite"/>|g' "$PHPUNIT_CONFIG"
sed -i 's|<file>.\/web\/core\/tests\/TestSuites\/UnitTestSuite.php<\/file>|<directory>.\/web\/modules\/custom\/*\/tests\/src\/Unit<\/directory>|g' "$PHPUNIT_CONFIG"
sed -i 's|<file>.\/web\/core\/tests\/TestSuites\/KernelTestSuite.php<\/file>|<directory>.\/web\/modules\/custom\/*\/tests\/src\/Kernel<\/directory>|g' "$PHPUNIT_CONFIG"
sed -i 's|<file>.\/web\/core\/tests\/TestSuites\/FunctionalTestSuite.php<\/file>|<directory>.\/web\/modules\/custom\/*\/tests\/src\/Functional<\/directory>|g' "$PHPUNIT_CONFIG"
sed -i 's|<file>.\/web\/core\/tests\/TestSuites\/FunctionalJavascriptTestSuite.php<\/file>|<directory>.\/web\/modules\/custom\/*\/tests\/src\/FunctionalJavascript<\/directory>|g' "$PHPUNIT_CONFIG"
sed -i '/<file>.\/web\/core\/tests\/TestSuites\/BuildTestSuite.php<\/file>/d' "$PHPUNIT_CONFIG"
vendor/bin/phpunit --migrate-configuration
rm phpunit.xml.bak
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,22 @@ For additional instructions, please see the [Silta documentation](https://github
- `lando` - tools / commands overview.
- `lando grumphp <commands>` - run [GrumPHP](https://github.com/phpro/grumphp) code quality checks. Modified or new files are checked on git commit, see more at `lando grumphp -h` or [wunderio/code-quality](https://github.com/wunderio/code-quality).
- `lando npm <commands>` - run [npm](https://www.npmjs.com/) commands.
- `lando phpunit <commands>` - run [PHPUnit](https://phpunit.de/) commands.
- `lando xdebug <mode>` - load [Xdebug](https://xdebug.org/) in the selected [mode(s)](https://xdebug.org/docs/all_settings#mode).

### Drupal development hints

- [Updating Drupal core](https://www.drupal.org/docs/8/update/update-core-via-composer).
- [Altering scaffold files](https://www.drupal.org/docs/develop/using-composer/using-drupals-composer-scaffold#toc_4) (`robots.txt`, `.htaccess` etc.).

### Running tests

The [PHPUnit](https://phpunit.de/) test framework is predefined in this project, see `phpunit.xml` for details. Also, there is a minified `web/modules/custom/phpunit_example` module included from [examples module](https://www.drupal.org/project/examples) for learning purposes.

#### Testing examples

Use `lando phpunit` to run the PHPUnit commands.

- run one test class: `lando phpunit path/to/your/class/file.php`,
- list groups: `lando phpunit --list-groups`,
- run all the tests in a particular group: `lando phpunit --group Groupname`.
7 changes: 3 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@
"drupal/simplei": "^1.2",
"drupal/warden": "^3.0@RC",
"drush/drush": "^10.3",
"php": ">=7.4",
"vlucas/phpdotenv": "^5.2",
"webflo/drupal-finder": "^1.2",
"wunderio/drupal-ping": "^1.0"
},
"require-dev": {
"drupal/core-dev": "^9.1",
"phpspec/prophecy-phpunit": "^2.0",
"wunderio/code-quality": "^2.0"
},
"conflict": {
Expand All @@ -39,10 +41,7 @@
"prefer-stable": true,
"config": {
"sort-packages": true,
"discard-changes": true,
"platform": {
"php": "7.3"
}
"discard-changes": true
},
"autoload": {
"classmap": [
Expand Down
7 changes: 4 additions & 3 deletions grumphp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,18 @@ grumphp:
run_on: ['web/modules/custom', 'web/themes/custom', 'web/sites']
phpcs:
standard: ['phpcs.xml']
php_stan:
run_on: ['web/modules/custom', 'web/themes/custom']
ecs:
php_stan:
run_on: ['web/modules/custom', 'web/themes/custom']
yaml_lint: ~
json_lint: ~
# PHPUnit will fail with 0 tests.
phpunit:
testsuite: unit
extensions:
- Wunderio\GrumPHP\Task\PhpCompatibility\PhpCompatibilityExtensionLoader
- Wunderio\GrumPHP\Task\PhpCheckSyntax\PhpCheckSyntaxExtensionLoader
- Wunderio\GrumPHP\Task\CheckFilePermissions\CheckFilePermissionsExtensionLoader
- Wunderio\GrumPHP\Task\Ecs\EcsExtensionLoader
- Wunderio\GrumPHP\Task\Phpcs\PhpcsExtensionLoader
- Wunderio\GrumPHP\Task\PhpStan\PhpStanExtensionLoader
- Wunderio\GrumPHP\Task\YamlLint\YamlLintExtensionLoader
Expand Down
71 changes: 71 additions & 0 deletions phpunit.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- TODO set checkForUnintentionallyCoveredCode="true" once https://www.drupal.org/node/2626832 is resolved. -->
<!-- PHPUnit expects functional tests to be run with either a privileged user
or your current system user. See core/tests/README.md and
https://www.drupal.org/node/2116263 for details.
-->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bootstrap="./web/core/tests/bootstrap.php" colors="true" beStrictAboutTestsThatDoNotTestAnything="true" beStrictAboutOutputDuringTests="true" beStrictAboutChangesToGlobalState="true" failOnWarning="true" printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter" cacheResult="false" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
<coverage>
<include>
<directory>./web/core/includes</directory>
<directory>./web/core/lib</directory>
<directory>./web/core/modules</directory>
<directory>./web/core/modules</directory>
<directory>./web/core/sites</directory>
</include>
<exclude>
<directory>./web/core/modules/*/src/Tests</directory>
<directory>./web/core/modules/*/tests</directory>
<directory>./web/core/modules/*/src/Tests</directory>
<directory>./web/core/modules/*/tests</directory>
<directory>./web/core/modules/*/*/src/Tests</directory>
<directory>./web/core/modules/*/*/tests</directory>
</exclude>
</coverage>
<php>
<!-- Set error reporting to E_ALL. -->
<ini name="error_reporting" value="32767"/>
<!-- Do not limit the amount of memory tests take to run. -->
<ini name="memory_limit" value="-1"/>
<!-- Example SIMPLETEST_BASE_URL value: http://localhost -->
<env name="SIMPLETEST_BASE_URL" value="http://appserver_nginx" force="true"/>
<!-- Example SIMPLETEST_DB value: mysql://username:password@localhost/databasename#table_prefix -->
<env name="SIMPLETEST_DB" value="sqlite://localhost/tmp/db.sqlite"/>
<!-- Example BROWSERTEST_OUTPUT_DIRECTORY value: /path/to/webroot/sites/simpletest/browser_output -->
<env name="BROWSERTEST_OUTPUT_DIRECTORY" value=""/>
<!-- To have browsertest output use an alternative base URL. For example if
SIMPLETEST_BASE_URL is an internal DDEV URL, you can set this to the
external DDev URL so you can follow the links directly.
-->
<env name="BROWSERTEST_OUTPUT_BASE_URL" value=""/>
<!-- To disable deprecation testing completely uncomment the next line. -->
<!-- <env name="SYMFONY_DEPRECATIONS_HELPER" value="disabled"/> -->
<!-- Example for changing the driver class for mink tests MINK_DRIVER_CLASS value: 'Drupal\FunctionalJavascriptTests\DrupalSelenium2Driver' -->
<env name="MINK_DRIVER_CLASS" value=""/>
<!-- Example for changing the driver args to mink tests MINK_DRIVER_ARGS value: '["http://127.0.0.1:8510"]' -->
<env name="MINK_DRIVER_ARGS" value=""/>
<!-- Example for changing the driver args to webdriver tests MINK_DRIVER_ARGS_WEBDRIVER value: '["chrome", { "chromeOptions": { "w3c": false } }, "http://localhost:4444/wd/hub"]' For using the Firefox browser, replace "chrome" with "firefox" -->
<env name="MINK_DRIVER_ARGS_WEBDRIVER" value=""/>
</php>
<testsuites>
<testsuite name="unit">
<directory>./web/modules/custom/*/tests/src/Unit</directory>
</testsuite>
<testsuite name="kernel">
<directory>./web/modules/custom/*/tests/src/Kernel</directory>
</testsuite>
<testsuite name="functional">
<directory>./web/modules/custom/*/tests/src/Functional</directory>
</testsuite>
<testsuite name="functional-javascript">
<directory>./web/modules/custom/*/tests/src/FunctionalJavascript</directory>
</testsuite>
<testsuite name="build">
</testsuite>
</testsuites>
<listeners>
<listener class="\Drupal\Tests\Listeners\DrupalListener">
</listener>
</listeners>
<!-- Filter for coverage reports. -->
</phpunit>
15 changes: 0 additions & 15 deletions phpunit.xml.dist

This file was deleted.

2 changes: 1 addition & 1 deletion silta/php.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Dockerfile for the PHP container.
FROM eu.gcr.io/silta-images/php:7.3-fpm-v0.1
FROM eu.gcr.io/silta-images/php:7.4-fpm-v0.1

COPY --chown=www-data:www-data . /app

2 changes: 1 addition & 1 deletion silta/shell.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Dockerfile for the Shell container.
FROM eu.gcr.io/silta-images/shell:php7.3-v0.1
FROM eu.gcr.io/silta-images/shell:php7.4-v0.1

COPY --chown=www-data:www-data . /app
7 changes: 7 additions & 0 deletions web/modules/custom/phpunit_example/phpunit_example.info.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name: PHPUnit Example
type: module
description: Demontrates how to use PHPUnit-based tests.
package: Example modules
core_version_requirement: ^9
dependencies:
- drupal:node
17 changes: 17 additions & 0 deletions web/modules/custom/phpunit_example/phpunit_example.module
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

/**
* @file
* Module file for phpunit_example.
*/

/**
* @defgroup phpunit_example Example: PHPUnit
* @ingroup examples
* @{
* This example demonstrates PHPUnit for Drupal 8 unit testing.
*/

/**
* @} End of "defgroup phpunit_example".
*/
36 changes: 36 additions & 0 deletions web/modules/custom/phpunit_example/src/AddClass.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace Drupal\phpunit_example;

/**
* A class with features to show how to do unit testing.
*
* @ingroup phpunit_example
*/
class AddClass {

/**
* A simple addition method with validity checking.
*
* @param int|float $a
* A number to add.
* @param int|float $b
* Another number to add.
*
* @return int|float
* The sum of $a and $b.
*
* @throws \InvalidArgumentException
* If either $a or $b is non-numeric, we can't add, so we throw.
*/
public function add($a, $b) {
// Check whether the arguments are numeric.
foreach ([$a, $b] as $argument) {
if (!is_numeric($argument)) {
throw new \InvalidArgumentException('Arguments must be numeric.');
}
}
return $a + $b;
}

}
Loading

0 comments on commit 6d5a9fb

Please sign in to comment.