entity-command/features/site.feature
Alain Schlesser 646603fac8
Modernize deprecated syntax in Behat tests
WP-CLI now emits deprecation warnings when it rewrites legacy command syntax. Use the modern forms in the Behat scenarios so the standard run step can continue to require clean STDERR.
2026-07-23 07:41:54 +02:00

938 lines
26 KiB
Gherkin

Feature: Manage sites in a multisite installation
Scenario: Create a site
Given a WP multisite install
When I try `wp site create --slug=first --network_id=1000`
Then STDERR should contain:
"""
Network with id 1000 does not exist.
"""
And STDOUT should be empty
And the return code should be 1
Scenario: Create a subdomain site
Given a WP multisite subdomain install
When I run `wp site create --slug=first`
Then STDOUT should not be empty
When I run `wp site list --fields=blog_id,url`
Then STDOUT should be a table containing rows:
| blog_id | url |
| 1 | https://example.com/ |
| 2 | http://first.example.com/ |
When I run `wp site list --format=ids`
Then STDOUT should be:
"""
1 2
"""
When I run `wp site list --site_id=2 --format=ids`
Then STDOUT should be empty
When I run `wp --url=first.example.com option get home`
Then STDOUT should be:
"""
http://first.example.com
"""
@skip-windows
Scenario: Delete a site by id
Given a WP multisite subdirectory install
When I run `wp site create --slug=first --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
And I run `wp site list --site__in={SITE_ID} --field=url | sed -e's,^\(.*\)://.*,\1,g'`
And save STDOUT as {SCHEME}
When I run `wp site list --fields=blog_id,url`
Then STDOUT should be a table containing rows:
| blog_id | url |
| 1 | https://example.com/ |
| 2 | {SCHEME}://example.com/first/ |
When I run `wp site list --field=url`
Then STDOUT should be:
"""
https://example.com/
{SCHEME}://example.com/first/
"""
When I try `wp site delete 1`
Then STDERR should be:
"""
Error: You cannot delete the root site.
"""
And STDOUT should be empty
And the return code should be 1
When I run `wp site delete {SITE_ID} --yes`
Then STDOUT should be:
"""
Success: The site at '{SCHEME}://example.com/first/' was deleted.
"""
When I try the previous command again
Then the return code should be 1
@skip-windows
Scenario: Delete a site by id and remove all prefixed tables
Given a WP multisite subdirectory install
When I run `wp site create --slug=first --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
And I try `wp db query "CREATE TABLE wp_{SITE_ID}_custom_data (id INTEGER PRIMARY KEY);"`
And I run `wp site delete {SITE_ID} --yes --delete-tables-with-prefix`
And STDOUT should contain:
"""
Success: The site at '
"""
When I try `wp db query "CREATE TABLE wp_{SITE_ID}_custom_data (id INTEGER PRIMARY KEY);"`
Then STDOUT should be empty
And the return code should be 0
And I try `wp db query "DROP TABLE wp_{SITE_ID}_custom_data;"`
And the return code should be 0
@skip-windows
Scenario: Deleting a site cannot combine keep-tables with delete-tables-with-prefix
Given a WP multisite subdirectory install
When I run `wp site create --slug=first --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
When I try `wp site delete {SITE_ID} --yes --keep-tables --delete-tables-with-prefix`
Then STDERR should be:
"""
Error: The '--keep-tables' and '--delete-tables-with-prefix' flags cannot be used together.
"""
And STDOUT should be empty
And the return code should be 1
@skip-windows
Scenario: Filter site list
Given a WP multisite install
When I run `wp site create --slug=first --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
And I run `wp site list --site__in={SITE_ID} --field=url | sed -e's,^\(.*\)://.*,\1,g'`
And save STDOUT as {SCHEME}
When I run `wp site list --fields=blog_id,url`
Then STDOUT should be a table containing rows:
| blog_id | url |
| 1 | https://example.com/ |
| 2 | {SCHEME}://example.com/first/ |
When I run `wp site list --field=url --blog_id=2`
Then STDOUT should be:
"""
{SCHEME}://example.com/first/
"""
When I run `wp site list --field=url --site-path=/first/`
Then STDOUT should be:
"""
{SCHEME}://example.com/first/
"""
Scenario: Filter site list by user
Given a WP multisite install
When I run `wp site create --slug=first --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
And I run `wp site list --blog_id={SITE_ID} --field=url`
And save STDOUT as {SITE_URL}
When I run `wp user create newuser newuser@example.com --porcelain --url={SITE_URL}`
Then STDOUT should be a number
And save STDOUT as {USER_ID}
And I run `wp user get {USER_ID} --field=user_login`
And save STDOUT as {USER_LOGIN}
When I run `wp site list --field=url --site_user={USER_LOGIN}`
Then STDOUT should be:
"""
{SITE_URL}
"""
When I try `wp site list --site_user=invalid_user`
Then the return code should be 1
And STDERR should be:
"""
Error: Invalid user ID, email or login: 'invalid_user'
"""
When I run `wp user remove-role {USER_LOGIN} --url={SITE_URL}`
Then STDOUT should contain:
"""
Success: Removed
"""
When I run `wp site list --field=url --site_user={USER_LOGIN}`
Then STDOUT should be empty
Scenario: Delete a site by slug
Given a WP multisite install
When I run `wp site create --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 created: http
"""
And STDOUT should contain:
"""
://example.com/first/
"""
When I run `wp site delete --slug=first --yes`
Then STDOUT should contain:
"""
://example.com/first/' was deleted.
"""
When I try the previous command again
Then the return code should be 1
When I run `wp site create --slug=42`
Then STDOUT should contain:
"""
Success: Site 3 created: http
"""
And STDOUT should contain:
"""
://example.com/42/
"""
When I run `wp site delete --slug=42 --yes`
Then STDOUT should contain:
"""
://example.com/42/' was deleted.
"""
When I try the previous command again
Then STDERR should contain:
"""
Error: Could not find site with slug '42'.
"""
And the return code should be 1
Scenario: Archive a site by a numeric slug
Given a WP multisite install
When I run `wp site create --slug=42`
Then STDOUT should contain:
"""
Success: Site 2 created: http
"""
And STDOUT should contain:
"""
://example.com/42/
"""
When I run `wp site archive --slug=42`
Then STDOUT should contain:
"""
Success: Site 2 archived.
"""
When I try `wp site archive --slug=43`
Then STDERR should contain:
"""
Error: Could not find site with slug '43'.
"""
And the return code should be 1
@skip-windows
Scenario: Get site info
Given a WP multisite install
When I run `wp site create --slug=first --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
And I run `wp site list --site__in={SITE_ID} --field=url | sed -e's,^\(.*\)://.*,\1,g'`
And save STDOUT as {SCHEME}
When I run `wp site list --site__in={SITE_ID} --field=url`
Then STDOUT should be:
"""
{SCHEME}://example.com/first/
"""
When I run `wp site create --slug=second --porcelain`
Then STDOUT should be a number
And save STDOUT as {SECOND_ID}
And I run `wp site list --site__in={SECOND_ID} --field=url | sed -e's,^\(.*\)://.*,\1,g'`
And save STDOUT as {SECOND_SCHEME}
When I run `wp site list --site__in={SECOND_ID},{SITE_ID} --field=url`
Then STDOUT should be:
"""
{SECOND_SCHEME}://example.com/second/
{SCHEME}://example.com/first/
"""
Scenario: Not providing a site ID or slug when running an update blog status command should throw an error
Given a WP multisite install
When I try `wp site private`
Then the return code should be 1
And STDERR should be:
"""
Error: Please specify one or more IDs of sites, or pass the slug for a single site using --slug.
"""
And STDOUT should be empty
Scenario: Site IDs or a slug can be provided, but not both.
Given a WP multisite install
And I run `wp site create --slug=first --porcelain`
When I try `wp site private 1 --slug=first`
Then the return code should be 1
And STDERR should be:
"""
Error: Please specify one or more IDs of sites, or pass the slug for a single site using --slug.
"""
Scenario: Errors for an invalid slug
Given a WP multisite install
When I try `wp site private --slug=first`
Then the return code should be 1
And STDERR should be:
"""
Error: Could not find site with slug 'first'.
"""
Scenario: Archive/unarchive a site
Given a WP multisite install
And I run `wp site create --slug=first --porcelain`
And save STDOUT as {FIRST_SITE}
And I run `wp site create --slug=second --porcelain`
And save STDOUT as {SECOND_SITE}
When I run `wp site archive {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} archived.
"""
When I run `wp site list --fields=blog_id,archived`
Then STDOUT should be a table containing rows:
| blog_id | archived |
| {FIRST_SITE} | 1 |
When I try `wp site archive {FIRST_SITE} {SECOND_SITE}`
Then STDERR should be:
"""
Warning: Site {FIRST_SITE} already archived.
"""
And STDOUT should be:
"""
Success: Site {SECOND_SITE} archived.
"""
And the return code should be 0
When I run `wp site list --fields=blog_id,archived`
Then STDOUT should be a table containing rows:
| blog_id | archived |
| {FIRST_SITE} | 1 |
When I run `wp site unarchive {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} unarchived.
"""
When I run `wp site list --fields=blog_id,archived`
Then STDOUT should be a table containing rows:
| blog_id | archived |
| {FIRST_SITE} | 0 |
When I try `wp site archive 1`
Then STDERR should be:
"""
Warning: You are not allowed to change the main site.
"""
And STDOUT should be empty
And the return code should be 0
Scenario: Activate/deactivate a site
Given a WP multisite install
And I run `wp site create --slug=first --porcelain`
And save STDOUT as {FIRST_SITE}
And I run `wp site create --slug=second --porcelain`
And save STDOUT as {SECOND_SITE}
When I run `wp site deactivate {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} deactivated.
"""
When I run `wp site list --fields=blog_id,deleted`
Then STDOUT should be a table containing rows:
| blog_id | deleted |
| {FIRST_SITE} | 1 |
When I try `wp site deactivate {FIRST_SITE} {SECOND_SITE}`
Then STDERR should be:
"""
Warning: Site {FIRST_SITE} already deactivated.
"""
And STDOUT should be:
"""
Success: Site {SECOND_SITE} deactivated.
"""
And the return code should be 0
When I run `wp site list --fields=blog_id,deleted`
Then STDOUT should be a table containing rows:
| blog_id | deleted |
| {FIRST_SITE} | 1 |
When I run `wp site activate {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} activated.
"""
When I run `wp site list --fields=blog_id,deleted`
Then STDOUT should be a table containing rows:
| blog_id | deleted |
| {FIRST_SITE} | 0 |
When I try `wp site deactivate 1`
Then STDERR should be:
"""
Warning: You are not allowed to change the main site.
"""
And STDOUT should be empty
And the return code should be 0
Scenario: Mark/remove a site from spam
Given a WP multisite install
And I run `wp site create --slug=first --porcelain`
And save STDOUT as {FIRST_SITE}
And I run `wp site create --slug=second --porcelain`
And save STDOUT as {SECOND_SITE}
When I run `wp site spam {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} marked as spam.
"""
When I run `wp site list --fields=blog_id,spam`
Then STDOUT should be a table containing rows:
| blog_id | spam |
| {FIRST_SITE} | 1 |
When I try `wp site spam {FIRST_SITE} {SECOND_SITE}`
Then STDERR should be:
"""
Warning: Site {FIRST_SITE} already marked as spam.
"""
And STDOUT should be:
"""
Success: Site {SECOND_SITE} marked as spam.
"""
And the return code should be 0
When I run `wp site list --fields=blog_id,spam`
Then STDOUT should be a table containing rows:
| blog_id | spam |
| {FIRST_SITE} | 1 |
When I run `wp site unspam {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} removed from spam.
"""
When I run `wp site list --fields=blog_id,spam`
Then STDOUT should be a table containing rows:
| blog_id | spam |
| {FIRST_SITE} | 0 |
When I try `wp site spam 1`
Then STDERR should be:
"""
Warning: You are not allowed to change the main site.
"""
And STDOUT should be empty
And the return code should be 0
Scenario: Mark/remove a site as mature
Given a WP multisite install
And I run `wp site create --slug=first --porcelain`
And save STDOUT as {FIRST_SITE}
And I run `wp site create --slug=second --porcelain`
And save STDOUT as {SECOND_SITE}
When I run `wp site mature {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} marked as mature.
"""
When I run `wp site list --fields=blog_id,mature`
Then STDOUT should be a table containing rows:
| blog_id | mature |
| {FIRST_SITE} | 1 |
When I try `wp site mature {FIRST_SITE} {SECOND_SITE}`
Then STDERR should be:
"""
Warning: Site {FIRST_SITE} already marked as mature.
"""
And STDOUT should be:
"""
Success: Site {SECOND_SITE} marked as mature.
"""
And the return code should be 0
When I run `wp site list --fields=blog_id,mature`
Then STDOUT should be a table containing rows:
| blog_id | mature |
| {FIRST_SITE} | 1 |
When I run `wp site unmature {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} marked as unmature.
"""
When I run `wp site list --fields=blog_id,mature`
Then STDOUT should be a table containing rows:
| blog_id | mature |
| {FIRST_SITE} | 0 |
When I try `wp site unmature 1`
Then STDERR should be:
"""
Warning: You are not allowed to change the main site.
"""
And STDOUT should be empty
And the return code should be 0
Scenario: Set/Unset a site as public
Given a WP multisite install
And I run `wp site create --slug=first --porcelain`
And save STDOUT as {FIRST_SITE}
And I run `wp site create --slug=second --porcelain`
And save STDOUT as {SECOND_SITE}
When I run `wp site private {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} marked as private.
"""
When I run `wp site list --fields=blog_id,public`
Then STDOUT should be a table containing rows:
| blog_id | public |
| {FIRST_SITE} | 0 |
When I try `wp site private {FIRST_SITE} {SECOND_SITE}`
Then STDERR should be:
"""
Warning: Site {FIRST_SITE} already marked as private.
"""
And STDOUT should be:
"""
Success: Site {SECOND_SITE} marked as private.
"""
And the return code should be 0
When I run `wp site list --fields=blog_id,public`
Then STDOUT should be a table containing rows:
| blog_id | public |
| {FIRST_SITE} | 0 |
When I run `wp site public {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} marked as public.
"""
When I run `wp site list --fields=blog_id,public`
Then STDOUT should be a table containing rows:
| blog_id | public |
| {FIRST_SITE} | 1 |
When I try `wp site private 1`
Then STDERR should be:
"""
Warning: You are not allowed to change the main site.
"""
And STDOUT should be empty
And the return code should be 0
Scenario: Permit CLI operations against archived and suspended sites
Given a WP multisite install
And I run `wp site create --slug=first --porcelain`
And save STDOUT as {FIRST_SITE}
When I run `wp site archive {FIRST_SITE}`
Then STDOUT should be:
"""
Success: Site {FIRST_SITE} archived.
"""
When I run `wp --url=example.com/first option get home`
Then STDOUT should contain:
"""
://example.com/first
"""
Scenario: Create site with title containing slash
Given a WP multisite install
And I run `wp site create --slug=mysite --title="My\Site"`
Then STDOUT should not be empty
When I run `wp option get blogname --url=example.com/mysite`
Then STDOUT should be:
"""
My\Site
"""
Scenario: Activate/deactivate a site by slug
Given a WP multisite install
When I run `wp site create --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 created: http
"""
And STDOUT should contain:
"""
://example.com/first/
"""
When I run `wp site deactivate --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 deactivated.
"""
When I run `wp site list --fields=blog_id,deleted`
Then STDOUT should be a table containing rows:
| blog_id | deleted |
| 2 | 1 |
When I try `wp site deactivate --slug=first`
Then STDERR should be:
"""
Warning: Site 2 already deactivated.
"""
When I run `wp site activate --slug=first`
Then STDOUT should be:
"""
Success: Site 2 activated.
"""
When I run `wp site list --fields=blog_id,deleted`
Then STDOUT should be a table containing rows:
| blog_id | deleted |
| 2 | 0 |
Scenario: Archive/unarchive a site by slug
Given a WP multisite install
When I run `wp site create --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 created: http
"""
And STDOUT should contain:
"""
://example.com/first/
"""
When I run `wp site archive --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 archived.
"""
When I run `wp site list --fields=blog_id,archived`
Then STDOUT should be a table containing rows:
| blog_id | archived |
| 2 | 1 |
When I try `wp site archive --slug=first`
Then STDERR should be:
"""
Warning: Site 2 already archived.
"""
When I run `wp site unarchive --slug=first`
Then STDOUT should be:
"""
Success: Site 2 unarchived.
"""
When I run `wp site list --fields=blog_id,archived`
Then STDOUT should be a table containing rows:
| blog_id | archived |
| 2 | 0 |
Scenario: Mark/remove a site by slug from spam
Given a WP multisite install
When I run `wp site create --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 created: http
"""
And STDOUT should contain:
"""
://example.com/first/
"""
When I run `wp site spam --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 marked as spam.
"""
When I run `wp site list --fields=blog_id,spam`
Then STDOUT should be a table containing rows:
| blog_id | spam |
| 2 | 1 |
When I try `wp site spam --slug=first`
Then STDERR should be:
"""
Warning: Site 2 already marked as spam.
"""
When I run `wp site unspam --slug=first`
Then STDOUT should be:
"""
Success: Site 2 removed from spam.
"""
When I run `wp site list --fields=blog_id,spam`
Then STDOUT should be a table containing rows:
| blog_id | spam |
| 2 | 0 |
Scenario: Mark/remove a site by slug as mature
Given a WP multisite install
When I run `wp site create --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 created: http
"""
And STDOUT should contain:
"""
://example.com/first/
"""
When I run `wp site mature --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 marked as mature.
"""
When I run `wp site list --fields=blog_id,mature`
Then STDOUT should be a table containing rows:
| blog_id | mature |
| 2 | 1 |
When I try `wp site mature --slug=first`
Then STDERR should be:
"""
Warning: Site 2 already marked as mature.
"""
When I run `wp site unmature --slug=first`
Then STDOUT should be:
"""
Success: Site 2 marked as unmature.
"""
When I run `wp site list --fields=blog_id,mature`
Then STDOUT should be a table containing rows:
| blog_id | mature |
| 2 | 0 |
Scenario: Set/Unset a site by slug as public
Given a WP multisite install
When I run `wp site create --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 created: http
"""
And STDOUT should contain:
"""
://example.com/first/
"""
When I run `wp site private --slug=first`
Then STDOUT should contain:
"""
Success: Site 2 marked as private.
"""
When I run `wp site list --fields=blog_id,public`
Then STDOUT should be a table containing rows:
| blog_id | public |
| 2 | 0 |
When I try `wp site private --slug=first`
Then STDERR should be:
"""
Warning: Site 2 already marked as private.
"""
When I run `wp site public --slug=first`
Then STDOUT should be:
"""
Success: Site 2 marked as public.
"""
When I run `wp site list --fields=blog_id,public`
Then STDOUT should be a table containing rows:
| blog_id | public |
| 2 | 1 |
Scenario: Get site by ID
Given a WP multisite install
When I run `wp site create --slug=testsite --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
When I run `wp site get {SITE_ID} --field=blog_id`
Then STDOUT should be:
"""
{SITE_ID}
"""
When I run `wp site get {SITE_ID}`
Then STDOUT should be a table containing rows:
| Field | Value |
| blog_id | {SITE_ID} |
Scenario: Get site by URL
Given a WP multisite install
When I run `wp site create --slug=testsite --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
And I run `wp site list --blog_id={SITE_ID} --field=url`
And save STDOUT as {SITE_URL}
When I run `wp site get {SITE_URL} --field=blog_id`
Then STDOUT should be:
"""
{SITE_ID}
"""
Scenario: Get site by URL with subdirectory
Given a WP multisite subdirectory install
When I run `wp site create --slug=mysubdir --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
When I run `wp site get http://example.com/mysubdir/ --field=blog_id`
Then STDOUT should be:
"""
{SITE_ID}
"""
Scenario: Use site get with site delete
Given a WP multisite install
When I run `wp site create --slug=deleteme --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
When I run `wp site get http://example.com/deleteme/ --field=blog_id`
Then STDOUT should be:
"""
{SITE_ID}
"""
And save STDOUT as {BLOG_ID}
When I run `wp site delete {BLOG_ID} --yes`
Then STDOUT should contain:
"""
Success: The site at
"""
And STDOUT should contain:
"""
was deleted.
"""
Scenario: Get site with invalid URL should fail
Given a WP multisite install
When I try `wp site get http://example.com/nonexistent/ --field=blog_id`
Then STDERR should contain:
"""
Error: Could not find site with URL: http://example.com/nonexistent/
"""
And the return code should be 1
Scenario: Get site by domain without scheme
Given a WP multisite subdirectory install
When I run `wp site create --slug=noscheme --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
When I run `wp site get example.com/noscheme/ --field=blog_id`
Then STDOUT should be:
"""
{SITE_ID}
"""
Scenario: Get site by simple domain path
Given a WP multisite subdirectory install
When I run `wp site create --slug=simplepath --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
When I run `wp site get example.com/simplepath --field=blog_id`
Then STDOUT should be:
"""
{SITE_ID}
"""
Scenario: Get site by subdomain without scheme
Given a WP multisite subdomain install
When I run `wp site create --slug=subdomain --porcelain`
Then STDOUT should be a number
And save STDOUT as {SITE_ID}
When I run `wp site get subdomain.example.com --field=blog_id`
Then STDOUT should be:
"""
{SITE_ID}
"""
Scenario: Get main site by domain
Given a WP multisite install
When I run `wp site get example.com --field=blog_id`
Then STDOUT should be:
"""
1
"""