View source
<?php
namespace Drupal\Tests\search_api_saved_searches\Kernel;
use Drupal\KernelTests\KernelTestBase;
use Drupal\search_api_saved_searches\Controller\SavedSearchController;
use Drupal\search_api_saved_searches\Entity\SavedSearch;
use Drupal\search_api_saved_searches\Entity\SavedSearchAccessControlHandler;
use Drupal\search_api_saved_searches\Entity\SavedSearchType;
use Drupal\Tests\user\Traits\UserCreationTrait;
use Drupal\user\Entity\User;
use Symfony\Component\HttpFoundation\RedirectResponse;
class EmailActivationTest extends KernelTestBase {
use UserCreationTrait;
protected static $modules = [
'options',
'search_api',
'search_api_saved_searches',
'system',
'user',
];
protected $users = [];
protected function setUp() {
parent::setUp();
$this
->installEntitySchema('user');
$this
->installEntitySchema('search_api_saved_search');
$this
->installConfig([
'search_api_saved_searches',
'user',
]);
$this
->installSchema('system', 'sequences');
$this->users[0] = User::create([
'uid' => 0,
'name' => '',
]);
$this->users[0]
->save();
$this->users[1] = $this
->createUser([
SavedSearchAccessControlHandler::ADMIN_PERMISSION,
]);
$this->users[2] = $this
->createUser();
$this
->config('system.mail')
->set('interface.default', 'test_mail_collector')
->save();
$this
->config('system.site')
->set('name', 'Saved Searches Test')
->set('mail', 'admin@example.net')
->save();
$this
->config('user.settings')
->set('anonymous', 'Chuck Norris')
->save();
$title = '[user:display-name], activate your saved search "[search-api-saved-search:label]" at [site:name]';
$body = <<<END
[user:display-name],
A saved search on [site:name] with this e-mail address was created.
To activate this saved search, click the following link:
[search-api-saved-search:activate-url]
[foo:bar]
-- [site:name] team
END;
$type = SavedSearchType::load('default');
$type
->getNotificationPlugin('email')
->setConfiguration([
'activate' => [
'send' => TRUE,
'title' => $title,
'body' => $body,
],
]);
$type
->save();
$logger = new TestLogger('');
$this->container
->set('logger.factory', $logger);
$this->container
->set('logger.channel.search_api_saved_searches', $logger);
}
public function testActivationMail($current_user, $owner, $mail_address, $status, $expected_status, $mail_expected) {
$current_user = $this->users[$current_user];
$owner = $this->users[$owner];
$this
->setCurrentUser($current_user);
if ($mail_address === NULL) {
$mail_address = $owner
->getEmail();
}
$search = SavedSearch::create([
'type' => 'default',
'status' => $status,
'uid' => $owner
->id(),
'label' => 'Test search 1',
'mail' => $mail_address,
]);
$this
->assertEquals(SAVED_NEW, $search
->save());
$this
->sendMails();
$this
->assertEquals($expected_status, $search
->get('status')->value);
$activation_url = $search
->toUrl('activate', [
'absolute' => TRUE,
])
->toString();
$this
->assertNotEmpty(preg_match('#/saved-search/(\\d+)/activate\\?token=([^&]+)$#', $activation_url, $match));
$this
->assertEquals($search
->id(), $match[1]);
$this
->assertEquals(urlencode($search
->getAccessToken('activate')), $match[2]);
$captured_emails = \Drupal::state()
->get('system.test_mail_collector');
if (!$mail_expected) {
$this
->assertEmpty($captured_emails);
return;
}
$this
->assertNotEmpty($captured_emails);
$mail = end($captured_emails);
$title = '[user:display-name], activate your saved search "[search-api-saved-search:label]" at [site:name]';
$body = <<<END
[user:display-name],
A saved search on [site:name] with this e-mail address was created.
To activate this saved search, click the following link:
[search-api-saved-search:activate-url]
[foo:bar]
-- [site:name] team
END;
$this
->assertEquals("Saved Searches Test <admin@example.net>", $mail['headers']['From'], 'Message is sent from the site email account.');
$this
->assertEquals($mail_address, $mail['to'], 'Message sent to correct address.');
$replacements = [
'[user:display-name]' => $owner
->getDisplayName(),
'[site:name]' => 'Saved Searches Test',
'[search-api-saved-search:label]' => 'Test search 1',
'[search-api-saved-search:activate-url]' => $activation_url,
'[foo:bar]' => '',
];
$title = strtr($title, $replacements);
$body = strtr($body, $replacements);
$this
->assertEquals($title, $mail['subject']);
$this
->assertEquals($body, trim($mail['body']));
}
public function activationMailDataProvider() {
return [
'already disabled' => [
0,
0,
'foo@example.net',
FALSE,
FALSE,
FALSE,
],
'admin-created' => [
1,
0,
'foo@example.net',
TRUE,
TRUE,
FALSE,
],
'own mail' => [
2,
2,
NULL,
TRUE,
TRUE,
FALSE,
],
'other mail' => [
2,
2,
'foo@example.net',
TRUE,
FALSE,
TRUE,
],
'anonymous user' => [
0,
0,
'foo@example.net',
TRUE,
FALSE,
TRUE,
],
];
}
public function testSavedSearchUpdate() {
$search = SavedSearch::create([
'type' => 'default',
'label' => 'Test search 1',
'mail' => 'foo@example.net',
]);
$this
->assertEquals(SAVED_NEW, $search
->save());
$this
->sendMails();
$this
->assertFalse($search
->get('status')->value);
$captured_emails = \Drupal::state()
->get('system.test_mail_collector');
$this
->assertNotEmpty($captured_emails);
$first_mail = reset($captured_emails);
\Drupal::state()
->delete('system.test_mail_collector');
$result = $search
->set('mail', 'bar@example.net')
->save();
$this
->sendMails();
$this
->assertEquals(SAVED_UPDATED, $result);
$captured_emails = \Drupal::state()
->get('system.test_mail_collector');
$this
->assertEmpty($captured_emails);
$this
->assertFalse($search
->get('status')->value);
$controller = new SavedSearchController();
$response = $controller
->activateSearch($search, $search
->getAccessToken('activate'));
$this
->assertInstanceOf(RedirectResponse::class, $response);
$this
->assertTrue($search
->get('status')->value);
$result = $search
->set('mail', 'test@example.net')
->save();
$this
->sendMails();
$this
->assertEquals(SAVED_UPDATED, $result);
$captured_emails = \Drupal::state()
->get('system.test_mail_collector');
$this
->assertNotEmpty($captured_emails);
$first_mail['to'] = 'test@example.net';
$this
->assertEquals($first_mail, reset($captured_emails));
$this
->assertFalse($search
->get('status')->value);
}
public function testEmailPluginDisabled() {
$type = SavedSearchType::load('default');
$type
->removeNotificationPlugin('email');
$type
->save();
$search = SavedSearch::create([
'type' => 'default',
'label' => 'Test search 1',
]);
$this
->assertEquals(SAVED_NEW, $search
->save());
$this
->sendMails();
$this
->assertTrue($search
->get('status')->value);
$captured_emails = \Drupal::state()
->get('system.test_mail_collector');
$this
->assertEmpty($captured_emails);
}
public function testActivationEmailDisabled() {
$type = SavedSearchType::load('default');
$type
->getNotificationPlugin('email')
->setConfiguration([
'activate' => [
'send' => FALSE,
'title' => 'Test',
'body' => 'Test',
],
]);
$type
->save();
$search = SavedSearch::create([
'type' => 'default',
'label' => 'Test search 1',
'mail' => 'foo@example.net',
]);
$this
->assertEquals(SAVED_NEW, $search
->save());
$this
->sendMails();
$this
->assertTrue($search
->get('status')->value);
$captured_emails = \Drupal::state()
->get('system.test_mail_collector');
$this
->assertEmpty($captured_emails);
}
protected function sendMails() {
$this->container
->get('search_api_saved_searches.email_queue')
->destruct();
}
}