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
# ===============================================================================
if ! ping -c 3 --linger=5 8.8.8.8 >> /dev/null 2>&1; then
# Bail if there is no internet connection
printf "Could not install packages\n"
printf "No network connection detected\n\n"
exit 1
fi
# Re-synchronize the package index files from their sources
apt-get update -y
# Install packages.
apt-get install -y wget subversion curl php5-cli git
# Install composer
if [[ "/usr/local/bin/composer" != $(which composer) ]]; then
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
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
fi
# Install PHPUnit 5.7 instead of version 6 and up
# See ticket https://core.trac.wordpress.org/ticket/39822
if [[ "/usr/local/bin/phpunit" != $(which phpunit) ]]; then
wget https://phar.phpunit.de/phpunit-5.7.19.phar
chmod +x phpunit-5.7.19.phar
mv phpunit-5.7.19.phar /usr/local/bin/phpunit
else
printf "phpunit is already installed\n"
fi
if [[ -f "$HOME/.bashrc" ]]; then
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 variables.
source "$HOME/.bashrc"
fi
if [[ -z "$WP_CORE_DIR" || -z "$WP_TESTS_DIR" ]]; then
printf "Could not find the WordPress directories used by PHPUnit\n"
exit 1
fi
if [[ -d "$WP_CORE_DIR" && -d "$WP_TESTS_DIR" ]]; then
# Get the latest WordPress version
latest=$(wget -q -O - "http://api.wordpress.org/core/version-check/1.5/" | head -n 4 | tail -n 1);
if [[ -z "$latest" ]]; then
printf "Could not get WordPress version from api.wordpress.org\n"
exit 1
fi
# Update WordPress and WP_UnitTestCase to the latest version.
if wget --spider "https://wordpress.org/wordpress-$latest.tar.gz" >/dev/null 2>&1; then
printf "Updating WordPress to %s \n" "$latest"
wget -nv -O "/tmp/wordpress.tar.gz" "https://wordpress.org/wordpress-$latest.tar.gz"
tar --strip-components=1 -zxmf "/tmp/wordpress.tar.gz" -C "$WP_CORE_DIR"
else
printf "Could not download %s\n" "https://wordpress.org/wordpress-$latest.tar.gz\n"
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/$latest/tests/phpunit/includes/" >/dev/null 2>&1; then
printf "Updating WP_UnitTestCase %s\n" "$latest"
svn export --quiet --force "https://develop.svn.wordpress.org/tags/$latest/tests/phpunit/includes/" "$WP_TESTS_DIR/includes"
svn export --quiet --force "https://develop.svn.wordpress.org/tags/$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 "Could not download %s\n" "https://develop.svn.wordpress.org/tags/$latest/tests/phpunit/includes/\n"
fi
else
# Install WordPress and WP_UnitTestCase.
printf "Installing WordPress and WP_UnitTestCase\n"
wget -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 "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.

Show comment
Hide comment
@tarecord

tarecord Jan 9, 2018

This is awesome! Thanks!

tarecord commented Jan 9, 2018

This is awesome! Thanks!

@JJJ

This comment has been minimized.

Show comment
Hide comment
@JJJ

JJJ Aug 20, 2018

Still works. Thanks keesiemeijer! 👍

JJJ commented Aug 20, 2018

Still works. Thanks keesiemeijer! 👍

@hazephase

This comment has been minimized.

Show comment
Hide comment
@hazephase

hazephase Sep 6, 2018

When I run bash setup-phpunit.sh I get

Could not install packages
No network connection detected

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.

Show comment
Hide comment
@rgadon107

rgadon107 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.

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.

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