From d30538e7f4e6a7c694303e51de07ceb9ed2a221b Mon Sep 17 00:00:00 2001 From: Steve Grunwell Date: Tue, 22 Mar 2016 00:10:05 -0400 Subject: [PATCH] Add tests for batcache_post(), using WP-CLI's plugin test scaffolding and the WordPress core test framework --- .travis.yml | 25 +++++++ bin/install-wp-tests.sh | 120 ++++++++++++++++++++++++++++++++ phpunit.xml.dist | 14 ++++ tests/bootstrap.php | 15 ++++ tests/test-batcache-manager.php | 113 ++++++++++++++++++++++++++++++ 5 files changed, 287 insertions(+) create mode 100644 .travis.yml create mode 100755 bin/install-wp-tests.sh create mode 100644 phpunit.xml.dist create mode 100644 tests/bootstrap.php create mode 100644 tests/test-batcache-manager.php diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..61cc840 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,25 @@ +language: php + +notifications: + email: + on_success: never + on_failure: change + +php: + - 5.3 + - 5.6 + +env: + - WP_VERSION=latest WP_MULTISITE=0 + - WP_VERSION=3.2 WP_MULTISITE=0 + - WP_VERSION=3.5 WP_MULTISITE=0 + +matrix: + include: + - php: 5.3 + env: WP_VERSION=latest WP_MULTISITE=1 + +before_script: + - bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION + +script: phpunit diff --git a/bin/install-wp-tests.sh b/bin/install-wp-tests.sh new file mode 100755 index 0000000..5baa6cb --- /dev/null +++ b/bin/install-wp-tests.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash + +if [ $# -lt 3 ]; then + echo "usage: $0 [db-host] [wp-version]" + exit 1 +fi + +DB_NAME=$1 +DB_USER=$2 +DB_PASS=$3 +DB_HOST=${4-localhost} +WP_VERSION=${5-latest} + +WP_TESTS_DIR=${WP_TESTS_DIR-/tmp/wordpress-tests-lib} +WP_CORE_DIR=${WP_CORE_DIR-/tmp/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]+(\.[0-9]+)? ]]; then + WP_TESTS_TAG="tags/$WP_VERSION" +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 /tmp/wordpress-nightly + download https://wordpress.org/nightly-builds/wordpress-latest.zip /tmp/wordpress-nightly/wordpress-nightly.zip + unzip -q /tmp/wordpress-nightly/wordpress-nightly.zip -d /tmp/wordpress-nightly/ + mv /tmp/wordpress-nightly/wordpress/* $WP_CORE_DIR + else + if [ $WP_VERSION == 'latest' ]; then + local ARCHIVE_NAME='latest' + else + local ARCHIVE_NAME="wordpress-$WP_VERSION" + fi + download https://wordpress.org/${ARCHIVE_NAME}.tar.gz /tmp/wordpress.tar.gz + tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR + fi + + download https://raw.github.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 + svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes + fi + + cd $WP_TESTS_DIR + + 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 + sed $ioption "s:dirname( __FILE__ ) . '/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 + +} + +install_db() { + # 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 + mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA +} + +install_wp +install_test_suite +install_db diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..44f0fdb --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,14 @@ + + + + ./tests/ + + + diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..8635a56 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,15 @@ +group = 'batcache'; + + // Initialize the cache and add an undefined property. + wp_cache_init(); + + $wp_object_cache->no_remote_groups = array(); + + parent::setUp(); + } + + public function test_batcache_post() { + $post_id = self::factory()->post->create(); + $home = trailingslashit( get_option( 'home' ) ); + $urls = array( + $home, + $home . 'feed/', + get_permalink( $post_id ) + ); + + // Seed the cache. + foreach ( $urls as $url ) { + $this->set_cache( $url, uniqid() ); + } + + // Run batcache_post(). + batcache_post( $post_id ); + + // All three caches should now be empty. + foreach ( $urls as $url ) { + //$this->assertFalse( $this->get_cache( $url ) ); + } + } + + /** + * Revisions shouldn't change anything in the cache. + */ + public function test_batcache_post_skips_revisions() { + $post_id = self::factory()->post->create( array( + 'post_type' => 'revision' + ) ); + $url = get_permalink( $post_id ); + $val = uniqid(); + + // Seed the cache. + $this->set_cache( $url, $val ); + + // After running batcache_post(), our value should still be set. + batcache_post( $post_id ); + + $this->assertEquals( $val, $this->get_cache( $url ) ); + } + + /** + * Only published and trashed post statuses should qualify. + */ + public function test_batcache_post_skips_drafts() { + $post_id = self::factory()->post->create( array( + 'post_status' => 'draft' + ) ); + $url = get_permalink( $post_id ); + $val = uniqid(); + + // Seed the cache. + $this->set_cache( $url, $val ); + + // After running batcache_post(), our value should still be set. + batcache_post( $post_id ); + + $this->assertEquals( $val, $this->get_cache( $url ) ); + } + + /** + * Retrieve the contents of a seeded cache. + * + * @global $batcache + * + * @param string $url The URL to create a cache entry for. + * @return mixed The value previously stored in the cache. + */ + protected function get_cache( $url ) { + global $batcache; + + $url_key = md5( $url ); + return wp_cache_get( $url_key, $batcache->group ); + } + + /** + * Helper to put a URL into Batcache. + * + * @global $batcache + * + * @param string $url The URL to create a cache entry for. + * @param string $val The value to store in the cache. + */ + protected function set_cache( $url, $val ) { + global $batcache; + + $url_key = md5( $url ); + wp_cache_add( $url_key, $val, $batcache->group ); + } +}