Ejegg has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/311174

Change subject: Add tests for thank you unsubscribe
......................................................................

Add tests for thank you unsubscribe

Move queue instantiation into a helper class so tests see the same
instance. Add a hooks class to require composer autoload regardless
of entry point.

Bug: T145419
Change-Id: I1c357794fc857c3ee32ba1e4c1c61f6c44aa8c39
---
A FundraisingEmailUnsubscribeHooks.php
M SpecialFundraiserUnsubscribe.php
M extension.json
A includes/FundraiserEmailQueue.php
M methods/FundraiserUnsubscribeThankYou.php
A tests/phpunit/UnsubscribeThankYouTest.php
6 files changed, 102 insertions(+), 15 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/FundraisingEmailUnsubscribe
 refs/changes/74/311174/1

diff --git a/FundraisingEmailUnsubscribeHooks.php 
b/FundraisingEmailUnsubscribeHooks.php
new file mode 100644
index 0000000..ee1d6bc
--- /dev/null
+++ b/FundraisingEmailUnsubscribeHooks.php
@@ -0,0 +1,9 @@
+<?php
+
+class FundraisingEmailUnsubscribeHooks {
+
+       public static function onRegistration() {
+               require_once( __DIR__ . '/vendor/autoload.php' );
+       }
+
+}
diff --git a/SpecialFundraiserUnsubscribe.php b/SpecialFundraiserUnsubscribe.php
index 7ad4f1d..221c152 100644
--- a/SpecialFundraiserUnsubscribe.php
+++ b/SpecialFundraiserUnsubscribe.php
@@ -68,9 +68,6 @@
                global $wgFundraisingEmailUnsubscribeHelpEmail;
 
                $templateDir = __DIR__ . '/templates';
-
-               require_once( __DIR__ . '/vendor/autoload.php' );
-
                // Initiate logging. Although we generate the ID every time, we 
will reset to a stashed ID
                // in loadSessionData() if it exists.
                Logger::setBucket( 'FundraisingEmailUnsubscribe' );
diff --git a/extension.json b/extension.json
index a1b939b..9049e88 100644
--- a/extension.json
+++ b/extension.json
@@ -7,6 +7,7 @@
        "url": "https://www.mediawiki.org/wiki/Extension:FundraiserUnsubscribe";,
        "descriptionmsg": "fundraiserunsubscribe-desc",
        "type": "specialpage",
+       "callback": "FundraisingEmailUnsubscribeHooks::onRegistration",
        "SpecialPages": {
                "FundraiserUnsubscribe": "SpecialFundraiserUnsubscribe"
        },
@@ -16,8 +17,10 @@
                ]
        },
        "AutoloadClasses": {
+               "FundraisingEmailUnsubscribeHooks": 
"FundraisingEmailUnsubscribeHooks.php",
                "SpecialFundraiserUnsubscribe": 
"SpecialFundraiserUnsubscribe.php",
                "Logger": "includes/Logger.php",
+               "FundraiserEmailQueue": "includes/FundraiserEmailQueue.php",
                "MediaWikiTwig": "includes/MediaWikiTwig.php",
                "MediaWikiTwigCallbacks": "includes/MediaWikiTwig.php",
                "XmlTransactionProcessor": 
"includes/XmlTransactionProcessor.php",
diff --git a/includes/FundraiserEmailQueue.php 
b/includes/FundraiserEmailQueue.php
new file mode 100644
index 0000000..545c1c6
--- /dev/null
+++ b/includes/FundraiserEmailQueue.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Helper to fetch and stash a PHPQueue backend
+ * Basically just holds a static reference so tests can look at the same
+ * backend instance as the class being tested
+ */
+class FundraiserEmailQueue {
+       static $instance;
+
+       /**
+        * @return PHPQueue\Interfaces\FifoQueueStore
+        */
+       public static function get() {
+               global $wgFundraisingEmailUnsubscribeQueueClass,
+                          $wgFundraisingEmailUnsubscribeQueueParameters;
+
+               if ( !self::$instance ) {
+                       if ( empty( 
$wgFundraisingEmailUnsubscribeQueueParameters['queue'] ) ) {
+                               
$wgFundraisingEmailUnsubscribeQueueParameters['queue'] = 'unsubscribe';
+                       }
+                       self::$instance = new 
$wgFundraisingEmailUnsubscribeQueueClass(
+                               $wgFundraisingEmailUnsubscribeQueueParameters
+                       );
+               }
+
+               return self::$instance;
+       }
+}
diff --git a/methods/FundraiserUnsubscribeThankYou.php 
b/methods/FundraiserUnsubscribeThankYou.php
index 89c243f..5adba37 100644
--- a/methods/FundraiserUnsubscribeThankYou.php
+++ b/methods/FundraiserUnsubscribeThankYou.php
@@ -63,9 +63,6 @@
        }
 
        public function unsubscribe( $requestID, $process, array $params ) {
-               global $wgFundraisingEmailUnsubscribeQueueClass,
-                          $wgFundraisingEmailUnsubscribeQueueParameters;
-
                Logger::pushLabel( 'UnsubThankYou' );
 
                $email = $params['email'];
@@ -76,17 +73,10 @@
                        'email' => $email,
                        'contribution-id' => $contribId
                );
+
                // Send to the queue
                Logger::log( 'Placing message in queue for email ' . 
json_encode( $email ) );
-
-               if ( empty( 
$wgFundraisingEmailUnsubscribeQueueParameters['queue'] ) ) {
-                       $wgFundraisingEmailUnsubscribeQueueParameters['queue'] 
= 'unsubscribe';
-               }
-               $queue = new $wgFundraisingEmailUnsubscribeQueueClass(
-                       $wgFundraisingEmailUnsubscribeQueueParameters
-               );
-               // Throws exception if it is unsuccessful
-               $queue->push( $message );
+               FundraiserEmailQueue::get()->push( $message );
 
                // Clean up and return
                Logger::popLabel();
diff --git a/tests/phpunit/UnsubscribeThankYouTest.php 
b/tests/phpunit/UnsubscribeThankYouTest.php
new file mode 100644
index 0000000..518b092
--- /dev/null
+++ b/tests/phpunit/UnsubscribeThankYouTest.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * @group FundraisingEmailUnsubscribe
+ */
+class UnsubscribeThankYouTest extends MediaWikiTestCase {
+       /**
+        * @var FundraiserUnsubscribeThankYou
+        */
+       protected $unsubscriber;
+
+       public function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( array(
+                       'wgFundraisingEmailUnsubscribeQueueClass' => 
'\PHPQueue\Backend\PDO',
+                       'wgFundraisingEmailUnsubscribeQueueParameters' => array(
+                               'connection_string' => 'sqlite::memory:',
+                       ),
+                       'wgFundraisingEmailUnsubscribeHashSecretKey' => 
'Red/Fl4nn3l/#',
+               ) );
+               $this->unsubscriber = new FundraiserUnsubscribeThankYou();
+       }
+
+       public function testValidateBadHash() {
+               $result = $this->unsubscriber->validateRequest( array(
+                       'email' => 'peste...@example.com',
+                       'contribution-id' => '98765432',
+                       'hash' => 'a76f8eg86b87eg109c0d983d6a0e9a6d827e79c7',
+               ) );
+               $this->assertFalse( $result, 'Bogus hash considered valid' );
+       }
+
+       public function testValidateGoodHash() {
+               $result = $this->unsubscriber->validateRequest( array(
+                       'email' => 'peste...@example.com',
+                       'contribution-id' => '98765432',
+                       'hash' => '87b7b93fffbe72b61261e59941e3b6628b0e5689',
+               ) );
+               $this->assertTrue( $result, 'Good hash considered invalid' );
+       }
+
+       public function testSendMessage() {
+               $id = mt_rand();
+               $this->unsubscriber->unsubscribe(
+                       $id, 'unsubscribe', array(
+                               'email' => 'do...@example.com',
+                               'contribution-id' => '123456'
+                       )
+               );
+               $queue = FundraiserEmailQueue::get();
+               $message = $queue->pop();
+               $this->assertNotNull( $message );
+               $this->assertEquals( array(
+                       'email' => 'do...@example.com',
+                       'contribution-id' => '123456',
+                       'process' => 'unsubscribe',
+               ), $message );
+       }
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/311174
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1c357794fc857c3ee32ba1e4c1c61f6c44aa8c39
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/FundraisingEmailUnsubscribe
Gerrit-Branch: master
Gerrit-Owner: Ejegg <eeggles...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to