PNG  IHDRxsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<,tEXtComment File Manager

File Manager

Path: /opt/.wp-cli/packages/vendor/wp-cli/extension-command/features/

Viewing File: plugin.feature

Feature: Manage WordPress plugins

  Scenario: Create, activate and check plugin status
    Given a WP install
    And I run `wp plugin path`
    And save STDOUT as {PLUGIN_DIR}

    When I run `wp plugin scaffold --skip-tests plugin1`
    Then STDOUT should not be empty
    And the {PLUGIN_DIR}/plugin1/plugin1.php file should exist
    And the {PLUGIN_DIR}/zombieland/phpunit.xml.dist file should not exist

    When I run `wp plugin path plugin1`
    Then STDOUT should be:
      """
      {PLUGIN_DIR}/plugin1/plugin1.php
      """

    When I run `wp plugin path plugin1 --dir`
    Then STDOUT should be:
      """
      {PLUGIN_DIR}/plugin1
      """

    When I run `wp plugin scaffold Zombieland`
    Then STDOUT should not be empty
    And the {PLUGIN_DIR}/Zombieland/Zombieland.php file should exist
    And the {PLUGIN_DIR}/Zombieland/phpunit.xml.dist file should exist

    # Ensure case sensitivity
    When I try `wp plugin status zombieLand`
    Then STDERR should contain:
      """
      The 'zombieLand' plugin could not be found.
      """
    And STDOUT should be empty
    And the return code should be 1

    # Check that the inner-plugin is not picked up
    When I run `mv {PLUGIN_DIR}/plugin1 {PLUGIN_DIR}/Zombieland/`
    And I run `wp plugin status Zombieland`
    Then STDOUT should contain:
      """
      Plugin Zombieland details:
          Name: Zombieland
          Status: Inactive
          Version: 0.1.0
          Author: YOUR NAME HERE
          Description: PLUGIN DESCRIPTION HERE
      """

    When I run `wp plugin activate Zombieland`
    Then STDOUT should not be empty

    When I run `wp plugin status Zombieland`
    Then STDOUT should contain:
      """
          Status: Active
      """

    When I run `wp plugin status`
    Then STDOUT should not be empty

    When I run `wp plugin list --fields=name,status,update,version,update_version,auto_update`
    Then STDOUT should be a table containing rows:
      | name       | status | update | version | update_version | auto_update |
      | Zombieland | active | none   | 0.1.0   |                | off         |

    When I try `wp plugin uninstall Zombieland`
    Then STDERR should be:
      """
      Warning: The 'Zombieland' plugin is active.
      Error: No plugins uninstalled.
      """
    And the return code should be 1

    When I run `wp plugin deactivate Zombieland`
    Then STDOUT should not be empty

    When I run `wp option get recently_activated`
    Then STDOUT should contain:
      """
      Zombieland/Zombieland.php
      """

    When I run `wp plugin uninstall Zombieland`
    Then STDOUT should be:
      """
      Uninstalled and deleted 'Zombieland' plugin.
      Success: Uninstalled 1 of 1 plugins.
      """
    And the {PLUGIN_DIR}/zombieland file should not exist

    When I try the previous command again
    Then STDERR should contain:
      """
      Warning:
      """
    And STDERR should contain:
      """
      Zombieland
      """
    And STDERR should contain:
      """
      Error: No plugins uninstalled.
      """
    And STDOUT should be empty
    And the return code should be 1

  # WordPress Importer currently requires at least WP 5.2.
  @require-wp-5.2
  Scenario: Install a plugin, activate, then force install an older version of the plugin
    Given a WP install

    When I run `wp plugin install wordpress-importer --version=0.5 --force`
    Then STDOUT should not be empty

    When I run `wp plugin list --name=wordpress-importer --field=update_version`
    Then STDOUT should not be empty
    And save STDOUT as {UPDATE_VERSION}

    When I run `wp plugin list --fields=name,status,update,version,update_version`
    Then STDOUT should be a table containing rows:
      | name               | status   | update    | version | update_version   |
      | wordpress-importer | inactive | available | 0.5     | {UPDATE_VERSION} |

    When I run `wp plugin activate wordpress-importer`
    Then STDOUT should not be empty

    When I run `wp plugin install wordpress-importer --version=0.5 --force`
    Then STDOUT should not be empty

    When I run `wp plugin list`
    Then STDOUT should be a table containing rows:
      | name               | status   | update    | version | update_version   | auto_update |
      | wordpress-importer | active   | available | 0.5     | {UPDATE_VERSION} | off         |

    When I try `wp plugin update`
    Then STDERR should be:
      """
      Error: Please specify one or more plugins, or use --all.
      """
    And STDOUT should be empty
    And the return code should be 1

    When I run `wp plugin update --all --format=summary | grep 'updated successfully from'`
    Then STDOUT should contain:
      """
      WordPress Importer updated successfully from version 0.5 to version
      """

    When I try `wp plugin update xxx yyy`
    Then STDERR should contain:
      """
      Warning: The 'xxx' plugin could not be found.
      """
    And STDERR should contain:
      """
      Warning: The 'yyy' plugin could not be found.
      """
    And STDERR should contain:
      """
      Error: No plugins updated (2 failed).
      """
    And the return code should be 1

    When I run `wp plugin install wordpress-importer --version=0.5 --force`
    Then STDOUT should not be empty

    When I try `wp plugin update xxx wordpress-importer yyy`
    Then STDERR should contain:
      """
      Warning: The 'xxx' plugin could not be found.
      """
    And STDERR should contain:
      """
      Warning: The 'yyy' plugin could not be found.
      """
    And STDERR should contain:
      """
      Error: Only updated 1 of 3 plugins (2 failed).
      """
    And the return code should be 1

  Scenario: Activate a network-only plugin on single site
    Given a WP install
    And a wp-content/plugins/network-only.php file:
      """
      <?php
      // Plugin Name: Example Plugin
      // Network: true
      """

    When I run `wp plugin activate network-only`
    Then STDOUT should be:
      """
      Plugin 'network-only' activated.
      Success: Activated 1 of 1 plugins.
      """

    When I run `wp plugin status network-only`
    Then STDOUT should contain:
      """
          Status: Active
      """

  Scenario: Activate a network-only plugin on multisite
    Given a WP multisite install
    And a wp-content/plugins/network-only.php file:
      """
      <?php
      // Plugin Name: Example Plugin
      // Network: true
      """

    When I run `wp plugin activate network-only`
    Then STDOUT should be:
      """
      Plugin 'network-only' network activated.
      Success: Activated 1 of 1 plugins.
      """

    When I run `wp plugin status network-only`
    Then STDOUT should contain:
      """
          Status: Network Active
      """

  Scenario: Network activate a plugin
    Given a WP multisite install

    When I run `wp plugin activate akismet`
    Then STDOUT should be:
      """
      Plugin 'akismet' activated.
      Success: Activated 1 of 1 plugins.
      """

    When I run `wp plugin list --fields=name,status,file`
    Then STDOUT should be a table containing rows:
      | name            | status           | file                |
      | akismet         | active           | akismet/akismet.php |

    When I try `wp plugin activate akismet`
    Then STDERR should contain:
      """
      Warning: Plugin 'akismet' is already active.
      """
    And STDOUT should be:
      """
      Success: Plugin already activated.
      """
    And the return code should be 0

    When I run `wp plugin activate akismet --network`
    Then STDOUT should be:
      """
      Plugin 'akismet' network activated.
      Success: Network activated 1 of 1 plugins.
      """

    When I try `wp plugin activate akismet --network`
    Then STDERR should be:
      """
      Warning: Plugin 'akismet' is already network active.
      """
    And STDOUT should be:
      """
      Success: Plugin already network activated.
      """
    And the return code should be 0

    When I try `wp plugin deactivate akismet`
    Then STDERR should be:
      """
      Warning: Plugin 'akismet' is network active and must be deactivated with --network flag.
      Error: No plugins deactivated.
      """
    And STDOUT should be empty
    And the return code should be 1

    When I run `wp plugin deactivate akismet --network`
    Then STDOUT should be:
      """
      Plugin 'akismet' network deactivated.
      Success: Network deactivated 1 of 1 plugins.
      """
    And the return code should be 0

    When I try `wp plugin deactivate akismet`
    Then STDERR should be:
      """
      Warning: Plugin 'akismet' isn't active.
      """
    And STDOUT should be:
      """
      Success: Plugin already deactivated.
      """
    And the return code should be 0

  Scenario: List plugins
    Given a WP install

    When I run `wp plugin activate akismet hello`
    Then STDOUT should not be empty

    When I run `wp plugin list --status=inactive --field=name`
    Then STDOUT should be empty

    When I run `wp plugin list --status=active --fields=name,status,file`
    Then STDOUT should be a table containing rows:
      | name       | status   | file                |
      | akismet    | active   | akismet/akismet.php |

    When I run `wp plugin list --status=active --field=author`
    Then STDOUT should contain:
      """
      Automattic
      """

    When I run `wp eval 'echo get_site_transient("update_plugins")->last_checked;'`
    Then save STDOUT as {LAST_UPDATED}

    When I run `wp plugin list --skip-update-check`
    Then STDOUT should not be empty

    When I run `wp eval 'echo get_site_transient("update_plugins")->last_checked;'`
    Then STDOUT should be:
      """
      {LAST_UPDATED}
      """

    When I run `wp plugin list`
    Then STDOUT should not be empty

    When I run `wp eval 'echo get_site_transient("update_plugins")->last_checked;'`
    Then STDOUT should not contain:
      """
      {LAST_UPDATED}
      """

  Scenario: List plugin by multiple statuses
    Given a WP multisite install
    And a wp-content/plugins/network-only.php file:
      """
      <?php
      // Plugin Name: Example Plugin
      // Network: true
      """

    When I run `wp plugin activate akismet hello`
    Then STDOUT should not be empty

    When I run `wp plugin install wordpress-importer --ignore-requirements`
    Then STDOUT should not be empty

    When I run `wp plugin activate network-only`
    Then STDOUT should not be empty

    When I run `wp plugin list --status=active-network,inactive --fields=name,status,file`
    Then STDOUT should be a table containing rows:
      | name               | status         | file                                      |
      | network-only       | active-network | network-only.php                          |
      | wordpress-importer | inactive       | wordpress-importer/wordpress-importer.php |

    When I run `wp plugin list --status=active,inactive --fields=name,status,file`
    Then STDOUT should be a table containing rows:
      | name               | status   | file                                      |
      | akismet            | active   | akismet/akismet.php                       |
      | wordpress-importer | inactive | wordpress-importer/wordpress-importer.php |

  @require-wp-5.2
  Scenario: Flag `--skip-update-check` skips update check when running `wp plugin list`
    Given a WP install

    When I run `wp plugin install wordpress-importer --version=0.2`
    Then STDOUT should contain:
      """
      Plugin installed successfully.
      """

    When I run `wp plugin list --fields=name,status,update --status=inactive`
    Then STDOUT should be a table containing rows:
      | name               | status   | update    |
      | wordpress-importer | inactive | available |

    When I run `wp transient delete update_plugins --network`
    Then STDOUT should be:
      """
      Success: Transient deleted.
      """

    When I run `wp plugin list --fields=name,status,update --status=inactive --skip-update-check`
    Then STDOUT should be a table containing rows:
      | name               | status   | update   |
      | wordpress-importer | inactive | none     |

  # WordPress Importer requires WP 5.2.
  @require-wp-5.2
  Scenario: Install a plugin when directory doesn't yet exist
    Given a WP install

    When I run `rm -rf wp-content/plugins`
    And I run `if test -d wp-content/plugins; then echo "fail"; fi`
    Then STDOUT should be empty

    When I run `wp plugin install wordpress-importer --activate`
    Then STDOUT should not be empty

    When I run `wp plugin list --status=active --fields=name,status,file`
    Then STDOUT should be a table containing rows:
      | name               | status   | file                                      |
      | wordpress-importer | active   | wordpress-importer/wordpress-importer.php |

  Scenario: Plugin name with HTML entities
    Given a WP install

    When I run `wp plugin install debug-bar-list-dependencies`
    Then STDOUT should contain:
      """
      Installing Debug Bar List Script & Style Dependencies
      """

  # Not running for SQLite because it involves another must-use plugin and a drop-in.
  @require-mysql
  Scenario: Enable and disable all plugins
    Given a WP install

    When I run `wp plugin activate --all`
    Then STDOUT should contain:
      """
      Plugin 'akismet' activated.
      Plugin 'hello' activated.
      Success: Activated 2 of 2 plugins.
      """

    When I run `wp plugin activate --all`
    Then STDOUT should be:
      """
      Success: Plugins already activated.
      """

    When I run `wp plugin list --field=status`
    Then STDOUT should be:
      """
      active
      active
      must-use
      must-use
      """

    When I run `wp plugin deactivate --all`
    Then STDOUT should be:
      """
      Plugin 'akismet' deactivated.
      Plugin 'hello' deactivated.
      Success: Deactivated 2 of 2 plugins.
      """

    When I run `wp plugin deactivate --all`
    Then STDOUT should be:
      """
      Success: Plugins already deactivated.
      """

    When I run `wp plugin list --field=status`
    Then STDOUT should be:
      """
      inactive
      inactive
      must-use
      must-use
      """

  # WordPress Importer requires WP 5.2.
  @require-wp-5.2
  Scenario: Deactivate and uninstall a plugin, part one
    Given a WP install
    And these installed and active plugins:
      """
      wordpress-importer
      """

    When I run `wp plugin deactivate wordpress-importer --uninstall`
    Then STDOUT should be:
      """
      Plugin 'wordpress-importer' deactivated.
      Uninstalling 'wordpress-importer'...
      Uninstalled and deleted 'wordpress-importer' plugin.
      Success: Deactivated 1 of 1 plugins.
      """

    When I try `wp plugin get wordpress-importer`
    Then STDERR should be:
      """
      Error: The 'wordpress-importer' plugin could not be found.
      """
    And STDOUT should be empty
    And the return code should be 1

  # WordPress Importer requires WP 5.2.
  @require-wp-5.2
  Scenario: Deactivate and uninstall a plugin, part two
    Given a WP install
    And these installed and active plugins:
      """
      wordpress-importer
      """

    When I run `wp plugin uninstall wordpress-importer --deactivate`
    Then STDOUT should be:
      """
      Deactivating 'wordpress-importer'...
      Plugin 'wordpress-importer' deactivated.
      Uninstalled and deleted 'wordpress-importer' plugin.
      Success: Uninstalled 1 of 1 plugins.
      """

    When I try `wp plugin get wordpress-importer`
    Then STDERR should be:
      """
      Error: The 'wordpress-importer' plugin could not be found.
      """
    And STDOUT should be empty
    And the return code should be 1

  Scenario: Uninstall a plugin without deleting
    Given a WP install

    When I run `wp plugin install akismet --version=2.5.7 --force`
    Then STDOUT should not be empty

    When I run `wp plugin uninstall akismet --skip-delete`
    Then STDOUT should be:
      """
      Ran uninstall procedure for 'akismet' plugin without deleting.
      Success: Uninstalled 1 of 1 plugins.
      """

  Scenario: Two plugins, one directory
    Given a WP install
    And a wp-content/plugins/handbook/handbook.php file:
      """
      <?php
      /**
       * Plugin Name: Handbook
       * Description: Features for a handbook, complete with glossary and table of contents
       * Author: Nacin
       */
      """
    And a wp-content/plugins/handbook/functionality-for-pages.php file:
      """
      <?php
      /**
       * Plugin Name: Handbook Functionality for Pages
       * Description: Adds handbook-like table of contents to all Pages for a site. Covers Table of Contents and the "watch this page" widget
       * Author: Nacin
       */
      """

    When I run `wp plugin list --fields=name,status,file`
    Then STDOUT should be a table containing rows:
      | name                             | status   | file                                 |
      | handbook/handbook                | inactive | handbook/handbook.php                |
      | handbook/functionality-for-pages | inactive | handbook/functionality-for-pages.php |

    When I run `wp plugin activate handbook/functionality-for-pages`
    Then STDOUT should not be empty

    When I run `wp plugin list --fields=name,status,file`
    Then STDOUT should be a table containing rows:
      | name                             | status   | file                                 |
      | handbook/handbook                | inactive | handbook/handbook.php                |
      | handbook/functionality-for-pages | active   | handbook/functionality-for-pages.php |

  Scenario: Install a plugin, then update to a specific version of that plugin
    Given a WP install

    When I run `wp plugin install akismet --version=2.5.7 --force`
    Then STDOUT should not be empty

    When I run `wp plugin update akismet --version=2.6.0`
    Then STDOUT should not be empty

    When I run `wp plugin list --fields=name,version,file`
    Then STDOUT should be a table containing rows:
      | name       | version   | file                |
      | akismet    | 2.6.0     | akismet/akismet.php |

  Scenario: Ignore empty slugs
    Given a WP install

    When I try `wp plugin install ''`
    Then STDERR should contain:
      """
      Warning: Ignoring ambiguous empty slug value.
      """
    And STDOUT should not contain:
      """
      Plugin installed successfully
      """
    And the return code should be 0

  # Akismet currently requires WordPress 5.8, so there's a warning because of it.
  @require-wp-5.8
  Scenario: Plugin hidden by "all_plugins" filter
    Given a WP install
    And these installed and active plugins:
      """
      hello-dolly
      site-secrets
      """
    And a wp-content/mu-plugins/hide-us-plugin.php file:
      """
      <?php
      /**
       * Plugin Name: Hide Site Secrets on Production
       * Description: Hides the Site Secrets plugin on production sites
       * Author: WP-CLI tests
       */

       add_filter( 'all_plugins', function( $all_plugins ) {
          unset( $all_plugins['site-secrets/site-secrets.php'] );
          return $all_plugins;
       } );
      """

    When I run `wp plugin list --fields=name`
    Then STDOUT should not contain:
      """
      site-secrets
      """

  Scenario: Show dropins plugin list
    Given a WP install
    And a wp-content/db-error.php file:
      """
      <?php
      """

    When I run `wp plugin list --status=active`
    Then STDOUT should not contain:
      """
      db-error.php
      """

    When I run `wp plugin list --status=dropin --fields=name,title,description,file`
    Then STDOUT should be a table containing rows:
      | name         | title | description                    | file         |
      | db-error.php |       | Custom database error message. | db-error.php |

  @require-wp-4.0
  Scenario: Validate installed plugin's version.
    Given a WP installation
    And I run `wp plugin uninstall --all`
    And I run `wp plugin install hello-dolly`
    And a wp-content/mu-plugins/test-plugin-update.php file:
      """
      <?php
      /**
       * Plugin Name: Test Plugin Update
       * Description: Fakes installed plugin's data to verify plugin version mismatch
       * Author: WP-CLI tests
       */

      add_filter( 'site_transient_update_plugins', function( $value ) {
          if ( ! is_object( $value ) ) {
              return $value;
          }

          unset( $value->response['hello-dolly/hello.php'] );
          $value->no_update['hello-dolly/hello.php']->new_version = '1.5';

          return $value;
      } );
      ?>
      """

    When I run `wp plugin list --name=hello-dolly  --field=version`
    Then save STDOUT as {PLUGIN_VERSION}

    When I run `wp plugin list --name=hello-dolly  --field=update_version`
    Then save STDOUT as {UPDATE_VERSION}

    When I run `wp plugin list`
    Then STDOUT should be a table containing rows:
      | name               | status   | update                       | version          | update_version   | auto_update |
      | hello-dolly        | inactive | version higher than expected | {PLUGIN_VERSION} | {UPDATE_VERSION} | off         |

    When I try `wp plugin update --all`
    Then STDERR should be:
      """
      Warning: hello-dolly: version higher than expected.
      Error: No plugins updated.
      """

    When I try `wp plugin update hello-dolly`
    Then STDERR should be:
      """
      Warning: hello-dolly: version higher than expected.
      Error: No plugins updated.
      """

  Scenario: Only valid status filters are accepted when listing plugins
    Given a WP install

    When I run `wp plugin list`
    Then STDERR should be empty

    When I run `wp plugin list --status=active`
    Then STDERR should be empty

    When I try `wp plugin list --status=invalid-status`
    Then STDERR should be:
      """
      Error: Parameter errors:
       Invalid value specified for 'status' (Filter the output by plugin status.)
      """

  Scenario: Listing mu-plugins should include name and title
    Given a WP install
    And a wp-content/mu-plugins/test-mu.php file:
      """
      <?php
      // Plugin Name: Test mu-plugin
      // Description: Test mu-plugin description
      """

    When I run `wp plugin list --fields=name,title`
    Then STDOUT should be a table containing rows:
      | name              | title                   |
      | test-mu           | Test mu-plugin       |

    When I run `wp plugin list --fields=name,title,description`
    Then STDOUT should be a table containing rows:
      | name    | title             | description                                    |
      | test-mu | Test mu-plugin    | Test mu-plugin description                     |

  @require-wp-5.5
  Scenario: Listing plugins should include name and auto_update
    Given a WP install
    When I run `wp plugin list --fields=name,auto_update`
    Then STDOUT should be a table containing rows:
      | name              | auto_update          |
      | hello             | off                  |

    When I run `wp plugin auto-updates enable hello`
    And I try `wp plugin list --fields=name,auto_update`
    Then STDOUT should be a table containing rows:
      | name              | auto_update          |
      | hello             | on                   |

  Scenario: Listing plugins should include tested_up_to from the 'tested up to' header
    Given a WP install
    And a wp-content/plugins/foo/foo.php file:
      """
      <?php
      /**
       * Plugin Name: Foo
       * Description: A plugin for foo
       * Author: Matt
       */
      """
    And a wp-content/plugins/foo/readme.txt file:
      """
      === Foo ===
      Contributors: matt
      Donate link: https://example.com/
      Tags: tag1, tag2
      Requires at least: 4.7
      Tested up to: 3.4
      Stable tag: 4.3
      Requires PHP: 7.0
      License: GPLv2 or later
      License URI: https://www.gnu.org/licenses/gpl-2.0.html
      """
    And I run `wp plugin activate foo`

    When I run `wp plugin list --fields=name,status,update,version,update_version,auto_update`
    Then STDOUT should be a table containing rows:
      | name       | status   | update  | version  | update_version | auto_update |
      | foo        | active   | none    |          |                | off         |

    When I run `wp plugin list --fields=name,tested_up_to`
    Then STDOUT should be a table containing rows:
      | name            | tested_up_to     |
      | foo             | 3.4              |

    When I run `wp plugin list --name=foo --field=tested_up_to`
    Then STDOUT should be:
      """
      3.4
      """

  Scenario: Listing plugins should include tested_up_to from the 'tested' header
    Given a WP install
    And a wp-content/plugins/foo/foo.php file:
      """
      <?php
      /**
       * Plugin Name: Foo
       * Description: A plugin for foo
       * Author: Matt
       */
      """
    And a wp-content/plugins/foo/readme.txt file:
      """
      === Foo ===
      Tested: 5.5
      Contributors: matt
      Donate link: https://example.com/
      Tags: tag1, tag2
      Requires at least: 4.7
      Stable tag: 4.3
      Requires PHP: 7.0
      License: GPLv2 or later
      License URI: https://www.gnu.org/licenses/gpl-2.0.html
      """
    And I run `wp plugin activate foo`

    When I run `wp plugin list --fields=name,status,update,version,update_version,auto_update`
    Then STDOUT should be a table containing rows:
      | name       | status   | update  | version  | update_version | auto_update |
      | foo        | active   | none    |          |                | off         |

    When I run `wp plugin list --fields=name,tested_up_to`
    Then STDOUT should be a table containing rows:
      | name            | tested_up_to     |
      | foo             | 5.5              |

    When I run `wp plugin list --name=foo --field=tested_up_to`
    Then STDOUT should be:
      """
      5.5
      """

  @require-wp-4.0
  Scenario: Show plugin update as unavailable if it doesn't meet WordPress requirements
    Given a WP install
    And a wp-content/plugins/example/example.php file:
      """
      <?php
        /**
        * Plugin Name: Example Plugin
        * Version: 1.0.0
        * Requires at least: 3.7
        * Tested up to: 6.7
      """
    And that HTTP requests to https://api.wordpress.org/plugins/update-check/1.1/ will respond with:
      """
      HTTP/1.1 200 OK

      {
        "plugins": [],
        "translations": [],
        "no_update": {
          "example/example.php": {
            "id": "w.org/plugins/example",
            "slug": "example",
            "plugin": "example/example.php",
            "new_version": "2.0.0",

            "requires": "100",
            "requires_php": "7.2",
            "requires_plugins": [],
            "compatibility": []
          }
        }
      }
      """

    When I run `wp plugin list`
    Then STDOUT should be a table containing rows:
      | name            | status   | update       | version  | update_version   | auto_update | requires   | requires_php   |
      | example         | inactive | unavailable  | 1.0.0    | 2.0.0            | off         | 100        | 7.2            |

    When I try `wp plugin update example`
    Then STDERR should contain:
      """
      Warning: example: This update requires WordPress version 100
      """

  @require-wp-4.0
  Scenario: Show plugin update as unavailable if it doesn't meet PHP requirements
    Given a WP install
    And a wp-content/plugins/example/example.php file:
      """
      <?php
        /**
        * Plugin Name: Example Plugin
        * Version: 1.0.0
        * Requires at least: 3.7
        * Tested up to: 6.7
      """
    And that HTTP requests to https://api.wordpress.org/plugins/update-check/1.1/ will respond with:
      """
      HTTP/1.1 200 OK

      {
        "plugins": {
          "example/example.php": {
            "id": "w.org/plugins/example",
            "slug": "example",
            "plugin": "example/example.php",
            "new_version": "2.0.0",
            "requires": "3.7",
            "tested": "6.6",
            "requires_php": "100",
            "requires_plugins": [],
            "compatibility": []
        }
      },
        "translations": [],
        "no_update": []
      }
      """

    When I run `wp plugin list`
    Then STDOUT should be a table containing rows:
      | name            | status   | update       | version  | update_version   | auto_update | requires   | requires_php   |
      | example         | inactive | unavailable  | 1.0.0    | 2.0.0            | off         | 3.7        | 100            |

    When I try `wp plugin update example`
    Then STDERR should contain:
      """
      Warning: example: This update requires PHP version 100
      """
b IDATxytVսϓ22 A@IR :hCiZ[v*E:WũZA ^dQeQ @ !jZ'>gsV仿$|?g)&x-EIENT ;@xT.i%-X}SvS5.r/UHz^_$-W"w)Ɗ/@Z &IoX P$K}JzX:;` &, ŋui,e6mX ԵrKb1ԗ)DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA݀!I*]R;I2$eZ#ORZSrr6mteffu*((Pu'v{DIߔ4^pIm'77WEEE;vƎ4-$]'RI{\I&G :IHJ DWBB=\WR޽m o$K(V9ABB.}jѢv`^?IOȅ} ڶmG}T#FJ`56$-ھ}FI&v;0(h;Б38CӧOWf!;A i:F_m9s&|q%=#wZprrrla A &P\\СC[A#! {olF} `E2}MK/vV)i{4BffV\|ۭX`b@kɶ@%i$K z5zhmX[IXZ` 'b%$r5M4º/l ԃߖxhʔ)[@=} K6IM}^5k㏷݆z ΗÿO:gdGBmyT/@+Vɶ纽z񕏵l.y޴it뭷zV0[Y^>Wsqs}\/@$(T7f.InݺiR$푔n.~?H))\ZRW'Mo~v Ov6oԃxz! S,&xm/yɞԟ?'uaSѽb,8GלKboi&3t7Y,)JJ c[nzӳdE&KsZLӄ I?@&%ӟ۶mSMMњ0iؐSZ,|J+N ~,0A0!5%Q-YQQa3}$_vVrf9f?S8`zDADADADADADADADADAdqP,تmMmg1V?rSI꒟]u|l RCyEf٢9 jURbztѰ!m5~tGj2DhG*{H9)꒟ר3:(+3\?/;TUݭʴ~S6lڧUJ*i$d(#=Yݺd{,p|3B))q:vN0Y.jkק6;SɶVzHJJЀ-utѹսk>QUU\޲~]fFnK?&ߡ5b=z9)^|u_k-[y%ZNU6 7Mi:]ۦtk[n X(e6Bb."8cۭ|~teuuw|ήI-5"~Uk;ZicEmN/:]M> cQ^uiƞ??Ңpc#TUU3UakNwA`:Y_V-8.KKfRitv޲* 9S6ֿj,ՃNOMߤ]z^fOh|<>@Å5 _/Iu?{SY4hK/2]4%it5q]GGe2%iR| W&f*^]??vq[LgE_3f}Fxu~}qd-ږFxu~I N>\;͗O֊:̗WJ@BhW=y|GgwܷH_NY?)Tdi'?խwhlmQi !SUUsw4kӺe4rfxu-[nHtMFj}H_u~w>)oV}(T'ebʒv3_[+vn@Ȭ\S}ot}w=kHFnxg S 0eޢm~l}uqZfFoZuuEg `zt~? b;t%>WTkķh[2eG8LIWx,^\thrl^Ϊ{=dž<}qV@ ⠨Wy^LF_>0UkDuʫuCs$)Iv:IK;6ֲ4{^6եm+l3>݆uM 9u?>Zc }g~qhKwڭeFMM~pМuqǿz6Tb@8@Y|jx](^]gf}M"tG -w.@vOqh~/HII`S[l.6nØXL9vUcOoB\xoǤ'T&IǍQw_wpv[kmO{w~>#=P1Pɞa-we:iǏlHo׈꒟f9SzH?+shk%Fs:qVhqY`jvO'ρ?PyX3lх]˾uV{ݞ]1,MzYNW~̈́ joYn}ȚF߾׮mS]F z+EDxm/d{F{-W-4wY듏:??_gPf ^3ecg ҵs8R2מz@TANGj)}CNi/R~}c:5{!ZHӋӾ6}T]G]7W6^n 9*,YqOZj:P?Q DFL|?-^.Ɵ7}fFh׶xe2Pscz1&5\cn[=Vn[ĶE鎀uˌd3GII k;lNmشOuuRVfBE]ۣeӶu :X-[(er4~LHi6:Ѻ@ԅrST0trk%$Č0ez" *z"T/X9|8.C5Feg}CQ%͞ˣJvL/?j^h&9xF`њZ(&yF&Iݻfg#W;3^{Wo^4'vV[[K';+mӍִ]AC@W?1^{එyh +^]fm~iԵ]AB@WTk̏t uR?l.OIHiYyԶ]Aˀ7c:q}ힽaf6Z~қm(+sK4{^6}T*UUu]n.:kx{:2 _m=sAߤU@?Z-Vކеz왍Nэ{|5 pڶn b p-@sPg]0G7fy-M{GCF'%{4`=$-Ge\ eU:m+Zt'WjO!OAF@ik&t݆ϥ_ e}=]"Wz_.͜E3leWFih|t-wZۍ-uw=6YN{6|} |*={Ѽn.S.z1zjۻTH]흾 DuDvmvK.`V]yY~sI@t?/ϓ. m&["+P?MzovVЫG3-GRR[(!!\_,^%?v@ҵő m`Y)tem8GMx.))A]Y i`ViW`?^~!S#^+ѽGZj?Vģ0.))A꨷lzL*]OXrY`DBBLOj{-MH'ii-ϰ ok7^ )쭡b]UXSְmռY|5*cֽk0B7镹%ڽP#8nȎq}mJr23_>lE5$iwui+ H~F`IjƵ@q \ @#qG0".0" l`„.0! ,AQHN6qzkKJ#o;`Xv2>,tێJJ7Z/*A .@fفjMzkg @TvZH3Zxu6Ra'%O?/dQ5xYkU]Rֽkق@DaS^RSּ5|BeHNN͘p HvcYcC5:y #`οb;z2.!kr}gUWkyZn=f Pvsn3p~;4p˚=ē~NmI] ¾ 0lH[_L hsh_ғߤc_њec)g7VIZ5yrgk̞W#IjӪv>՞y睝M8[|]\շ8M6%|@PZڨI-m>=k='aiRo-x?>Q.}`Ȏ:Wsmu u > .@,&;+!!˱tﭧDQwRW\vF\~Q7>spYw$%A~;~}6¾ g&if_=j,v+UL1(tWake:@Ș>j$Gq2t7S?vL|]u/ .(0E6Mk6hiۺzښOrifޱxm/Gx> Lal%%~{lBsR4*}{0Z/tNIɚpV^#Lf:u@k#RSu =S^ZyuR/.@n&΃z~B=0eg뺆#,Þ[B/?H uUf7y Wy}Bwegל`Wh(||`l`.;Ws?V@"c:iɍL֯PGv6zctM̠':wuW;d=;EveD}9J@B(0iհ bvP1{\P&G7D޴Iy_$-Qjm~Yrr&]CDv%bh|Yzni_ˆR;kg}nJOIIwyuL}{ЌNj}:+3Y?:WJ/N+Rzd=hb;dj͒suݔ@NKMԄ jqzC5@y°hL m;*5ezᕏ=ep XL n?מ:r`۵tŤZ|1v`V뽧_csج'ߤ%oTuumk%%%h)uy]Nk[n 'b2 l.=͜E%gf$[c;s:V-͞WߤWh-j7]4=F-X]>ZLSi[Y*We;Zan(ӇW|e(HNNP5[= r4tP &0<pc#`vTNV GFqvTi*Tyam$ߏWyE*VJKMTfFw>'$-ؽ.Ho.8c"@DADADADADADADADADA~j*֘,N;Pi3599h=goضLgiJ5փy~}&Zd9p֚ e:|hL``b/d9p? fgg+%%hMgXosج, ΩOl0Zh=xdjLmhݻoO[g_l,8a]٭+ӧ0$I]c]:粹:Teꢢ"5a^Kgh,&= =՟^߶“ߢE ܹS J}I%:8 IDAT~,9/ʃPW'Mo}zNƍ쨓zPbNZ~^z=4mswg;5 Y~SVMRXUյڱRf?s:w ;6H:ºi5-maM&O3;1IKeamZh͛7+##v+c ~u~ca]GnF'ټL~PPPbn voC4R,ӟgg %hq}@#M4IÇ Oy^xMZx ) yOw@HkN˖-Sǎmb]X@n+i͖!++K3gd\$mt$^YfJ\8PRF)77Wא!Cl$i:@@_oG I{$# 8磌ŋ91A (Im7֭>}ߴJq7ޗt^ -[ԩSj*}%]&' -ɓ'ꫯVzzvB#;a 7@GxI{j޼ƌ.LÇWBB7`O"I$/@R @eee@۷>}0,ɒ2$53Xs|cS~rpTYYY} kHc %&k.], @ADADADADADADADADA@lT<%''*Lo^={رc5h %$+CnܸQ3fҥK}vUVVs9G R,_{xˇ3o߾;TTTd}馛]uuuG~iԩ@4bnvmvfϞ /Peeeq}}za I~,誫{UWW뮻}_~YƍSMMMYχ֝waw\ďcxꩧtEƍկ_?۷5@u?1kNׯWzz/wy>}zj3 k(ٺuq_Zvf̘:~ ABQ&r|!%KҥKgԞ={<_X-z !CyFUUz~ ABQIIIjݺW$UXXDٳZ~ ABQƍecW$<(~<RSSvZujjjԧOZQu@4 8m&&&jԩg$ď1h ͟?_{768@g =@`)))5o6m3)ѣƌJ;wҿUTT /KZR{~a=@0o<*狔iFɶ[ˎ;T]]OX@?K.ۈxN pppppppppppppppppPfl߾] ,{ァk۶mڿo5BTӦMӴiӴ|r DB2e|An!Dy'tkΝ[A $***t5' "!駟oaDnΝ:t֭[gDШQ06qD;@ x M6v(PiizmZ4ew"@̴ixf [~-Fٱc&IZ2|n!?$@{[HTɏ#@hȎI# _m(F /6Z3z'\r,r!;w2Z3j=~GY7"I$iI.p_"?pN`y DD?: _  Gÿab7J !Bx@0 Bo cG@`1C[@0G @`0C_u V1 aCX>W ` | `!<S `"<. `#c`?cAC4 ?c p#~@0?:08&_MQ1J h#?/`7;I  q 7a wQ A 1 Hp !#<8/#@1Ul7=S=K.4Z?E_$i@!1!E4?`P_  @Bă10#: "aU,xbFY1 [n|n #'vEH:`xb #vD4Y hi.i&EΖv#O H4IŶ}:Ikh @tZRF#(tXҙzZ ?I3l7q@õ|ۍ1,GpuY Ꮿ@hJv#xxk$ v#9 5 }_$c S#=+"K{F*m7`#%H:NRSp6I?sIՖ{Ap$I$I:QRv2$Z @UJ*$]<FO4IENDB`