automattic/wordbless

WorDBless allows you to use WordPress core functions in your PHPUnit tests without having to set up a database and the whole WordPress environment

Installs: 498 125

Dependents: 13

Suggesters: 0

Security: 0

Stars: 82

Watchers: 7

Forks: 4

Open Issues: 3

Type:wordpress-dropin

0.3.1 2021-07-07 13:01 UTC

This package is auto-updated.

Last update: 2021-10-07 22:46:54 UTC


README

CI

WorDBless allows you to use WordPress core functions in your PHPUnit tests without having to set up a database and the whole WordPress environment

Usage

Require WorDBless

composer require --dev automattic/wordbless

Make sure to copy db.php

Add this script to your composer.json:

    "scripts": {
        "post-update-cmd": "php -r \"copy('vendor/automattic/wordbless/src/dbless-wpdb.php', 'wordpress/wp-content/db.php');\""
    },

Alternatively, you can manually copy the file.

Initialize it in your bootstrap file

In your PHP Unit bootstrap file add:

require_once __DIR__ . '/../vendor/autoload.php'; // adjust the path as needed

\WorDBless\Load::load();

That's it! You can now use WordPress core functions in your tests!

Writing tests

Extend the BaseTestCase in order to have all the setup and teardown in place.

class My_Tests extends \WorDBless\BaseTestCase {

	public function test_add() {
		add_option( 'test', 123 );
		$this->assertEquals( 123, get_option( 'test' ) );
	}

}

Note WorDBless uses @before and @after annotations rather than overriding PHPUnit's setUp and tearDown methods.

If you choose not to extend this base class, no problem. Just remember that WorDBless won't be set up or torn down for you. Check BaseTestCase::set_up_wordbless() and BaseTestCase::teardown_wordbless() to see how to do it for yourself.

What will work and what will not work?

Disclaimer: This is still experimental, so all testing is very welcome.

Basically any WordPress core function will work. Things like wp_parse_args, add_query_arg, etc.

Hooks and filters will work.

Most of the things that uses the database WILL NOT work, unless you believe in magic.

What magic WorDBless adds?

Options

Manipulating options will work. get_option, update_option, add_option and delete_option should work fine!

Posts and Post meta

Manipulating (creating, updating, deleting) posts and attachments will work. Fetching a single post will also work. Here is a non-exaustive list of functions supported:

  • wp_insert_post
  • wp_update_post
  • wp_delete_post
  • wp_trash_post
  • wp_untrash_post
  • get_post
  • get_post_meta
  • add_post_meta
  • update_post_meta
  • delete_post_meta
  • get_metadata_by_mid
  • update_metadata_by_mid
  • delete_metadata_by_mid
  • wp_insert_attachment
  • wp_get_attachment_image
  • and almost anything related to the manipulation of one attachment

Note: Fetching posts using WP_Query will not work (yet)! To fetch a post, use get_post( $id ).

Users and capabilities

You can create, edit and delete users.

Here is a non-exaustive list of functions supported:

  • wp_insert_user
  • wp_update_user
  • wp_delete_user
  • get_userdata
  • new WP_User( $id ) to fetch a user
  • user_can
  • current_user_can
  • set_current_user
  • get_current_user_id
  • wp_get_current_user
  • get_user_meta
  • update_user_meta
  • add_user_meta
  • delete_user_meta

Posts can be assigned to users and proper capabilities will be correctly checked. When deleting a user, reassigning posts to other user will also work.

Note: Fetching users using WP_Users_Query will not work! To fetch a user, use get_userdata(), get_user_by or WP_User class.

Populating default options

By default, only siteurl and home options are populated with http://example.org.

If you want, you can add more options to be loaded by default.

Just declare a dbless_default_options() function in your bootstrap and make it return an array where the keys are option names and values, options values.

Example

See a live example here -> https://github.com/Automattic/jetpack/pull/16163

Running our CI locally

First install phive globally on your computer.

Then issue the following single command.

composer run-script ci