Instantly share code, notes, and snippets.

Embed
What would you like to do?
Setup PHPUnit for use in the Local by Flywheel app
#!/usr/bin/env bash
# ===============================================================================
# Script to install PHPUnit in the Local by Flywheel Mac app
# These packages are installed
#
# PHPUnit, git, subversion, composer, curl and wget
#
# The $WP_CORE_DIR and $WP_TESTS_DIR environment variables are added to the ~/.bashrc file
#
# These directories are used by plugins that have their unit tests scaffolded by WP-CLI.
# VVV also adds these as enviroment variables by default.
#
# WordPress and the WP_UnitTestCase are installed in these directories for use by PHPUnit.
# A database is created for WordPress with these credentials:
# db_name: wordpress_test
# db_user: root
# db_pass: root
#
# You only have to run this script once. PHPUnit (and the other packages)
# are still available next time you ssh into your site.
#
# To update packages, WordPress and the WP_UnitTestCase re-run this script.
#
# Note: This script doesn't install the packages globally in the Local by Flywheel app
# Packages are only installed for the site where you've run this script.
# ===============================================================================
# ===============================================================================
# Instructions
#
# 1 - Download this file (setup-phpunit.sh) inside your site's /app folder
# curl -o setup-phpunit.sh https://gist.githubusercontent.com/keesiemeijer/a888f3d9609478b310c2d952644891ba/raw/
#
# 2 - Right click your site in the Local App and click Open Site SSH
# A new terminal window will open
#
# 3 - Go to your site's /app folder:
# cd /app
#
# 4 - Run this script
# bash setup-phpunit.sh
#
# 5 - Reload the .bashrc file
# source ~/.bashrc
# ===============================================================================
# ===============================================================================
# PHPUnit version
#
# By default PHPUnit version 5.7.27 is installed (or 4.8.36 for PHP versions < 5.6)
# See ticket https://core.trac.wordpress.org/ticket/39822
#
# Run the command with a version if you need to test with a specific PHPUnit version
#
# bash setup-phpunit.sh 6
#
# This example will install the latest PHPUnit from version 6 (e.g. 6.4.4)
# Available versions can be found here: https://phar.phpunit.de
#
# ===============================================================================
printf "Installing packages...\n"
# Strings used in error messages
readonly QUIT="Stopping script..."
readonly CONNECTION="Make sure you're connected to the internet"
readonly RED='\033[0;31m' # Red color
readonly RESET='\033[0m' # No color
# Re-synchronize the package index files from their sources
apt-get update -y
# Install packages.
apt-get install -y wget subversion curl git
# Check if packages used for downloading have been installed
if [[ ! -f "/usr/bin/wget" || ! -f "/usr/bin/curl" || ! -f "/usr/bin/svn" ]]; then
printf "${RED}ERROR${RESET} Missing packages. %s\n%s\n" "$CONNECTION" "$QUIT"
exit 1
fi
# Install composer
if ! [[ -f "/usr/local/bin/composer" ]]; then
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer || exit
if [[ -f "$HOME/.bashrc" ]]; then
printf "Adding .composer/vendor/bin to the PATH\n"
echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> "$HOME/.bashrc"
fi
else
printf "Updating composer...\n"
composer self-update || printf "${RED}WARNING${RESET} Could not update composer. %s\n" "$CONNECTION"
fi
# Get the current php version
readonly PHP_VERSION=$(php -r "echo PHP_VERSION;")
# Set default PHPUnit version to 5 if no specific version was supplied
PHPUNIT_VERSION=${1-5}
if [[ ${PHP_VERSION:0:2} = "5." && ${PHP_VERSION:2:1} -lt 6 ]]; then
# Install PHPUnit 4.*.* for PHP versions lower than 5.6
PHPUNIT_VERSION="4"
fi
if wget --spider "https://phar.phpunit.de/phpunit-$PHPUNIT_VERSION.phar" >/dev/null 2>&1; then
printf "Installing PHPUnit...\n"
wget -q --show-progress "https://phar.phpunit.de/phpunit-$PHPUNIT_VERSION.phar"
chmod +x "phpunit-$PHPUNIT_VERSION.phar"
mv "phpunit-$PHPUNIT_VERSION.phar" /usr/local/bin/phpunit
else
printf "${RED}WARNING${RESET} Could not install PHPUnit version %s. %s and use a valid PHPUnit version (if supplied)\n" "phpunit-$PHPUNIT_VERSION.phar" "$CONNECTION"
fi
# Set environment variables
if [[ -f "$HOME/.bashrc" ]]; then
# Get the variables.
source "$HOME/.bashrc"
if [[ -z "${WP_TESTS_DIR}" ]]; then
printf "Setting WP_TESTS_DIR environment variable\n"
echo 'export WP_TESTS_DIR=/tmp/wordpress-tests-lib' >> "$HOME/.bashrc"
fi
if [[ -z "${WP_CORE_DIR}" ]]; then
printf "Setting WP_CORE_DIR environment variable\n"
echo 'export WP_CORE_DIR=/tmp/wordpress' >> "$HOME/.bashrc"
fi
# Get the new variables.
source "$HOME/.bashrc"
fi
if [[ -z "$WP_CORE_DIR" || -z "$WP_TESTS_DIR" ]]; then
printf "${RED}ERROR${RESET} Could not set the WordPress (directory) environment variables used by PHPUnit\n%s\n" "$QUIT"
exit 1
fi
if [[ -d "$WP_CORE_DIR" && -d "$WP_TESTS_DIR" ]]; then
# Get the latest WordPress version
readonly WP_LATEST=$(wget -q -O - "http://api.wordpress.org/core/version-check/1.5/" | head -n 4 | tail -n 1);
if [[ -z "$WP_LATEST" ]]; then
printf "${RED}ERROR${RESET} Could not get latest WordPress version from api.wordpress.org. %s\n%s\n" "$CONNECTION" "$QUIT"
exit 1
fi
# Update WordPress and WP_UnitTestCase to the latest version.
if wget --spider "https://wordpress.org/wordpress-$WP_LATEST.tar.gz" >/dev/null 2>&1; then
printf "Updating WordPress to %s \n" "$WP_LATEST"
wget -q --show-progress -O "/tmp/wordpress.tar.gz" "https://wordpress.org/wordpress-$WP_LATEST.tar.gz"
tar --strip-components=1 -zxmf "/tmp/wordpress.tar.gz" -C "$WP_CORE_DIR"
else
printf "${RED}WARNING${RESET} Could not download %s %s\n" "https://wordpress.org/wordpress-$WP_LATEST.tar.gz." "$CONNECTION"
fi
if [[ -f "$WP_TESTS_DIR/wp-tests-config.php" ]]; then
# Move the config outside the $WP_TESTS_DIR dir to Update WP_UnitTestCase.
mv "$WP_TESTS_DIR/wp-tests-config.php" "/tmp/wp-tests-config.php"
fi
if wget --spider "https://develop.svn.wordpress.org/tags/$WP_LATEST/tests/phpunit/includes/" >/dev/null 2>&1; then
printf "Updating %s WP_UnitTestCase...\n" "$WP_LATEST"
svn export --quiet --force "https://develop.svn.wordpress.org/tags/$WP_LATEST/tests/phpunit/includes/" "$WP_TESTS_DIR/includes"
svn export --quiet --force "https://develop.svn.wordpress.org/tags/$WP_LATEST/tests/phpunit/data/" "$WP_TESTS_DIR/data"
if [[ -f "/tmp/wp-tests-config.php" ]]; then
# Move the config back.
cp "/tmp/wp-tests-config.php" "$WP_TESTS_DIR/wp-tests-config.php"
fi
else
printf "${RED}WARNING${RESET} Could not download %s. %s.\n" "https://develop.svn.wordpress.org/tags/$WP_LATEST/tests/phpunit/includes/" "$CONNECTION"
fi
else
# Install WordPress and WP_UnitTestCase.
printf "Installing WordPress and WP_UnitTestCase\n"
wget -q --show-progress -O "/tmp/install-wp-tests.sh" "https://raw.githubusercontent.com/wp-cli/scaffold-command/master/templates/install-wp-tests.sh"
if [[ -f "/tmp/install-wp-tests.sh" ]]; then
bash "/tmp/install-wp-tests.sh" "wordpress_test" "root" "root" "localhost" "latest" "true"
else
printf "${RED}WARNING${RESET} Could not install WordPress and WP_UnitTestCase\n"
fi
fi
# Install database if it doesn't exist
printf "Checking if database wordpress_test exists\n"
database=$(mysqlshow --user=root --password=root wordpress_test| grep -v Wildcard | grep -o wordpress_test)
if ! [[ "wordpress_test" = "$database" ]]; then
printf "Creating database wordpress_test\n"
mysqladmin create wordpress_test --user=root --password=root --host=localhost
else
printf "Database wordpress_test already exists\n"
fi
if [[ -f "$WP_TESTS_DIR/wp-tests-config.php" ]]; then
# VVV has the tests config outside the $WP_TESTS_DIR dir.
cp "$WP_TESTS_DIR/wp-tests-config.php" "/tmp/wp-tests-config.php"
fi
printf "\nFinished setting up packages\n\n"
@tarecord

This comment has been minimized.

tarecord commented Jan 9, 2018

This is awesome! Thanks!

@JJJ

This comment has been minimized.

JJJ commented Aug 20, 2018

Still works. Thanks keesiemeijer! 👍

@hazephase

This comment has been minimized.

hazephase commented Sep 6, 2018

When I run bash setup-phpunit.sh I get

Could not install packages
No network connection detected

@rgadon107

This comment has been minimized.

rgadon107 commented Sep 17, 2018

@hazephase In the Terminal, make sure that the shell script ( setup-phpunit.sh) is located in the /app directory. If it's it in a different directory (for example /app/a888f3d9609478b310c2d952644891ba/setup-phpunit.sh, you will not be able to open and execute the target script. It's just a matter of relocating the shell script (once it's been installed to your project) to the root of the /app directory. Then call the script. It should install easily and quickly.

@keesiemeijer

This comment has been minimized.

Owner

keesiemeijer commented Sep 27, 2018

@hazephase I've updated the script (revision 15) to look if packages are installed instead of checking the internet connection. It should work with the Local app version 2.4.2

@iCaspar

This comment has been minimized.

iCaspar commented Sep 28, 2018

Thanks for this @keesiemeijer, 👍 for the fix!

@JJJ

This comment has been minimized.

JJJ commented Oct 16, 2018

Continues to work with Local Environment 1.3.1. 🤗

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment