{"id":18513683,"url":"https://github.com/proklung/wordpress-test-build","last_synced_at":"2025-05-14T12:34:57.520Z","repository":{"id":57045147,"uuid":"367061890","full_name":"ProklUng/wordpress-test-build","owner":"ProklUng","description":"Wordpress в виде минимальной сборки для нужд тестирования + инструменты","archived":false,"fork":false,"pushed_at":"2021-06-15T12:34:51.000Z","size":14644,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-25T21:24:02.080Z","etag":null,"topics":["php7","wordpress","wordpress-phpunit"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ProklUng.png","metadata":{"files":{"readme":"readme.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-13T13:44:58.000Z","updated_at":"2021-06-15T12:34:53.000Z","dependencies_parsed_at":"2022-08-24T04:11:20.071Z","dependency_job_id":null,"html_url":"https://github.com/ProklUng/wordpress-test-build","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwordpress-test-build","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwordpress-test-build/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwordpress-test-build/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwordpress-test-build/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ProklUng","download_url":"https://codeload.github.com/ProklUng/wordpress-test-build/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239230948,"owners_count":19603987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["php7","wordpress","wordpress-phpunit"],"created_at":"2024-11-06T15:40:14.300Z","updated_at":"2025-02-17T03:32:17.292Z","avatar_url":"https://github.com/ProklUng.png","language":"PHP","readme":"# Wordpress в виде минимальной сборки для нужд тестирования + инструменты\n\n**INTERNAL**\n\n## Установка\n\n1) composer.json:\n\n```json\n  \"repositories\": [\n    {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/proklung/wordpress-test-build\"\n    }\n  ]\n```\n\n2) `composer require proklung/wordpress-test-build`\n\n## Нюансы\n\nНа текущий момент внутри русская версия `5.7.2` Wordpress.\n\nБазовый класс для тестов - `WordpressableTestCase`. Запускает, приложенный к пакету Wordpress и позволяет использовать в тестах\nего API.\n\nПараметры доступа к БД определяются в методе `setupDatabaseData` базового класса `WordpressableTestCase`.\n\nЕсли база на момент запуска не существует, то будет создана.\n\nПо умолчанию:\n\n```php\n    protected function setupDatabaseData() : void\n    {\n        putenv('MYSQL_HOST=localhost');\n        putenv('MYSQL_DATABASE=wordpress_ci');\n        putenv('MYSQL_USER=root');\n        putenv('MYSQL_PASSWORD=');\n    }\n```\n\nКласс `WordpressableAjaxTestCase` - особый случай для тестирования нативных ajax-обработчиков. По аналогии\nc [WP_Ajax_UnitTestCase](https://infinum.com/handbook/books/wordpress/automated-testing-in-wordpress/basic-tests-using-phpunit/integration-testing#testing-ajax-callbacks).\n\n### Управление\n\n#### Трэйт ResetDatabaseTrait\n\nУказание сбрасывать базу перед каждым тестом и загружать по новой.\n\n#### Трэйт CustomDumpTrait\n\nСбрасывать базу и загружать кастомный дамп базы. \n\nПуть к дампу указывается в методе `getDumpPath` теста:\n\n```php\n    protected function getDumpPath() : string\n    {\n        return $_SERVER['DOCUMENT_ROOT'] . '/Tests/dump/dump.sql';\n    }\n\n```\nДействует только в сочетании с `ResetDatabaseTrait`.\n\n#### Трэйт UseMigrationsTrait\n\nУказание запускать миграции перед каждым тестом. \n\nПод капотом урезанная версия [пакета](https://github.com/ProklUng/wp.migrations), так что подходят миграции и от него. \nМиграция наследуется не от класса `Arrilot\\BitrixMigrations\\BaseMigrations\\WordpressMigration`.\n\nПуть к директории с миграциями указывается в методе `getMigrationsDir` теста:\n\n```php\n    protected function getMigrationsDir() : string\n    {\n        return __DIR__ . '/../migrations';\n    }\n```\n\nК трэйту приложен метод-хелпер `makeMigration` для создания миграций по шаблону.\n\n```php\n    protected function makeMigration(string $name, string $template) : void\n```\n\nДоступные шаблоны:\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eНазвание\u003c/th\u003e\u003cth\u003eОписание\u003c/th\u003e\u003cth\u003eАлиасы\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e`default`\u003c/td\u003e\n    \u003ctd\u003eЧистый шаблон по умолчанию\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e`query`\u003c/td\u003e\n    \u003ctd\u003eПроизвольный запрос в БД\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e`add_table`\u003c/td\u003e\n    \u003ctd\u003eСоздание таблицы через\u003c/td\u003e\n    \u003ctd\u003e`create_table`\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e`delete_table`\u003c/td\u003e\n    \u003ctd\u003eУдаление таблицы\u003c/td\u003e\n    \u003ctd\u003e`drop_table`\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Трэйт ActivatePluginsTrait\n\nНекоторые популярные плагины (WTF?!) не могут быть установлены с помощью композера. Приходится воротить всякое.\n\nТрэйт с функционалом (метод `activatePlugins`) инсталляции (копирование из заданной папки) и активации\nплагинов.\n\nОпределяются два свойства:\n- `pluginSrcDir` - путь к директории, где лежат исходники плагинов (для копирования)\n- `plugins` - массив вида 'директория с плагином' =\u003e путь к основному файлу плагина. Задается в конечном тесте:\n\n```php\n\n    protected static function getWordpressBaseDir() : string\n    {\n        return __DIR__. '/../../files';\n    }\n\n   protected static $pluginSrcDir = __DIR__ . '/files';\n\n   // Скопирует ACF плагин из папки __DIR__ . '/files' в папку, где лежит Wordpress.\n   protected function setUp(): void\n    {\n        // Важно задать параметры перед вызовом родителя.\n        static::$pluginSrcDir =  __DIR__ . '/files';\n        static::$plugins = [\n            'advanced-custom-fields' =\u003e 'advanced-custom-fields/acf.php'\n        ];\n\n        parent::setUp();\n    }\n```\n\n#### Дополнительно\n\nМигрирован кое-какой функционал из [пакета](https://github.com/wp-phpunit/wp-phpunit).\n\n- Метод `goTo` класса `WordpressableTestCase`. Эмулирует (с выставлением всех нужных глобалов) нахождение на такой-то странице.\n  \n```php\n        $this-\u003egoTo('/?p=26799'); // Url - только так, без ЧПУ\n        $this-\u003eassertTrue(is_single());  \n```\n\n- Ассерты `assertWPError` и `assertNotWPError`. \n- Ассерт `assertQueryTrue`: \"Checks each of the WP_Query is_* functions/properties against expected boolean value\".\n- Метод `scanUserUploads` - все файлы в директории с аплоадом.  \n- Метод `setPermalinkStructure`\n- Метод `makeAttachment(array $upload, int $parent_post_id = 0)` - создать аттачмент.\n- Метод `updatePostModified(int $post_id, string $date)`\n\n#### Прочее\n\n1) Статический метод `getWordpressBaseDir` - путь к месту, где лежит Wordpress.\n\n2) Провайдеры данных для Faker:\n\n##### Wordpress\n\n- `permalink` - путь к посту по ID\n- `fileContent` - контент файла\n- `uploadDir` - путь к аплоаду\n- `postId` - случайный ID поста\n- `attachmentId` - случайная картинка\n- `userId` - случайный ID пользователя\n- `termId` - случайная таксономия (категория, тэг)\n\n##### Picsum\n\n- `picsum` - Картинка из picsum. Возвращает путь к загруженной картинке в рамках Wordpress.\n\n\n#### Простой генератор тестового контента\n\nИспользование в миграциях\n\n```php\n    use Prokl\\WordpressCi\\FixtureGenerator\\Repository\\AttachmentRepository;\n    use Prokl\\WordpressCi\\FixtureGenerator\\Repository\\PostRepository;\n    use Prokl\\WordpressCi\\FixtureGenerator\\Repository\\TermRepository;\n    use Prokl\\WordpressCi\\FixtureGenerator\\Repository\\UserRepository;\n\n   public function up()\n    {\n        $faker = Helper::getFaker();\n\n        AttachmentRepository::create(10); // 10 картинок\n        TermRepository::create(10, 'category'); // 10 категорий\n        TermRepository::create(5, 'post_tag'); // 10 тэгов\n        UserRepository::create(5); // 5 пользователей\n\n        // АСF поля. То, что отдает плагин ACF.\n        acf_add_local_field_group(array(\n            'key' =\u003e 'group_5e12e975546ec',\n            'title' =\u003e 'Видео',\n            'fields' =\u003e array(\n                array(\n                    'key' =\u003e 'field_5e130144fa51a',\n                    'label' =\u003e 'Видео элемент',\n                    'name' =\u003e 'video_element',\n                    'type' =\u003e 'relationship',\n                    'instructions' =\u003e '',\n                    'required' =\u003e 0,\n                    'conditional_logic' =\u003e 0,\n                    'wrapper' =\u003e array(\n                        'width' =\u003e '',\n                        'class' =\u003e '',\n                        'id' =\u003e '',\n                    ),\n                    'post_type' =\u003e array(\n                        0 =\u003e 'myvideo',\n                    ),\n                    'taxonomy' =\u003e '',\n                    'filters' =\u003e array(\n                        0 =\u003e 'search',\n                        1 =\u003e 'post_type',\n                        2 =\u003e 'taxonomy',\n                    ),\n                    'elements' =\u003e array(\n                        0 =\u003e 'featured_image',\n                    ),\n                    'min' =\u003e '',\n                    'max' =\u003e '',\n                    'return_format' =\u003e 'object',\n                ),\n            ),\n            'location' =\u003e array(\n                array(\n                    array(\n                        'param' =\u003e 'post_type',\n                        'operator' =\u003e '==',\n                        'value' =\u003e 'post',\n                    ),\n                ),\n            ),\n            'menu_order' =\u003e 0,\n            'position' =\u003e 'normal',\n            'style' =\u003e 'default',\n            'label_placement' =\u003e 'top',\n            'instruction_placement' =\u003e 'label',\n            'hide_on_screen' =\u003e array(\n                0 =\u003e 'discussion',\n            ),\n            'active' =\u003e true,\n            'description' =\u003e '',\n        ));\n\n        // 10 постов с картинками и acf полями.\n        PostRepository::create(10, [\n            'acf' =\u003e [\n                'video_element' =\u003e $faker-\u003epostId()\n            ]\n        ]);\n    }\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproklung%2Fwordpress-test-build","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fproklung%2Fwordpress-test-build","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproklung%2Fwordpress-test-build/lists"}