proklung / wordpress-test-build
Minimal build of Wordpress for testing + tools
Requires
- php: >=7.1
- ext-mysqli: *
- 10up/wp_mock: 0.4.2
- proklung/phpunit-testing-tools: ^1.3
- proklung/wp.migrations: ^1.0
- szepeviktor/phpstan-wordpress: ^0.7.1
README
INTERNAL
Установка
- composer.json:
"repositories": [ { "type": "git", "url": "https://github.com/proklung/wordpress-test-build" } ]
composer require proklung/wordpress-test-build
Нюансы
На текущий момент внутри русская версия 5.7.2
Wordpress.
Базовый класс для тестов - WordpressableTestCase
. Запускает, приложенный к пакету Wordpress и позволяет использовать в тестах
его API.
Параметры доступа к БД определяются в методе setupDatabaseData
базового класса WordpressableTestCase
.
Если база на момент запуска не существует, то будет создана.
По умолчанию:
protected function setupDatabaseData() : void { putenv('MYSQL_HOST=localhost'); putenv('MYSQL_DATABASE=wordpress_ci'); putenv('MYSQL_USER=root'); putenv('MYSQL_PASSWORD='); }
Класс WordpressableAjaxTestCase
- особый случай для тестирования нативных ajax-обработчиков. По аналогии
c WP_Ajax_UnitTestCase.
Управление
Трэйт ResetDatabaseTrait
Указание сбрасывать базу перед каждым тестом и загружать по новой.
Трэйт CustomDumpTrait
Сбрасывать базу и загружать кастомный дамп базы.
Путь к дампу указывается в методе getDumpPath
теста:
protected function getDumpPath() : string { return $_SERVER['DOCUMENT_ROOT'] . '/Tests/dump/dump.sql'; }
Действует только в сочетании с ResetDatabaseTrait
.
Трэйт UseMigrationsTrait
Указание запускать миграции перед каждым тестом.
Под капотом урезанная версия пакета, так что подходят миграции и от него.
Миграция наследуется не от класса Arrilot\BitrixMigrations\BaseMigrations\WordpressMigration
.
Путь к директории с миграциями указывается в методе getMigrationsDir
теста:
protected function getMigrationsDir() : string { return __DIR__ . '/../migrations'; }
К трэйту приложен метод-хелпер makeMigration
для создания миграций по шаблону.
protected function makeMigration(string $name, string $template) : void
Доступные шаблоны:
Трэйт ActivatePluginsTrait
Некоторые популярные плагины (WTF?!) не могут быть установлены с помощью композера. Приходится воротить всякое.
Трэйт с функционалом (метод activatePlugins
) инсталляции (копирование из заданной папки) и активации
плагинов.
Определяются два свойства:
pluginSrcDir
- путь к директории, где лежат исходники плагинов (для копирования)plugins
- массив вида 'директория с плагином' => путь к основному файлу плагина. Задается в конечном тесте:
protected static function getWordpressBaseDir() : string { return __DIR__. '/../../files'; } protected static $pluginSrcDir = __DIR__ . '/files'; // Скопирует ACF плагин из папки __DIR__ . '/files' в папку, где лежит Wordpress. protected function setUp(): void { // Важно задать параметры перед вызовом родителя. static::$pluginSrcDir = __DIR__ . '/files'; static::$plugins = [ 'advanced-custom-fields' => 'advanced-custom-fields/acf.php' ]; parent::setUp(); }
Дополнительно
Мигрирован кое-какой функционал из пакета.
- Метод
goTo
классаWordpressableTestCase
. Эмулирует (с выставлением всех нужных глобалов) нахождение на такой-то странице.
$this->goTo('/?p=26799'); // Url - только так, без ЧПУ $this->assertTrue(is_single());
- Ассерты
assertWPError
иassertNotWPError
. - Ассерт
assertQueryTrue
: "Checks each of the WP_Query is_* functions/properties against expected boolean value". - Метод
scanUserUploads
- все файлы в директории с аплоадом. - Метод
setPermalinkStructure
- Метод
makeAttachment(array $upload, int $parent_post_id = 0)
- создать аттачмент. - Метод
updatePostModified(int $post_id, string $date)
Прочее
-
Статический метод
getWordpressBaseDir
- путь к месту, где лежит Wordpress. -
Провайдеры данных для Faker:
Wordpress
permalink
- путь к посту по IDfileContent
- контент файлаuploadDir
- путь к аплоадуpostId
- случайный ID постаattachmentId
- случайная картинкаuserId
- случайный ID пользователяtermId
- случайная таксономия (категория, тэг)
Picsum
picsum
- Картинка из picsum. Возвращает путь к загруженной картинке в рамках Wordpress.
Простой генератор тестового контента
Использование в миграциях
use Prokl\WordpressCi\FixtureGenerator\Repository\AttachmentRepository; use Prokl\WordpressCi\FixtureGenerator\Repository\PostRepository; use Prokl\WordpressCi\FixtureGenerator\Repository\TermRepository; use Prokl\WordpressCi\FixtureGenerator\Repository\UserRepository; public function up() { $faker = Helper::getFaker(); AttachmentRepository::create(10); // 10 картинок TermRepository::create(10, 'category'); // 10 категорий TermRepository::create(5, 'post_tag'); // 10 тэгов UserRepository::create(5); // 5 пользователей // АСF поля. То, что отдает плагин ACF. acf_add_local_field_group(array( 'key' => 'group_5e12e975546ec', 'title' => 'Видео', 'fields' => array( array( 'key' => 'field_5e130144fa51a', 'label' => 'Видео элемент', 'name' => 'video_element', 'type' => 'relationship', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'post_type' => array( 0 => 'myvideo', ), 'taxonomy' => '', 'filters' => array( 0 => 'search', 1 => 'post_type', 2 => 'taxonomy', ), 'elements' => array( 0 => 'featured_image', ), 'min' => '', 'max' => '', 'return_format' => 'object', ), ), 'location' => array( array( array( 'param' => 'post_type', 'operator' => '==', 'value' => 'post', ), ), ), 'menu_order' => 0, 'position' => 'normal', 'style' => 'default', 'label_placement' => 'top', 'instruction_placement' => 'label', 'hide_on_screen' => array( 0 => 'discussion', ), 'active' => true, 'description' => '', )); // 10 постов с картинками и acf полями. PostRepository::create(10, [ 'acf' => [ 'video_element' => $faker->postId() ] ]); }