Skip to content

Commit 2532156

Browse files
committed
test: Add PHPUnit tests
1 parent ef256db commit 2532156

15 files changed

+2530
-207
lines changed

.github/workflows/test-php.yml

+46
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,49 @@ jobs:
6060
run: composer install --prefer-dist --no-progress --no-suggest
6161
- name: PHPStan Static Analysis
6262
run: composer phpstan
63+
64+
phpunit:
65+
name: PHPUnit
66+
runs-on: ubuntu-latest
67+
if: github.event.pull_request.draft == false && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name
68+
services:
69+
mysql:
70+
image: mysql:5.7
71+
env:
72+
MYSQL_ROOT_PASSWORD: root
73+
ports:
74+
- 3306/tcp
75+
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
76+
steps:
77+
- name: Setup PHP version
78+
uses: shivammathur/setup-php@v2
79+
with:
80+
php-version: '8.1'
81+
extensions: simplexml, mysql
82+
tools: phpunit-polyfills
83+
- name: Checkout source code
84+
uses: actions/checkout@v2
85+
- name: Get Composer Cache Directory
86+
id: composer-cache
87+
run: |
88+
echo "::set-output name=dir::$(composer config cache-files-dir)"
89+
- name: Setup Composer cache
90+
uses: actions/cache@v1
91+
with:
92+
path: ${{ steps.composer-cache.outputs.dir }}
93+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
94+
restore-keys: |
95+
${{ runner.os }}-composer-
96+
- name: Install Subversion
97+
run: sudo apt-get update && sudo apt-get install -y subversion
98+
- name: Install composer
99+
run: composer install --prefer-dist --no-progress --no-suggest
100+
- name: Install npm
101+
run: npm ci
102+
- name: Run build
103+
run: npm run build
104+
- name: Install WordPress Test Suite
105+
run: |
106+
bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1:${{ job.services.mysql.ports['3306'] }}
107+
- name: PHPUnit tests
108+
run: composer run-script phpunit

bin/install-wp-tests.sh

+152
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
#!/usr/bin/env bash
2+
3+
if [ $# -lt 3 ]; then
4+
echo "usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version] [skip-database-creation]"
5+
exit 1
6+
fi
7+
8+
DB_NAME=$1
9+
DB_USER=$2
10+
DB_PASS=$3
11+
DB_HOST=${4-localhost}
12+
WP_VERSION=${5-latest}
13+
SKIP_DB_CREATE=${6-false}
14+
15+
TMPDIR=${TMPDIR-/tmp}
16+
TMPDIR=$(echo $TMPDIR | sed -e "s/\/$//")
17+
WP_TESTS_DIR=${WP_TESTS_DIR-$TMPDIR/wordpress-tests-lib}
18+
WP_CORE_DIR=${WP_CORE_DIR-$TMPDIR/wordpress/}
19+
20+
download() {
21+
if [ `which curl` ]; then
22+
curl -s "$1" > "$2";
23+
elif [ `which wget` ]; then
24+
wget -nv -O "$2" "$1"
25+
fi
26+
}
27+
28+
if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then
29+
WP_TESTS_TAG="branches/$WP_VERSION"
30+
elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
31+
if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
32+
# version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
33+
WP_TESTS_TAG="tags/${WP_VERSION%??}"
34+
else
35+
WP_TESTS_TAG="tags/$WP_VERSION"
36+
fi
37+
elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
38+
WP_TESTS_TAG="trunk"
39+
else
40+
# http serves a single offer, whereas https serves multiple. we only want one
41+
download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json
42+
grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json
43+
LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//')
44+
if [[ -z "$LATEST_VERSION" ]]; then
45+
echo "Latest WordPress version could not be found"
46+
exit 1
47+
fi
48+
WP_TESTS_TAG="tags/$LATEST_VERSION"
49+
fi
50+
51+
set -ex
52+
53+
install_wp() {
54+
55+
if [ -d $WP_CORE_DIR ]; then
56+
return;
57+
fi
58+
59+
mkdir -p $WP_CORE_DIR
60+
61+
if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
62+
mkdir -p $TMPDIR/wordpress-nightly
63+
download https://wordpress.org/nightly-builds/wordpress-latest.zip $TMPDIR/wordpress-nightly/wordpress-nightly.zip
64+
unzip -q $TMPDIR/wordpress-nightly/wordpress-nightly.zip -d $TMPDIR/wordpress-nightly/
65+
mv $TMPDIR/wordpress-nightly/wordpress/* $WP_CORE_DIR
66+
else
67+
if [ $WP_VERSION == 'latest' ]; then
68+
local ARCHIVE_NAME='latest'
69+
elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then
70+
# https serves multiple offers, whereas http serves single.
71+
download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json
72+
if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
73+
# version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
74+
LATEST_VERSION=${WP_VERSION%??}
75+
else
76+
# otherwise, scan the releases and get the most up to date minor version of the major release
77+
local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'`
78+
LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//' | head -1)
79+
fi
80+
if [[ -z "$LATEST_VERSION" ]]; then
81+
local ARCHIVE_NAME="wordpress-$WP_VERSION"
82+
else
83+
local ARCHIVE_NAME="wordpress-$LATEST_VERSION"
84+
fi
85+
else
86+
local ARCHIVE_NAME="wordpress-$WP_VERSION"
87+
fi
88+
download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $TMPDIR/wordpress.tar.gz
89+
tar --strip-components=1 -zxmf $TMPDIR/wordpress.tar.gz -C $WP_CORE_DIR
90+
fi
91+
92+
download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php
93+
}
94+
95+
install_test_suite() {
96+
# portable in-place argument for both GNU sed and Mac OSX sed
97+
if [[ $(uname -s) == 'Darwin' ]]; then
98+
local ioption='-i .bak'
99+
else
100+
local ioption='-i'
101+
fi
102+
103+
# set up testing suite if it doesn't yet exist
104+
if [ ! -d $WP_TESTS_DIR ]; then
105+
# set up testing suite
106+
mkdir -p $WP_TESTS_DIR
107+
svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes
108+
svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data
109+
fi
110+
111+
if [ ! -f wp-tests-config.php ]; then
112+
download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
113+
# remove all forward slashes in the end
114+
WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::")
115+
sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
116+
sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php
117+
sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php
118+
sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php
119+
sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php
120+
fi
121+
122+
}
123+
124+
install_db() {
125+
126+
if [ ${SKIP_DB_CREATE} = "true" ]; then
127+
return 0
128+
fi
129+
130+
# parse DB_HOST for port or socket references
131+
local PARTS=(${DB_HOST//\:/ })
132+
local DB_HOSTNAME=${PARTS[0]};
133+
local DB_SOCK_OR_PORT=${PARTS[1]};
134+
local EXTRA=""
135+
136+
if ! [ -z $DB_HOSTNAME ] ; then
137+
if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then
138+
EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
139+
elif ! [ -z $DB_SOCK_OR_PORT ] ; then
140+
EXTRA=" --socket=$DB_SOCK_OR_PORT"
141+
elif ! [ -z $DB_HOSTNAME ] ; then
142+
EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
143+
fi
144+
fi
145+
146+
# create database
147+
mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA
148+
}
149+
150+
install_wp
151+
install_test_suite
152+
install_db

composer.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,17 @@
2525
"scripts": {
2626
"lint": "phpcs --standard=phpcs.xml",
2727
"format": "phpcbf --standard=phpcs.xml",
28-
"phpstan": "phpstan analyse --memory-limit 2G"
28+
"phpstan": "phpstan analyse --memory-limit 2G",
29+
"phpunit": "phpunit"
2930
},
3031
"require-dev": {
3132
"phpstan/phpstan": "^1.10",
3233
"szepeviktor/phpstan-wordpress": "^1.3",
3334
"wp-coding-standards/wpcs": "^3.0",
3435
"automattic/vipwpcs": "^3.0",
35-
"phpcompatibility/php-compatibility": "^9.3"
36+
"phpcompatibility/php-compatibility": "^9.3",
37+
"phpunit/phpunit": "^9.6",
38+
"yoast/phpunit-polyfills": "^2.0"
3639
},
3740
"config": {
3841
"platform": {

0 commit comments

Comments
 (0)