View source
<?php
namespace Drupal\Tests\message_subscribe\Kernel;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Test\AssertMailTrait;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\message\Entity\Message;
use Drupal\message_subscribe\Subscribers\DeliveryCandidate;
class SubscribersTest extends MessageSubscribeTestBase {
use AssertMailTrait;
protected $flagService;
protected $messageSubscribers;
protected $nodes;
protected $users;
public static $modules = [
'taxonomy',
];
public function setUp() {
parent::setUp();
$this
->installSchema('node', [
'node_access',
]);
$this->flagService = $this->container
->get('flag');
$this->messageSubscribers = $this->container
->get('message_subscribe.subscribers');
$node_type = 'article';
$flags = $this->flagService
->getAllFlags();
$flag = $flags['subscribe_node'];
$flag
->set('bundles', [
$node_type,
]);
$flag
->enable();
$flag
->save();
$flag = $flags['subscribe_user'];
$flag
->enable();
$flag
->save();
$this->users[1] = $this
->createUser([
'flag subscribe_node',
'unflag subscribe_node',
'flag subscribe_user',
'unflag subscribe_user',
]);
$this->users[2] = $this
->createUser([
'flag subscribe_node',
'unflag subscribe_node',
'flag subscribe_user',
'unflag subscribe_user',
]);
$this->users[3] = $this
->createUser([
'flag subscribe_node',
'unflag subscribe_node',
'flag subscribe_user',
'unflag subscribe_user',
]);
$this->users[3]
->block();
$this->users[3]
->save();
$settings = [];
$settings['type'] = $node_type;
$settings['uid'] = $this->users[1];
$this->nodes[0] = $this
->createNode($settings);
$settings['uid'] = $this->users[2];
$this->nodes[1] = $this
->createNode($settings);
$this->flagService
->flag($flags['subscribe_node'], $this->nodes[0], $this->users[1]);
$this->flagService
->flag($flags['subscribe_node'], $this->nodes[0], $this->users[2]);
$this->flagService
->flag($flags['subscribe_node'], $this->nodes[0], $this->users[3]);
$this->flagService
->flag($flags['subscribe_node'], $this->nodes[1], $this->users[3]);
$this->flagService
->flag($flags['subscribe_user'], $this->users[1], $this->users[2]);
\Drupal::configFactory()
->getEditable('message_subscribe.settings')
->set('default_notifiers', [])
->save();
}
public function testGetSubscribers() {
$message = Message::create([
'template' => $this->template
->id(),
'uid' => $this->users[1],
]);
$node = $this->nodes[0];
$user2 = $this->users[2];
$user_blocked = $this->users[3];
$uids = $this->messageSubscribers
->getSubscribers($node, $message);
$expected_uids = [
$user2
->id() => new DeliveryCandidate([
'subscribe_node',
'subscribe_user',
], [], $user2
->id()),
];
$this
->assertEquals($uids, $expected_uids, 'All expected subscribers were fetched.');
$message = Message::create([
'template' => $this->template
->id(),
'uid' => $this->users[1],
]);
$node1 = $this->nodes[1];
$uids = $this->messageSubscribers
->getSubscribers($node1, $message);
$expected_uids = [];
$this
->assertEquals($uids, $expected_uids, 'All expected subscribers were fetched.');
$subscribe_options['notify blocked users'] = TRUE;
$uids = $this->messageSubscribers
->getSubscribers($node, $message, $subscribe_options);
$expected_uids = [
$user2
->id() => new DeliveryCandidate([
'subscribe_node',
'subscribe_user',
], [], $user2
->id()),
$user_blocked
->id() => new DeliveryCandidate([
'subscribe_node',
], [], $user_blocked
->id()),
];
$this
->assertEquals($uids, $expected_uids, 'All expected subscribers were fetched, including blocked users.');
$user3 = $this
->createUser([
'flag subscribe_node',
'unflag subscribe_node',
'flag subscribe_user',
'unflag subscribe_user',
]);
$user4 = $this
->createUser([
'flag subscribe_node',
'unflag subscribe_node',
'flag subscribe_user',
'unflag subscribe_user',
]);
$flags = $this->flagService
->getAllFlags();
$this->flagService
->flag($flags['subscribe_node'], $node, $user3);
$this->flagService
->flag($flags['subscribe_node'], $node, $user4);
$subscribe_options = [
'last uid' => $user2
->id(),
];
$uids = $this->messageSubscribers
->getSubscribers($node, $message, $subscribe_options);
$this
->assertEquals(array_keys($uids), [
$user3
->id(),
$user4
->id(),
], 'All subscribers from "last uid" were fetched.');
$subscribe_options['range'] = 1;
$uids = $this->messageSubscribers
->getSubscribers($node, $message, $subscribe_options);
$this
->assertEquals(array_keys($uids), [
$user3
->id(),
], 'All subscribers from "last uid" and "range" were fetched.');
}
public function testGetSubscribersExcludeSelf() {
\Drupal::configFactory()
->getEditable('message_subscribe.settings')
->set('notify_own_actions', FALSE)
->save();
$message = Message::create([
'template' => $this->template
->id(),
'uid' => $this->users[1],
]);
$node = $this->nodes[0];
$user1 = $this->users[1];
$user2 = $this->users[2];
$uids = $this->messageSubscribers
->getSubscribers($node, $message);
$expected_uids = [
$this->users[2]
->id() => new DeliveryCandidate([
'subscribe_node',
'subscribe_user',
], [], $this->users[2]
->id()),
];
$this
->assertEquals($uids, $expected_uids, 'All subscribers except for the triggering user were fetched.');
\Drupal::configFactory()
->getEditable('message_subscribe.settings')
->set('notify_own_actions', TRUE)
->save();
$uids = $this->messageSubscribers
->getSubscribers($node, $message);
$expected_uids = [
$this->users[1]
->id() => new DeliveryCandidate([
'subscribe_node',
], [], $this->users[1]
->id()),
$this->users[2]
->id() => new DeliveryCandidate([
'subscribe_node',
'subscribe_user',
], [], $this->users[2]
->id()),
];
$this
->assertEquals($uids, $expected_uids, 'All subscribers including the triggering user were fetched.');
}
public function testEntityAccess() {
\Drupal::configFactory()
->getEditable('message_subscribe.settings')
->set('notify_own_actions', TRUE)
->save();
$message = Message::create([
'template' => $this->template
->id(),
]);
$node = $this->nodes[0];
$node
->setUnpublished();
$node
->save();
user_role_change_permissions(AccountInterface::AUTHENTICATED_ROLE, [
'view own unpublished content' => TRUE,
]);
$user1 = $this->users[1];
$user2 = $this->users[2];
$subscribe_options['entity access'] = TRUE;
$uids = $this->messageSubscribers
->getSubscribers($node, $message, $subscribe_options);
$this
->assertEquals(array_keys($uids), [
$user1
->id(),
], 'Only user with access to node returned for subscribers list.');
$subscribe_options['entity access'] = FALSE;
$uids = $this->messageSubscribers
->getSubscribers($node, $message, $subscribe_options);
$this
->assertEquals(array_keys($uids), [
$user1
->id(),
$user2
->id(),
], 'All users (even without access) returned for subscribers list.');
}
public function testHooks() {
$this
->enableModules([
'message_subscribe_test',
]);
$message = Message::create([
'template' => $this->template
->id(),
'uid' => $this->users[1],
]);
$this->users[4] = $this
->createUser();
$node = $this->nodes[0];
$uids = $this->messageSubscribers
->getSubscribers($node, $message);
$this
->assertTrue(\Drupal::state('message_subscribe_test')
->get('hook_called'));
$this
->assertTrue(\Drupal::state('message_subscribe_test')
->get('alter_hook_called'));
$this
->assertEquals([
4 => new DeliveryCandidate([
'foo_flag',
], [
'email',
], 4),
10001 => new DeliveryCandidate([
'bar_flag',
], [
'email',
], 10001),
], $uids);
\Drupal::state('message_subscribe_test')
->set('disable_subscribers_alter', TRUE);
$this->messageSubscribers
->sendMessage($node, $message, [], [
'entity access' => FALSE,
]);
$this
->assertEquals(2, \Drupal::state('message_subscribe_test')
->get('message_alter_hook_called', FALSE));
}
public function testSendMessage() {
$this
->config('message_subscribe.settings')
->set('default_notifiers', [
'email',
])
->save();
$flags = $this->flagService
->getAllFlags();
foreach (range(4, 10) as $i) {
$this->users[$i] = $this
->createUser([
'access content',
'flag subscribe_node',
'unflag subscribe_node',
'flag subscribe_user',
'unflag subscribe_user',
]);
$this->flagService
->flag($flags['subscribe_node'], $this->nodes[0], $this->users[$i]);
}
$notify_options = [
'email' => [
'save on fail' => TRUE,
'save on success' => TRUE,
],
];
$subscribe_options = [
'notify message owner' => TRUE,
];
$message = Message::create([
'template' => $this->template
->id(),
]);
$this->messageSubscribers
->sendMessage($this->nodes[0], $message, $notify_options, $subscribe_options);
$mails = $this
->getMails();
$no_message_count = $message_count = 0;
foreach ($this->users as $account) {
$query = $this->container
->get('entity_type.manager')
->getStorage('message')
->getQuery();
$query
->condition('uid', $account
->id());
$result = $query
->execute();
if (!$account
->hasPermission('access content') || $account
->isBlocked()) {
$this
->assertEmpty($result);
$no_message_count++;
}
else {
$this
->assertEquals(1, count($result), '1 message was saved for user ' . $account
->id());
$message_count++;
}
}
$this
->assertEquals(2, $no_message_count);
$this
->assertEquals(8, $message_count);
$this
->assertEquals(count($mails), $message_count);
}
public function testNotifyEntityOwner() {
$this->users[3]
->activate();
$this->users[3]
->save();
$this->nodes[0]
->setOwner($this->users[2]);
$this->nodes[0]
->setRevisionUser($this->users[3]);
$this->nodes[0]
->save();
$this
->config('message_subscribe.settings')
->set('notify_own_actions', FALSE)
->save();
$message = Message::create([
'template' => $this->template
->id(),
]);
$subscribers = $this->messageSubscribers
->getSubscribers($this->nodes[0], $message);
$expected = [
$this->users[1]
->id() => new DeliveryCandidate([
'subscribe_node',
], [], $this->users[1]
->id()),
$this->users[2]
->id() => new DeliveryCandidate([
'subscribe_node',
], [], $this->users[2]
->id()),
];
$this
->assertEquals($expected, $subscribers);
$this->nodes[0]
->setRevisionUser($this->users[2]);
$this->nodes[0]
->save();
$subscribers = $this->messageSubscribers
->getSubscribers($this->nodes[0], $message);
$expected = [
$this->users[1]
->id() => new DeliveryCandidate([
'subscribe_node',
], [], $this->users[1]
->id()),
$this->users[3]
->id() => new DeliveryCandidate([
'subscribe_node',
], [], $this->users[3]
->id()),
];
$this
->assertEquals($expected, $subscribers);
}
public function testFieldedMessageBundles() {
$field_name = mb_strtolower($this
->randomMachineName());
$field_storage = FieldStorageConfig::create([
'field_name' => $field_name,
'entity_type' => 'message',
'type' => 'text',
]);
$field_storage
->save();
$field_config = FieldConfig::create([
'field_storage' => $field_storage,
'bundle' => $this->template
->id(),
]);
$field_config
->save();
\Drupal::configFactory()
->getEditable('message_subscribe.settings')
->set('default_notifiers', [
'email',
])
->save();
$message = Message::create([
'template' => $this->template
->id(),
'uid' => $this->users[1],
$field_name => $this
->randomString(),
]);
$message
->save();
$message = $message
->load($message
->id());
$node = $this->nodes[0];
$this->messageSubscribers
->sendMessage($node, $message, [
'email' => [
'save on success' => TRUE,
],
], [
'entity access' => FALSE,
]);
$cloned_message = \Drupal::entityTypeManager()
->getStorage('message')
->load($message
->id() + 1);
$this
->assertEquals($message->{$field_name}->value, $cloned_message->{$field_name}->value);
}
}