Skip to content

Commit

Permalink
Merge pull request #2759 from splitbrain/refactorSubscriptions
Browse files Browse the repository at this point in the history
Refactor subscriptions
  • Loading branch information
splitbrain committed May 19, 2019
2 parents 749c002 + 451969a commit b8c09b6
Show file tree
Hide file tree
Showing 20 changed files with 1,426 additions and 951 deletions.
16 changes: 16 additions & 0 deletions _test/mock/MailerMock.php
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 _test/tests/inc/Subscriptions/BulkSubscriptionsSenderTest.php
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 _test/tests/inc/Subscriptions/SubscriberManagerTest.php
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 _test/tests/inc/Subscriptions/SubscriberRegexBuilderTest.php
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));
}
}

0 comments on commit b8c09b6

Please sign in to comment.