Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade local & Silta PHP to 7.4 & add PHPUnit testing setup. #122

Merged
merged 28 commits into from
Jun 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
4b522cd
Upgrade PHP version to 7.4.
tormi Sep 1, 2020
0c30850
Add PHPUnit testing setup for PHP 7.4.
tormi Sep 1, 2020
cd4ad57
Update PHPUnit section at readme.
tormi Sep 1, 2020
1a34960
#122 Fix fatal error Trait 'Prophecy\PhpUnit\ProphecyTrait' not found.
hkirsman Feb 8, 2021
c0fb6f4
#122 Fix phpunit.xml being break after anoter lando rebuild.
hkirsman Feb 8, 2021
416bc6d
Add lando phpunit tool to the readme.
tormi Mar 13, 2021
b40fb33
#122: Upgrade Silta PHP to the 7.4.
tormi Mar 13, 2021
2875c8c
#122: Upgrade CircleCI executor image to circleci-php7.4-node14-compo…
tormi Mar 13, 2021
d895426
#122: Update all phpunit.xml paths & perform --migrate-configuration.
tormi Mar 13, 2021
5ee7090
#122: Move SIMPLETEST* envvars to phpunit.xml, add force="true" to SI…
tormi Mar 13, 2021
fcb6177
122: Update Running tests section in readme.
tormi Mar 13, 2021
03eeec9
#122: Add better output to PHPUnit by adding --testdox parameter.
hkirsman May 21, 2021
a29d0e7
#122: Move phpunit.xml generation to separate command, commit phpunit…
hkirsman May 22, 2021
8f4f158
#122: Run custom modules unit tests when commiting.
hkirsman May 22, 2021
5bf1dd2
#122: Fix phpunit.grumphp.xml path in grumphp.yml.
hkirsman May 23, 2021
dacab6d
#122: Unify PHPUnit config back to 1 file.
hkirsman May 23, 2021
877b8c2
#122: Comment out phpunit in grumphp.yml as it fails with 0 tests.
hkirsman May 23, 2021
163c0a5
122: Add phpunit_example module.
tormi May 25, 2021
52433df
[#122] Update the PHPUnit section of the readme.
tormi May 25, 2021
528fdd2
Add executor: cicd74 for CI analyze job, #122.
tormi May 25, 2021
49c94d0
Revert "Add executor: cicd74 for CI analyze job, #122."
tormi May 25, 2021
d179435
Add run_on parameter to grumphp phpcs task, #122.
tormi May 25, 2021
8658c52
Replace multiple possible datatypes with mixed one.
tormi May 25, 2021
4e8761d
Revert "Replace multiple possible datatypes with mixed one."
tormi May 25, 2021
b16beb3
Update PHP version in config.platform, #206.
tormi May 25, 2021
c1e92b7
Add PHP version as a requirement in Composer.
tormi May 25, 2021
0c00b06
Disable ecs tasks temporarily, #122.
tormi May 26, 2021
43ae54a
Remove unsupported ECS
guncha25 Jun 6, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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",
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"phpspec/prophecy-phpunit" comes from https://www.drupal.org/node/3176567.

"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