Tester correctement la désinstallation d´un plugin

ParJohan Maïa

Tester correctement la désinstallation d´un plugin

Installation/Désinstallation d´un plugin dans WP-Browser

Dans le projet wp-browser (version 06/06/2018),  il est possible de tester directement via la configuration une installation et désinstallation d´un plugin. Par défaut, on retrouve un exemple dans muloader.suite.dist.yml

config:
    WPLoader:
        ...
        plugins: ['mu-plugin-1/plugin.php']
        activatePlugins: ['mu-plugin-1/plugin.php']

Pour tester votre propre plugin, il suffit de :

  1. placer votre plugin (dézippé, pas le zip) dans tests/_data/plugins
  2. dans acceptance.suite.dist.yml, ajouter ceci :
    config: 
        WPLoader: ... 
            plugins: ['mon-plugin/MonPlugin.php'] 
            activatePlugins: ['mon-plugin/MonPlugin.php']

    mon-plugin est le nom du dossier du plugin et MonPlugin.php est la classe d´entrée pour le plugin.

Avec ceci, au lancement de la commande codecept run acceptance, avant les tests, Codeception viendra placer les fichiers du plugin dans le dossier wp-content/plugins du wordpress de test et à la fin des tests, il supprimera les fichiers du plugin.

Une désinstallation incomplète via WP-Browser version 06/06/2018

Le problème, étant que la désinstallation ne consiste pas à cliquer sur le lien « supprimer » pour le plugin, mais elle ne fait que supprimer les fichiers. Ce qui peut-être gênant lorsque dans votre plugin, à la désinstallation, la fonction vient supprimer des tables dans la base de données par exemple. En effet, les tables resteront après le lancement des tests.

La solution proposée

Pour que la suppression du plugin se fasse comme si un administrateur WordPress le ferait, il faut donc simuler le clique sur le lien « supprimer » dans la page des plugins.

Si vous mettez à jour wp-browser, vous devrez refaire ces étapes. C´est une solution provisoire.

Donc…

Étape 1 : création de la méthode « deletePlugin ».

Pour cela, on va se baser sur la méthode « deactivatePlugin » se trouvant dans AcceptanceTesterActions.php pour créer une méthode « deletePlugin » que l´on ajoutera dans cette classe (AcceptanceTesterActions).

AcceptanceTesterActions.php

/**
 * [!] Method is generated. Documentation taken from corresponding module.
 *
 * In the plugin administration screen delete a plugin clicking the "Delete" link.
 *
 * The method will presume the browser is in the plugin screen already.
 *
 * @author Hive 4 Apps
 *
 * @param  string|array $pluginSlug The plugin slug, like "hello-dolly" or a list of plugin slugs.
 *
 * @return void
 * @see \Codeception\Module\WPWebDriver::deletePlugin()
 */
public function deletePlugin($pluginSlug) {
    return $this->getScenario()->runStep(new \Codeception\Step\Action('deletePlugin', func_get_args()));
}

Maintenant on voit, que cette méthode appelle une autre méthode « deletePlugin » qui cette fois-ci doit se trouver dans la classe WPBrowserMethods.php

WPBrowserMethods.php

/**
 * In the plugin administration screen delete a plugin clicking the "Delete" link.
 *
 * The method will presume the browser is in the plugin screen already.
 *
 * @author Hive 4 Apps
 *
 * @param  string|array $pluginSlug The plugin slug, like "hello-dolly" or a list of plugin slugs.
 *
 * @return void
 */
public function deletePlugin($pluginSlug)
{
    $plugins = (array) $pluginSlug;
    foreach ($plugins as $plugin) {
        $option = '//*[@data-slug="' . $plugin . '"]/th/input';
        $this->scrollTo($option, 0, -40);
        $this->checkOption($option);
    }
    $this->scrollTo('select[name="action"]', 0, -40);
    $this->selectOption('action', 'delete-selected');
    $this->click("#doaction");

}

Cette méthode va ajouter le comportement de l´administrateur.

Étape 2 : Ajouter l´action dans notre scénario.

Méthode il est temps de tester notre méthode dans le scénario de test.

MonAcceptanceTestCest.php

   class MonAcceptanceTestCest
   {
      public $plugin_dir_name = 'my-plugin';
      public function it_should_activate_delete_correctly_plugin(AcceptanceTester $I )
      {
        //Install/Activation
        $I->loginAsAdmin();
        $I->amOnPluginsPage();
        $I->activatePlugin($this->plugin_dir_name);
        $I->seePluginActivated($this->plugin_dir_name);
        $I->dontSeeElement('.xdebug-error');

        //Deactivation
        $I->deactivatePlugin($this->plugin_dir_name);
        $I->seePluginDeactivated($this->plugin_dir_name);
       //Delete 
       $I->deletePlugin( $this->plugin_dir_name );
       $I->acceptPopup();
    }
  }

Dans WordPress, pour supprimer un plugin, il faut valider une alerte javascript donc nous sommes obliger pour que tout fonctionne d´ajouter $I->acceptPopup();. Cette méthode ne fonctionne pas avec PhantomJS puisque qu´elle est compatible uniquement si il y a un affichage.

Étape 3 : Désactiver la suppression des fichiers de plugin à la fin du test

En effet, si vous lancez à ce niveau le test, vous obtiendrez sans doute une erreur.

Je vous conseille donc de commenter dans WPFilesystem.php la fonction _after() qui gère la suppression des fichiers du plugin automatiquement. Comme ils sont déjà supprimés, c´est inutile.

Et normalement, tout devrait fonctionner !

 

À propos de l’auteur

Johan Maïa administrator

Laisser un commentaire