diff --git a/.forgejo/workflows/phpunit.yml b/.forgejo/workflows/phpunit.yml
index 6df0ddf..679a19e 100644
--- a/.forgejo/workflows/phpunit.yml
+++ b/.forgejo/workflows/phpunit.yml
@@ -1,42 +1,54 @@
name: Unit Testing
on:
push:
+ branches:
+ - main
pull_request:
jobs:
phpunit:
runs-on: ubuntu-latest
services:
mysql:
- image: mariadb:11.5
+ image: mariadb
env:
MYSQL_ROOT_PASSWORD: root
- ports:
- - 3306:3306
- options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=10s --health-retries=10
- strategy:
- matrix:
- php-versions: ['8.1', '8.2', '8.3']
- include:
- - wp-version: latest
+ strategy:
+ matrix:
+ php-versions: ['8.1']
+ name: Run phpunit tests
+ env:
+ extensions: mysql
+ key: cache-v1
steps:
- name: Checkout
uses: https://code.forgejo.org/actions/checkout@v4
- # - name: Setup PHP
- # uses: shivammathur/setup-php@v2
+ # - name: Cache composer dependencies
+ # id: cache-primes
+ # uses: actions/cache@v4
# with:
- # php-version: ${{ matrix.php-versions }}
- # coverage: none
- # tools: composer, phpunit-polyfills
- # extensions: mysql
+ # path: /root/.cache/composer
+ # key: cache-1
- # - name: Install Composer dependencies for PHP
- # uses: "ramsey/composer-install@v1"
+ - name: Setup PHP
+ uses: https://github.com/shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-versions }}
+ coverage: none
+ tools: composer, phpunit-polyfills
- # - name: Setup Test Environment
- # run: bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1 ${{ matrix.wp-version }}
+ - name: Install Composer dependencies for PHP
+ uses: "ramsey/composer-install@v1"
- # - name: Unit Testing
- # run: ./vendor/bin/phpunit
- # env:
- # PHP_VERSION: ${{ matrix.php-versions }}
+ - name: Install mysqladmin
+ run: sudo apt update && sudo apt -y upgrade && sudo apt -y install mysql-client
+
+ - name: Setup Test Environment
+ run: bash bin/install-wp-tests.sh wordpress_test root root localhost latest
+
+ - run: ls /tmp/wordpress/
+
+ - name: Unit Testing
+ run: phpunit
+ env:
+ PHP_VERSION: ${{ matrix.php-versions }}
diff --git a/.phpcs.xml.dist b/.phpcs.xml.dist
new file mode 100644
index 0000000..df58068
--- /dev/null
+++ b/.phpcs.xml.dist
@@ -0,0 +1,47 @@
+
+
+ Generally-applicable sniffs for WordPress plugins.
+
+
+ .
+ /vendor/
+ /node_modules/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.woodpecker/test.yml b/.woodpecker/test.yml
new file mode 100644
index 0000000..fe28da6
--- /dev/null
+++ b/.woodpecker/test.yml
@@ -0,0 +1,19 @@
+when:
+ - event: push
+ branch: woodpecker
+
+steps:
+ - name: build
+ image: php:8.3
+ environment:
+ WP_TESTS_PHPUNIT_POLYFILLS_PATH: vendor/yoast/phpunit-polyfills
+ commands:
+ - apt -y update
+ - apt -y install libonig-dev
+ - docker-php-ext-install mbstring mysqli pdo_mysql intl gd zip bz2
+ - docker-php-ext-enable mbstring mysqli pdo_mysql intl gd zip bz2
+ - composer require --dev yoast/phpunit-polyfills:"^3.0"
+ - composer install
+ - bash bin/install-wp-tests.sh wordpress_tests root mysql mysql latest true
+ - phpunit --configuration phpunit.xml.dist
+
diff --git a/bin/install-wp-tests.sh b/bin/install-wp-tests.sh
new file mode 100755
index 0000000..c6f53dc
--- /dev/null
+++ b/bin/install-wp-tests.sh
@@ -0,0 +1,181 @@
+#!/usr/bin/env bash
+
+if [ $# -lt 3 ]; then
+ echo "usage: $0 [db-host] [wp-version] [skip-database-creation]"
+ exit 1
+fi
+
+DB_NAME=$1
+DB_USER=$2
+DB_PASS=$3
+DB_HOST=${4-localhost}
+WP_VERSION=${5-latest}
+SKIP_DB_CREATE=${6-false}
+
+TMPDIR=${TMPDIR-/tmp}
+TMPDIR=$(echo $TMPDIR | sed -e "s/\/$//")
+WP_TESTS_DIR=${WP_TESTS_DIR-$TMPDIR/wordpress-tests-lib}
+WP_CORE_DIR=${WP_CORE_DIR-$TMPDIR/wordpress}
+
+download() {
+ if [ `which curl` ]; then
+ curl -s "$1" > "$2";
+ elif [ `which wget` ]; then
+ wget -nv -O "$2" "$1"
+ fi
+}
+
+if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+\-(beta|RC)[0-9]+$ ]]; then
+ WP_BRANCH=${WP_VERSION%\-*}
+ WP_TESTS_TAG="branches/$WP_BRANCH"
+
+elif [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then
+ WP_TESTS_TAG="branches/$WP_VERSION"
+elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
+ if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
+ # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
+ WP_TESTS_TAG="tags/${WP_VERSION%??}"
+ else
+ WP_TESTS_TAG="tags/$WP_VERSION"
+ fi
+elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
+ WP_TESTS_TAG="trunk"
+else
+ # http serves a single offer, whereas https serves multiple. we only want one
+ download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json
+ grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json
+ LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//')
+ if [[ -z "$LATEST_VERSION" ]]; then
+ echo "Latest WordPress version could not be found"
+ exit 1
+ fi
+ WP_TESTS_TAG="tags/$LATEST_VERSION"
+fi
+set -ex
+
+install_wp() {
+
+ if [ -d $WP_CORE_DIR ]; then
+ return;
+ fi
+
+ mkdir -p $WP_CORE_DIR
+
+ if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
+ mkdir -p $TMPDIR/wordpress-trunk
+ rm -rf $TMPDIR/wordpress-trunk/*
+ svn export --quiet https://core.svn.wordpress.org/trunk $TMPDIR/wordpress-trunk/wordpress
+ mv $TMPDIR/wordpress-trunk/wordpress/* $WP_CORE_DIR
+ else
+ if [ $WP_VERSION == 'latest' ]; then
+ local ARCHIVE_NAME='latest'
+ elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then
+ # https serves multiple offers, whereas http serves single.
+ download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json
+ if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
+ # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
+ LATEST_VERSION=${WP_VERSION%??}
+ else
+ # otherwise, scan the releases and get the most up to date minor version of the major release
+ local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'`
+ LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//' | head -1)
+ fi
+ if [[ -z "$LATEST_VERSION" ]]; then
+ local ARCHIVE_NAME="wordpress-$WP_VERSION"
+ else
+ local ARCHIVE_NAME="wordpress-$LATEST_VERSION"
+ fi
+ else
+ local ARCHIVE_NAME="wordpress-$WP_VERSION"
+ fi
+ download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $TMPDIR/wordpress.tar.gz
+ tar --strip-components=1 -zxmf $TMPDIR/wordpress.tar.gz -C $WP_CORE_DIR
+ fi
+
+ download https://raw.githubusercontent.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php
+}
+
+install_test_suite() {
+ # portable in-place argument for both GNU sed and Mac OSX sed
+ if [[ $(uname -s) == 'Darwin' ]]; then
+ local ioption='-i.bak'
+ else
+ local ioption='-i'
+ fi
+
+ # set up testing suite if it doesn't yet exist
+ if [ ! -d $WP_TESTS_DIR ]; then
+ # set up testing suite
+ mkdir -p $WP_TESTS_DIR
+ rm -rf $WP_TESTS_DIR/{includes,data}
+ svn export --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes
+ svn export --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data
+ fi
+
+ if [ ! -f wp-tests-config.php ]; then
+ download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
+ # remove all forward slashes in the end
+ WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::")
+ sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
+ sed $ioption "s:__DIR__ . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
+ sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php
+ sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php
+ sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php
+ sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php
+ fi
+
+}
+
+recreate_db() {
+ shopt -s nocasematch
+ if [[ $1 =~ ^(y|yes)$ ]]
+ then
+ mysqladmin drop $DB_NAME -f --user="$DB_USER" --password="$DB_PASS"$EXTRA
+ create_db
+ echo "Recreated the database ($DB_NAME)."
+ else
+ echo "Leaving the existing database ($DB_NAME) in place."
+ fi
+ shopt -u nocasematch
+}
+
+create_db() {
+ mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA
+}
+
+install_db() {
+
+ if [ ${SKIP_DB_CREATE} = "true" ]; then
+ return 0
+ fi
+
+ # parse DB_HOST for port or socket references
+ local PARTS=(${DB_HOST//\:/ })
+ local DB_HOSTNAME=${PARTS[0]};
+ local DB_SOCK_OR_PORT=${PARTS[1]};
+ local EXTRA=""
+
+ if ! [ -z $DB_HOSTNAME ] ; then
+ if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then
+ EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
+ elif ! [ -z $DB_SOCK_OR_PORT ] ; then
+ EXTRA=" --socket=$DB_SOCK_OR_PORT"
+ elif ! [ -z $DB_HOSTNAME ] ; then
+ EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
+ fi
+ fi
+
+ # create database
+ if [ $(mysql --user="$DB_USER" --password="$DB_PASS"$EXTRA --execute='show databases;' | grep ^$DB_NAME$) ]
+ then
+ echo "Reinstalling will delete the existing test database ($DB_NAME)"
+ read -p 'Are you sure you want to proceed? [y/N]: ' DELETE_EXISTING_DB
+ recreate_db $DELETE_EXISTING_DB
+ else
+ create_db
+ fi
+}
+
+install_wp
+install_test_suite
+install_db
diff --git a/docker-compose-test.yml b/docker-compose-test.yml
new file mode 100644
index 0000000..3926e0e
--- /dev/null
+++ b/docker-compose-test.yml
@@ -0,0 +1,26 @@
+version: '3'
+services:
+ test-db:
+ platform: linux/x86_64
+ image: mariadb
+ environment:
+ MYSQL_DATABASE: wordpress
+ MYSQL_ROOT_PASSWORD: wordpress
+ healthcheck:
+ test: ["CMD", "curl", "-f", "http://localhost:3306"]
+ interval: 5s
+ timeout: 2s
+ retries: 5
+
+ test-php:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ depends_on:
+ test-db:
+ condition: service_healthy
+ links:
+ - test-db
+ volumes:
+ - .:/app
+ command: ["composer", "run-script", "test"]
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000..50421ec
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,16 @@
+
+
+
+
+ ./tests/
+ ./tests/test-sample.php
+
+
+
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
new file mode 100755
index 0000000..72f381a
--- /dev/null
+++ b/tests/bootstrap.php
@@ -0,0 +1,38 @@
+assertTrue( true );
+ }
+}