-
-
Notifications
You must be signed in to change notification settings - Fork 840
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2759 from splitbrain/refactorSubscriptions
Refactor subscriptions
- Loading branch information
Showing
20 changed files
with
1,426 additions
and
951 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
<?php | ||
|
||
namespace dokuwiki\test\mock; | ||
|
||
class MailerMock extends \Mailer | ||
{ | ||
|
||
public $mails = []; | ||
|
||
public function send() | ||
{ | ||
$this->mails[] = $this->headers; | ||
return true; | ||
} | ||
|
||
} |
110 changes: 110 additions & 0 deletions
110
_test/tests/inc/Subscriptions/BulkSubscriptionsSenderTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
<?php | ||
|
||
namespace tests\inc\Subscriptions; | ||
|
||
use dokuwiki\Subscriptions\BulkSubscriptionSender; | ||
use dokuwiki\Subscriptions\SubscriberManager; | ||
use dokuwiki\test\mock\MailerMock; | ||
use DokuWikiTest; | ||
|
||
class BulkSubscriptionsSenderTest extends DokuWikiTest | ||
{ | ||
|
||
private $originalSubscriptionConfig; | ||
|
||
public function setUp() | ||
{ | ||
parent::setUp(); | ||
global $conf; | ||
$this->originalSubscriptionConfig = $conf['subscribers']; | ||
$conf['subscribers'] = true; | ||
} | ||
|
||
protected function tearDown() | ||
{ | ||
global $conf; | ||
$conf['subscribers'] = $this->originalSubscriptionConfig; | ||
parent::tearDown(); | ||
} | ||
|
||
public function testBulkdigest() | ||
{ | ||
$mailerMock = new MailerMock(); | ||
$sub = new BulkSubscriptionSender($mailerMock); | ||
$manager = new SubscriberManager(); | ||
|
||
// let's start with nothing | ||
$this->assertEquals(0, $sub->sendBulk('sub1:test')); | ||
|
||
// create a subscription | ||
$manager->add('sub1:', 'testuser', 'digest', '978328800'); // last mod 2001-01-01 | ||
|
||
// now create change | ||
$_SERVER['REMOTE_USER'] = 'someguy'; | ||
saveWikiText('sub1:test', 'foo bar', 'a subscription change', false); | ||
|
||
// should trigger a mail | ||
$this->assertEquals(1, $sub->sendBulk('sub1:test')); | ||
$this->assertEquals(['arthur@example.com'], array_column($mailerMock->mails, 'Bcc')); | ||
|
||
$mailerMock->mails = []; | ||
|
||
// now create more changes | ||
$_SERVER['REMOTE_USER'] = 'someguy'; | ||
saveWikiText('sub1:sub2:test', 'foo bar', 'a subscription change', false); | ||
saveWikiText('sub1:another_test', 'foo bar', 'a subscription change', false); | ||
|
||
// should not trigger a mail, because the subscription time has not been reached, yet | ||
$this->assertEquals(0, $sub->sendBulk('sub1:test')); | ||
$this->assertEquals([], array_column($mailerMock->mails, 'Bcc')); | ||
|
||
// reset the subscription time | ||
$manager->add('sub1:', 'testuser', 'digest', '978328800'); // last mod 2001-01-01 | ||
|
||
// we now should get mails for three changes | ||
$this->assertEquals(3, $sub->sendBulk('sub1:test')); | ||
$this->assertEquals( | ||
['arthur@example.com', 'arthur@example.com', 'arthur@example.com'], | ||
array_column($mailerMock->mails, 'Bcc') | ||
); | ||
} | ||
|
||
public function testBulklist() | ||
{ | ||
$mailerMock = new MailerMock(); | ||
$sub = new BulkSubscriptionSender($mailerMock); | ||
$manager = new SubscriberManager(); | ||
|
||
// let's start with nothing | ||
$this->assertEquals(0, $sub->sendBulk('sub1:test')); | ||
|
||
// create a subscription | ||
$manager->add('sub1:', 'testuser', 'list', '978328800'); // last mod 2001-01-01 | ||
|
||
// now create change | ||
$_SERVER['REMOTE_USER'] = 'someguy'; | ||
saveWikiText('sub1:test', 'foo bar', 'a subscription change', false); | ||
|
||
// should trigger a mail | ||
$this->assertEquals(1, $sub->sendBulk('sub1:test')); | ||
$this->assertEquals(['arthur@example.com'], array_column($mailerMock->mails, 'Bcc')); | ||
|
||
$mailerMock->mails = []; | ||
|
||
// now create more changes | ||
$_SERVER['REMOTE_USER'] = 'someguy'; | ||
saveWikiText('sub1:sub2:test', 'foo bar', 'a subscription change', false); | ||
saveWikiText('sub1:another_test', 'foo bar', 'a subscription change', false); | ||
|
||
// should not trigger a mail, because the subscription time has not been reached, yet | ||
$this->assertEquals(0, $sub->sendBulk('sub1:test')); | ||
$this->assertEquals([], array_column($mailerMock->mails, 'Bcc')); | ||
|
||
// reset the subscription time | ||
$manager->add('sub1:', 'testuser', 'list', '978328800'); // last mod 2001-01-01 | ||
|
||
// we now should get a single mail for all three changes | ||
$this->assertEquals(1, $sub->sendBulk('sub1:test')); | ||
$this->assertEquals(['arthur@example.com'], array_column($mailerMock->mails, 'Bcc')); | ||
} | ||
} |
131 changes: 131 additions & 0 deletions
131
_test/tests/inc/Subscriptions/SubscriberManagerTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
<?php | ||
|
||
namespace tests\inc\Subscriptions; | ||
|
||
use dokuwiki\Subscriptions\SubscriberManager; | ||
use DokuWikiTest; | ||
|
||
class SubscriberManagerTest extends DokuWikiTest | ||
{ | ||
private $originalSubscriptionConfig; | ||
|
||
public function setUp() | ||
{ | ||
parent::setUp(); | ||
global $conf; | ||
$this->originalSubscriptionConfig = $conf['subscribers']; | ||
$conf['subscribers'] = true; | ||
} | ||
|
||
protected function tearDown() | ||
{ | ||
global $conf; | ||
$conf['subscribers'] = $this->originalSubscriptionConfig; | ||
parent::tearDown(); | ||
} | ||
|
||
public function testAddremove() | ||
{ | ||
$sub = new SubscriberManager(); | ||
|
||
// no subscriptions | ||
$this->assertArrayNotHasKey( | ||
'wiki:dokuwiki', | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
|
||
// add page subscription | ||
$sub->add('wiki:dokuwiki', 'testuser', 'every'); | ||
|
||
// one subscription | ||
$this->assertArrayHasKey( | ||
'wiki:dokuwiki', | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
|
||
// remove page subscription | ||
$sub->remove('wiki:dokuwiki', 'testuser'); | ||
|
||
// no subscription | ||
$this->assertArrayNotHasKey( | ||
'wiki:dokuwiki', | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
|
||
// add namespace subscription | ||
$sub->add('wiki:', 'testuser', 'every'); | ||
|
||
// one subscription | ||
$this->assertArrayHasKey( | ||
'wiki:', | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
|
||
// remove (non existing) page subscription | ||
$sub->remove('wiki:dokuwiki', 'testuser'); | ||
|
||
// still one subscription | ||
$this->assertArrayHasKey( | ||
'wiki:', | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
|
||
// change namespace subscription | ||
$sub->add('wiki:', 'testuser', 'digest', '1234567'); | ||
|
||
// still one subscription | ||
$this->assertArrayHasKey( | ||
'wiki:', | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
|
||
// check contents | ||
$this->assertEquals( | ||
['wiki:' => ['testuser' => ['digest', '1234567']]], | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
|
||
// change subscription data | ||
$sub->add('wiki:', 'testuser', 'digest', '7654321'); | ||
|
||
// still one subscription | ||
$this->assertArrayHasKey( | ||
'wiki:', | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
|
||
// check contents | ||
$this->assertEquals( | ||
['wiki:' => ['testuser' => ['digest', '7654321']]], | ||
$sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest']) | ||
); | ||
} | ||
|
||
/** | ||
* Tests, if overwriting subscriptions works even when subscriptions for the same | ||
* user exist for two nested namespaces, this is a test for the bug described in FS#2580 | ||
*/ | ||
public function testOverwrite() | ||
{ | ||
$sub = new SubscriberManager(); | ||
|
||
$sub->add(':', 'admin', 'digest', '123456789'); | ||
$sub->add(':wiki:', 'admin', 'digest', '123456789'); | ||
$sub->add(':', 'admin', 'digest', '1234'); | ||
$sub->add(':wiki:', 'admin', 'digest', '1234'); | ||
|
||
$subscriptions = $sub->subscribers(':wiki:', 'admin'); | ||
|
||
$this->assertCount( | ||
1, | ||
$subscriptions[':'], | ||
'More than one subscription saved for the root namespace even though the old one should have been overwritten.' | ||
); | ||
$this->assertCount( | ||
1, | ||
$subscriptions[':wiki:'], | ||
'More than one subscription saved for the wiki namespace even though the old one should have been overwritten.' | ||
); | ||
$this->assertCount(2, $subscriptions, 'Didn\'t find the expected two subscriptions'); | ||
} | ||
} |
52 changes: 52 additions & 0 deletions
52
_test/tests/inc/Subscriptions/SubscriberRegexBuilderTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
<?php | ||
|
||
namespace tests\inc\Subscriptions; | ||
|
||
use dokuwiki\Subscriptions\SubscriberRegexBuilder; | ||
use DokuWikiTest; | ||
|
||
class SubscriberRegexBuilderTest extends DokuWikiTest | ||
{ | ||
|
||
public function regexTestdataProvider() | ||
{ | ||
return [ | ||
['Cold Fusion', null, null, 1], | ||
['casper', null, null, 1], | ||
['nope', null, null, 0], | ||
['lights', null, null, 0], | ||
[['Cold Fusion', 'casper', 'nope'], null, null, 2], | ||
[null, 'list', null, 1], | ||
[null, 'every', null, 2], | ||
[null, 'digest', null, 3], | ||
[null, ['list', 'every'], null, 3], | ||
['casper', 'digest', null, 0], | ||
['casper', ['digest', 'every'], null, 1], | ||
['zioth', 'list', '1344691369', 1], | ||
['zioth', null, '1344691369', 1], | ||
['zioth', 'digest', '1344691369', 0], | ||
]; | ||
} | ||
|
||
/** | ||
* @dataProvider regexTestdataProvider | ||
*/ | ||
public function testRegexp($user, $style, $inputData, $expectedNumResults) | ||
{ | ||
// data to test against | ||
$data = [ | ||
"casper every\n", | ||
"Andreas digest 1344689733", | ||
"Cold%20Fusion every", | ||
"zioth list 1344691369\n", | ||
"nlights digest", | ||
"rikblok\tdigest \t 1344716803", | ||
]; | ||
|
||
$sub = new SubscriberRegexBuilder(); | ||
$re = $sub->buildRegex($user, $style, $inputData); | ||
$this->assertFalse(empty($re)); | ||
$result = preg_grep($re, $data); | ||
$this->assertEquals($expectedNumResults, count($result)); | ||
} | ||
} |
Oops, something went wrong.