Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • omadrid/engine
  • javanick/engine
  • minds/engine
  • joe59/engine
  • eiennohi/engine
  • edgebal/engine
  • msantang78/engine
  • maruthi-adithya/engine
  • duyquoc/engine
  • benhayward.ben/engine
  • rlperez/engine
  • priestd09/engine
  • dknunn/engine
  • ascenderking/engine
  • catastrop/engine
  • jim-toth/engine
  • project_connection/engine
  • manishoo/engine
  • murbo98/engine
  • namesty/engine
  • Moikapy/engine
  • bedriguler/engine
  • CodingNagger/engine
  • jun784/engine
  • alexgleason/engine
  • gigasim97/engine
  • auxchar/engine
  • pestixaba/engine
  • m994/engine
  • webprodev/minds_engine
  • fabiolalombardim/engine
  • zackwy/engine
  • linleyj7/engine
  • fiatjaf/minds-engine
  • ppitestsblishaokai/engine
  • VARUN-KUSH/engine
  • brainr386/engine
37 results
Show changes
Commits on Source (2)
Showing
with 670 additions and 50 deletions
<?php
namespace Minds\Core\Email\CampaignLogs;
use Minds\Traits\MagicAttributes;
/**
* @method int getReceiverGuid()
* @method CampaignLog setReceiverGuid(int $receiverGuid)
* @method int getTimeSent()
* @method CampaignLog setTimeSet(int $timeSent)
* @method string getEmailCampaignId()
* @method CampaignLog setEmailCampaignId(string $emailCampaignId)
*/
class CampaignLog
{
use MagicAttributes;
/** @var int $receiverGuid the user guid who received the email */
protected $receiverGuid;
/** @var int $timeStamp the timestamp when the email was sent */
protected $timeSent;
/** @var string $emailCampaignId the class name of the email campaign */
protected $emailCampaignID;
}
<?php
/**
* Email Campaign Log Repository.
*/
namespace Minds\Core\Email\CampaignLogs;
use Minds\Core\Data\Cassandra\Client;
use Minds\Core\Di\Di;
use Cassandra\Varint;
use Cassandra\Timestamp;
use Minds\Core\Data\Cassandra\Prepared\Custom;
use Minds\Core\Email\CampaignLogs\CampaignLog;
class Repository
{
/**
* @var Client
*/
protected $db;
/**
* Repository constructor.
*
* @param null $db
*/
public function __construct($db = null)
{
$this->db = $db ?: Di::_()->get('Database\Cassandra\Cql');
}
/**
* Gets the list of email states, they are clustered on time_sent, so they will be in descending order.
*
* @param array $options
*
* receiver_guid the user guid
* limit 10
*
* @return CampaignLog[]
*/
public function getList(array $options = [])
{
$options = array_merge([
'limit' => 10,
'offset' => '',
'receiver_guid' => null,
], $options);
$template = 'SELECT * FROM email_campaign_logs';
$where = "";
$values = [];
if (isset($options['receiver_guid'])) {
$where = 'receiver_guid = ?';
$values[] = new Varint($options['receiver_guid']);
}
if ($where) {
$template .= ' WHERE ' . $where;
}
$query = new Custom();
$query->query($template, $values);
$query->setOpts([
'page_size' => (int) $options['limit'],
'paging_state_token' => $options['offset'],
]);
try {
$result = $this->db->request($query);
} catch (\Exception $e) {
error_log($e);
}
$campaignLog = [];
$token = '';
if ($result) {
foreach ($result as $row) {
$campaignLog = (new CampaignLog())
->setReceiverGuid($row['receiver_guid']->value())
->setTimeSent($row['time_sent'])
->setEmailCampaignId($row['email_campaign_id']);
$campaignLogs[] = $campaignLog;
}
$token = base64_encode($result->pagingStateToken());
}
return [
'data' => $campaignLogs,
'next' => $token,
];
}
/**
* Inserts an email campaign log into cassandra.
*
* @param CampaignLog $campaignLog
*
* @return bool the write results
*
* @throws \Exception
*/
public function add(CampaignLog $campaignLog)
{
$template = 'INSERT INTO email_campaign_logs (receiver_guid, time_sent, email_campaign_id) VALUES (?, ?, ?)';
$values = [
new Varint($campaignLog->getReceiverGuid()),
new Timestamp($campaignLog->getTimeSent()),
(string) $campaignLog->getEmailCampaignId(),
];
$query = new Custom();
$query->query($template, $values);
return $this->db->request($query);
}
}
......@@ -7,6 +7,7 @@ use Minds\Core\Email\EmailSubscription;
use Minds\Core\Email\Manager;
use Minds\Entities\User;
use Minds\Traits\MagicAttributes;
use Minds\Core\Email\CampaignLogs\CampaignLog;
abstract class EmailCampaign
{
......@@ -65,4 +66,31 @@ abstract class EmailCampaign
return true;
}
/**
* Returns the short name of the class as the template name.
*/
public function getEmailCampaignId()
{
return (new \ReflectionClass($this))->getShortName();
}
/**
* Saves when the user received the email campaign to the db.
*
* @var int defaults to the current time
*/
public function saveCampaignLog(int $time = null)
{
$time = $time ?: time();
if (!$this->manager || !$this->user) {
return false;
}
$campaignLog = (new CampaignLog())
->setReceiverGuid($this->user->guid)
->setTimeSent($time)
->setEmailCampaignId($this->getEmailCampaignId());
$this->manager->saveCampaignLog($campaignLog);
}
}
......@@ -70,11 +70,13 @@ class GoneCold extends EmailCampaign
return $message;
}
public function send()
{
public function send($time = null)
{
$time = $time ?: time();
//send email
if ($this->canSend()) {
$this->mailer->queue($this->build());
$this->saveCampaignLog($time);
}
}
}
......@@ -70,11 +70,13 @@ class WelcomeComplete extends EmailCampaign
return $message;
}
public function send()
public function send($time = null)
{
$time = $time ?: time();
//send email
if ($this->canSend()) {
$this->mailer->queue($this->build());
$this->saveCampaignLog($time);
}
}
}
......@@ -75,6 +75,7 @@ class WelcomeIncomplete extends EmailCampaign
//send email
if ($this->canSend()) {
$this->mailer->queue($this->build());
$this->saveCampaignLog();
}
}
}
<?php
namespace Minds\Core\Email\Delegates;
use Minds\Core\Suggestions\Manager;
use Minds\Entities\User;
use Minds\Core\Di\Di;
use Minds\Interfaces\SenderInterface;
use Minds\Core\Email\Campaigns\UserRetention\GoneCold;
class GoneColdSender implements SenderInterface
{
/** @var Manager */
private $manager;
/** @var GoneCold */
private $campaign;
public function __construct(Manager $manager = null, GoneCold $campaign = null)
{
$this->manager = $manager ?: Di::_()->get('Suggestions\Manager');
$this->campaign = $campaign ?: new GoneCold();
}
public function send(User $user)
{
$this->manager->setUser($user);
$suggestions = $this->manager->getList();
$this->campaign->setUser($user);
$this->campaign->setSuggestions($suggestions);
$this->campaign->send();
}
}
<?php
namespace Minds\Core\Email\Delegates;
use Minds\Entities\User;
use Minds\Core\Di\Di;
use Minds\Core\Suggestions\Manager as SuggestionsManager;
use Minds\Core\Onboarding\Manager as OnboardingManager;
use Minds\Interfaces\SenderInterface;
use Minds\Core\Email\Campaigns\UserRetention\WelcomeComplete;
use Minds\Core\Email\Campaigns\UserRetention\WelcomeIncomplete;
class WelcomeSender implements SenderInterface
{
/** @var SuggestionsManager */
private $suggestionsManager;
/** @var OnboardingManager */
private $onboardingManager;
/** @var WelcomeComplete */
private $welcomeComplete;
/** @var WelcomeIncomplete */
private $welcomeIncomplete;
public function __construct(
SuggestionsManager $suggestionsManager = null,
OnboardingManager $onboardingManager = null,
WelcomeComplete $welcomeComplete = null,
WelcomeIncomplete $welcomeIncomplete = null
) {
$this->suggestionsManager = $suggestionsManager ?: Di::_()->get('Suggestions\Manager');
$this->onboardingManager = $onboardingManager ?: Di::_()->get('Onboarding\Manager');
$this->welcomeComplete = $welcomeComplete ?: new WelcomeComplete();
$this->welcomeIncomplete = $welcomeIncomplete ?: new WelcomeIncomplete();
}
public function send(User $user)
{
$this->onboardingManager->setUser($user);
$campaign = $this->welcomeComplete;
if ($this->onboardingManager->isComplete()) {
$this->suggestionsManager->setUser($user);
$suggestions = $this->suggestionsManager->getList();
$campaign->setSuggestions($suggestions);
} else {
$campaign = $this->welcomeIncomplete;
}
$campaign->setUser($user);
$campaign->send();
}
}
......@@ -8,11 +8,13 @@ namespace Minds\Core\Email;
use Minds\Core\Di\Di;
use Minds\Core\Events\Dispatcher;
use Minds\Core\Analytics\UserStates\UserActivityBuckets;
use Minds\Core\Email\Campaigns\UserRetention\GoneCold;
use Minds\Core\Email\Campaigns\UserRetention\WelcomeComplete;
use Minds\Core\Email\Campaigns\UserRetention\WelcomeIncomplete;
use Minds\Entities\User;
use Minds\Core\Email\Manager;
use Minds\Core\Suggestions\Manager as SuggestionManager;
use Minds\Interfaces\SenderInterface;
class Events
{
......@@ -36,6 +38,7 @@ class Events
Dispatcher::register('user_state_change', UserActivityBuckets::STATE_NEW, function ($opts) {
error_log('user_state_change new');
$this->sendCampaign(new Delegates\WelcomeSender(), $opts->getParameters());
});
Dispatcher::register('user_state_change', UserActivityBuckets::STATE_RESURRECTED, function ($opts) {
......@@ -43,37 +46,17 @@ class Events
});
Dispatcher::register('user_state_change', UserActivityBuckets::STATE_COLD, function ($opts) {
error_log('user_state_change cold');
$params = $opts->getParameters();
$user = new User($params['user_guid']);
$manager = new SuggestionManager();
$manager->setUser($user);
$suggestions = $manager->getList();
$campaign = (new GoneCold())
->setUser($user)
->setSuggestions($suggestions);
$campaign->send();
$this->sendCampaign(new Delegates\GoneColdSender(), $opts->getParameters());
});
Dispatcher::register('welcome_email', 'all', function ($opts) {
error_log('welcome_email');
$params = $opts->getParameters();
$user = new User($params['user_guid']);
$onboardingManager = Di::_()->get('Onboarding\Manager');
$onboardingManager->setUser($user);
if ($onboardingManager->isComplete()) {
$campaign = (new WelcomeComplete());
$suggestionManager = Di::_()->get('Suggestions\Manager');
$suggestionManager->setUser($user);
$suggestions = $suggestionManager->getList();
$campaign->setSuggestions($suggestions);
} else {
$campaign = (new WelcomeIncomplete());
error_log('Sending Welcome Incomplete');
}
$campaign->setUser($user);
$campaign->send();
$this->sendCampaign(new Delegates\WelcomeSender(), $opts->getParameters());
});
}
private function sendCampaign (SenderInterface $sender, $params) {
$user = new User($params['user_guid']);
$sender->send($user);
}
}
......@@ -7,15 +7,24 @@ namespace Minds\Core\Email;
use Minds\Core\Di\Di;
use Minds\Core\Email\EmailSubscription;
use Minds\Core\Entities;
use Minds\Entities\User;
use Minds\Core\Email\Repository;
use Minds\Core\Email\CampaignLogs\Repository as CampaignLogsRepository;
use Minds\Core\Email\CampaignLogs\CampaignLog;
class Manager
{
/** @var Repository */
protected $repository;
public function __construct($repository = null)
/** @var CampaignLogsRepository */
protected $campaignLogsRepository;
public function __construct(Repository $repository = null, CampaignLogsRepository $campaignLogsRepository = null)
{
$this->repository = $repository ?: Di::_()->get('Email\Repository');
$this->campaignLogsRepository = $campaignLogsRepository ?: Di::_()->get('Email\CampaignLogs\Repository');
}
public function getSubscribers($options = [])
......@@ -108,4 +117,20 @@ class Manager
return true;
}
/**
* Saves a log when we send a user a campaign email
* Used to select subsequent mailings and send different emails
* @param CampaignLog $campaignLog the receiver, time and campaign class name
* @return boolean the add result
*/
public function saveCampaignLog(CampaignLog $campaignLog) {
$this->campaignLogsRepository->add($campaignLog);
}
public function getCampaignLogs(User $receiver) {
$options = [
'receiver_guid' => $receiver->guid
];
return $this->campaignLogsRepository->getList($options);
}
}
......@@ -37,5 +37,9 @@ class Provider extends DiProvider
$this->di->bind('Email\EmailStyles', function ($di) {
return new EmailStyles();
}, ['useFactory' => false]);
$this->di->bind('Email\CampaignLogs\Repository', function ($di) {
return new CampaignLogs\Repository();
}, ['useFactory' => true]);
}
}
......@@ -1429,3 +1429,10 @@ CREATE TABLE minds.user_snapshots (
json_data text,
PRIMARY KEY (user_guid, type, key)
) WITH CLUSTERING ORDER BY (type ASC, key ASC);
CREATE TABLE minds.email_campaign_logs (
receiver_guid varint,
time_sent timestamp,
email_campaign_id text,
PRIMARY KEY (receiver_guid, time_sent)
) WITH CLUSTERING ORDER BY (time_sent desc);
<?php
namespace Minds\Interfaces;
use Minds\Entities\User;
/**
* Delegate interface for sending emails
*/
interface SenderInterface
{
/**
* sending campaign emails to a user
* @return void
*/
public function send(User $user);
}
\ No newline at end of file
<?php
namespace Spec\Minds\Core\Email\CampaignLogs;
use Minds\Core\Data\Cassandra\Client;
use Minds\Core\Email\CampaignLogs\Repository;
use Minds\Core\Email\CampaignLogs\CampaignLog;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Spec\Minds\Mocks\Cassandra\Rows;
use Cassandra\Varint;
class RepositorySpec extends ObjectBehavior
{
protected $db;
public function let(Client $db)
{
$this->db = $db;
$this->beConstructedWith($db);
}
public function it_is_initializable()
{
$this->shouldHaveType(Repository::class);
}
public function it_should_write_a_log ()
{
$campaignLog = (new CampaignLog())
->setReceiverGuid(123)
->setTimeSent(0)
->setEmailCampaignId('test');
$this->db->request(Argument::that(function ($query) {
$built = $query->build();
return $built['string'] === 'INSERT INTO email_campaign_logs (receiver_guid, time_sent, email_campaign_id) VALUES (?, ?, ?)';
}))
->shouldBeCalled()
->willReturn(true);
$this->add($campaignLog)->shouldReturn(true);
}
public function it_should_get_a_list_of_logs()
{
$opts = [
'receiver_guid' => 123,
'limit' => 10,
'offset' => '',
];
$this->db->request(Argument::that(function ($query) {
$built = $query->build();
return $built['string'] === 'SELECT * FROM email_campaign_logs WHERE receiver_guid = ?';
}))
->shouldBeCalled()
->willReturn(new Rows([
[
'receiver_guid' => new Varint(123),
'time_sent' => 1,
'email_campaign_id' => 'test'
],
[
'receiver_guid' => new Varint(123),
'time_sent' => 1,
'email_campaign_id' => 'test2'
],
], ''));
$this->getList($opts)->shouldBeArray();
}
}
......@@ -8,6 +8,7 @@ use Minds\Core\Email\Mailer;
use Minds\Core\Email\Manager;
use Minds\Core\Email\EmailSubscription;
use Minds\Core\Suggestions\Suggestion;
use Minds\Core\Email\CampaignLogs\CampaignLog;
use Minds\Entities\User;
use Prophecy\Argument;
......@@ -57,15 +58,24 @@ class GoneColdSpec extends ObjectBehavior
$data['username']->shouldEqual($this->testUsername);
$this->mailer->queue(Argument::any())->shouldBeCalled();
$testEmailSubscription = (new EmailSubscription())
->setUserGuid($this->testGUID)
->setCampaign('global')
->setTopic('minds_tips')
->setValue(true);
$time = time();
$campaignLog = (new CampaignLog())
->setReceiverGuid($this->testGUID)
->setTimeSent($time)
->setEmailCampaignId($this->getEmailCampaignId()->getWrappedObject());
$this->manager->saveCampaignLog($campaignLog)->shouldBeCalled();
$this->manager->isSubscribed($testEmailSubscription)->shouldBeCalled()->willReturn(true);
$this->send();
$this->send($time);
}
public function it_should_not_send_unsubscribed(User $user)
......
......@@ -8,6 +8,7 @@ use Minds\Core\Email\Mailer;
use Minds\Core\Email\Manager;
use Minds\Core\Email\EmailSubscription;
use Minds\Core\Suggestions\Suggestion;
use Minds\Core\Email\CampaignLogs\CampaignLog;
use Minds\Entities\User;
use Prophecy\Argument;
......@@ -66,6 +67,15 @@ class WelcomeCompleteSpec extends ObjectBehavior
->setTopic('minds_tips')
->setValue(true);
$time = time();
$campaignLog = (new CampaignLog())
->setReceiverGuid($this->testGUID)
->setTimeSent($time)
->setEmailCampaignId($this->getEmailCampaignId()->getWrappedObject());
$this->manager->saveCampaignLog($campaignLog)->shouldBeCalled();
$this->manager->isSubscribed($testEmailSubscription)->shouldBeCalled()->willReturn(true);
$this->send();
}
......
......@@ -7,6 +7,7 @@ use PhpSpec\ObjectBehavior;
use Minds\Core\Email\Mailer;
use Minds\Core\Email\Manager;
use Minds\Core\Email\EmailSubscription;
use Minds\Core\Email\CampaignLogs\CampaignLog;
use Minds\Entities\User;
use Prophecy\Argument;
......@@ -63,8 +64,17 @@ class WelcomeIncompleteSpec extends ObjectBehavior
->setTopic('minds_tips')
->setValue(true);
$time = time();
$campaignLog = (new CampaignLog())
->setReceiverGuid($this->testGUID)
->setTimeSent($time)
->setEmailCampaignId($this->getEmailCampaignId()->getWrappedObject());
$this->manager->saveCampaignLog($campaignLog)->shouldBeCalled();
$this->manager->isSubscribed($testEmailSubscription)->shouldBeCalled()->willReturn(true);
$this->send();
$this->send($time);
}
public function it_should_not_send_unsubscribed(User $user)
......
<?php
namespace Spec\Minds\Core\Email\Delegates;
use Minds\Core\Email\Delegates\GoneColdSender;
use PhpSpec\ObjectBehavior;
use Minds\Core\Suggestions\Manager as SuggestionsManager;
use Minds\Core\Email\EmailSubscription;
use Minds\Core\Email\Manager;
use Minds\Core\Email\Mailer;
use Minds\Entities\User;
use Minds\Core\Email\Campaigns\UserRetention\GoneCold;
use Minds\Core\Email\CampaignLogs\CampaignLog;
class GoneColdSenderSpec extends ObjectBehavior
{
/** @var Manager $manager */
private $manager;
/** @var SuggestionsManager $manager */
private $suggestionsManager;
/** @var Mailer $mailer */
private $mailer;
/** @var GoneCold $campaign */
private $campaign;
private $testGUID = 123;
private $testName = 'test_name';
private $testEmail = 'test@minds.com';
private $testUsername = 'testUsername';
private $testBriefDescription = 'test brief description';
public function let(Manager $manager, SuggestionsManager $suggestionsManager, Mailer $mailer)
{
$this->manager = $manager;
$this->suggestionsManager = $suggestionsManager;
$this->mailer = $mailer;
$campaign = new GoneCold(null, $mailer->getWrappedObject(), $manager->getWrappedObject());
$this->campaign = $campaign;
$this->beConstructedWith($suggestionsManager, $campaign);
}
public function it_is_initializable()
{
$this->shouldHaveType(GoneColdSender::class);
}
public function it_should_send(User $user)
{
$user->getGUID()->shouldBeCalled()->willReturn($this->testGUID);
$user->get('enabled')->shouldBeCalled()->willReturn('yes');
$user->get('name')->shouldBeCalled()->willReturn($this->testName);
$user->get('guid')->shouldBeCalled()->willReturn($this->testGUID);
$user->getEmail()->shouldBeCalled()->willReturn($this->testEmail);
$user->get('username')->shouldBeCalled()->willReturn($this->testUsername);
$this->suggestionsManager->setUser($user)->shouldBeCalled();
$this->suggestionsManager->getList()->shouldBeCalled();
$emailSubscription = (new EmailSubscription())
->setUserGuid(123)
->setCampaign('global')
->setTopic('minds_tips')
->setValue('true');
$time = time();
$campaignLog = (new CampaignLog())
->setReceiverGuid($this->testGUID)
->setTimeSent($time)
->setEmailCampaignId($this->campaign->getEmailCampaignId());
$this->manager->saveCampaignLog($campaignLog)->shouldBeCalled();
$this->manager->isSubscribed($emailSubscription)->shouldBeCalled()->willReturn(true);
$this->send($user);
}
}
<?php
namespace Spec\Minds\Core\Email\Delegates;
use Minds\Core\Email\Delegates\WelcomeSender;
use PhpSpec\ObjectBehavior;
use Minds\Core\Suggestions\Manager as SuggestionsManager;
use Minds\Core\Onboarding\Manager as OnboardingManager;
use Minds\Core\Email\EmailSubscription;
use Minds\Core\Email\Manager;
use Minds\Core\Email\Mailer;
use Minds\Entities\User;
use Minds\Core\Email\Campaigns\UserRetention\WelcomeComplete;
use Minds\Core\Email\Campaigns\UserRetention\WelcomeIncomplete;
use Minds\Core\Email\CampaignLogs\CampaignLog;
class WelcomeSenderSpec extends ObjectBehavior
{
/** @var Manager $manager */
private $manager;
/** @var SuggestionsManager */
private $suggestionsManager;
/** @var OnboardingManager */
private $onboardingManager;
/** @var WelcomeComplete */
private $welcomeComplete;
/** @var WelcomeIncomplete */
private $welcomeIncomplete;
private $testGUID = 123;
private $testName = 'test_name';
private $testEmail = 'test@minds.com';
private $testUsername = 'testUsername';
private $testBriefDescription = 'test brief description';
public function let(
Manager $manager,
SuggestionsManager $suggestionsManager,
OnboardingManager $onboardingManager,
Mailer $mailer
) {
$welcomeComplete = new WelcomeComplete(null, $mailer->getWrappedObject(), $manager->getWrappedObject());
$welcomeIncomplete = new WelcomeIncomplete(null, $mailer->getWrappedObject(), $manager->getWrappedObject());
$this->manager = $manager;
$this->suggestionsManager = $suggestionsManager;
$this->onboardingManager = $onboardingManager;
$this->welcomeComplete = $welcomeComplete;
$this->welcomeIncomplete = $welcomeIncomplete;
$this->beConstructedWith($suggestionsManager, $onboardingManager, $welcomeComplete, $welcomeIncomplete);
}
public function it_is_initializable()
{
$this->shouldHaveType(WelcomeSender::class);
}
public function it_should_send_a_welcome_complete(User $user)
{
$user->getGUID()->shouldBeCalled()->willReturn($this->testGUID);
$user->get('enabled')->shouldBeCalled()->willReturn('yes');
$user->get('name')->shouldBeCalled()->willReturn($this->testName);
$user->get('guid')->shouldBeCalled()->willReturn($this->testGUID);
$user->getEmail()->shouldBeCalled()->willReturn($this->testEmail);
$user->get('username')->shouldBeCalled()->willReturn($this->testUsername);
$this->onboardingManager->setUser($user)->shouldBeCalled();
$this->onboardingManager->isComplete()->shouldBeCalled()->willReturn(true);
$this->suggestionsManager->setUser($user)->shouldBeCalled();
$this->suggestionsManager->getList()->shouldBeCalled();
$emailSubscription = (new EmailSubscription())
->setUserGuid(123)
->setCampaign('global')
->setTopic('minds_tips')
->setValue('true');
$time = time();
$campaignLog = (new CampaignLog())
->setReceiverGuid($this->testGUID)
->setTimeSent($time)
->setEmailCampaignId($this->welcomeComplete->getEmailCampaignId());
$this->manager->saveCampaignLog($campaignLog)->shouldBeCalled();
$this->manager->isSubscribed($emailSubscription)->shouldBeCalled()->willReturn(true);
$this->send($user);
}
public function it_should_send_a_welcome_incomplete(User $user)
{
$user->getGUID()->shouldBeCalled()->willReturn($this->testGUID);
$user->get('enabled')->shouldBeCalled()->willReturn('yes');
$user->get('name')->shouldBeCalled()->willReturn($this->testName);
$user->get('guid')->shouldBeCalled()->willReturn($this->testGUID);
$user->getEmail()->shouldBeCalled()->willReturn($this->testEmail);
$user->get('username')->shouldBeCalled()->willReturn($this->testUsername);
$this->onboardingManager->setUser($user)->shouldBeCalled();
$this->onboardingManager->isComplete()->shouldBeCalled()->willReturn(false);
$this->suggestionsManager->setUser($user)->shouldNotBeCalled();
$this->suggestionsManager->getList()->shouldNotBeCalled();
$emailSubscription = (new EmailSubscription())
->setUserGuid(123)
->setCampaign('global')
->setTopic('minds_tips')
->setValue('true');
$time = time();
$campaignLog = (new CampaignLog())
->setReceiverGuid($this->testGUID)
->setTimeSent($time)
->setEmailCampaignId($this->welcomeIncomplete->getEmailCampaignId());
$this->manager->saveCampaignLog($campaignLog)->shouldBeCalled();
$this->manager->isSubscribed($emailSubscription)->shouldBeCalled()->willReturn(true);
$this->send($user);
}
}
......@@ -6,20 +6,30 @@ use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Minds\Core\Email\Repository;
use Minds\Core\Email\CampaignLogs\Repository as CampaignLogsRepository;
use Minds\Entities\User;
use Minds\Core\Email\EmailSubscription;
use Minds\Core\Email\CampaignLogs\CampaignLog;
class ManagerSpec extends ObjectBehavior
{
private $repository;
private $campaignLogsRepository;
function let(Repository $repository, CampaignLogsRepository $campaignLogsRepository) {
$this->repository = $repository;
$this->campaignLogsRepository = $campaignLogsRepository;
$this->beConstructedWith($this->repository, $this->campaignLogsRepository);
}
function it_is_initializable()
{
$this->shouldHaveType('Minds\Core\Email\Manager');
}
function it_should_get_subscribers(Repository $repository)
function it_should_get_subscribers()
{
$this->beConstructedWith($repository);
$opts = [
'campaign' => 'when',
'topic' => 'boost_completed',
......@@ -34,7 +44,7 @@ class ManagerSpec extends ObjectBehavior
$user1->guid = '456';
$user1->username = 'user2';
$repository->getList(Argument::type('array'))
$this->repository->getList(Argument::type('array'))
->shouldBeCalled()
->willReturn([
'data' => [
......@@ -48,15 +58,13 @@ class ManagerSpec extends ObjectBehavior
}
function it_should_unsubscribe_a_user_from_a_campaign(Repository $repository)
function it_should_unsubscribe_a_user_from_a_campaign()
{
$this->beConstructedWith($repository);
$user = new User();
$user->guid = '123';
$user->username = 'user1';
$repository->delete(Argument::type('Minds\Core\Email\EmailSubscription'))
$this->repository->delete(Argument::type('Minds\Core\Email\EmailSubscription'))
->shouldBeCalled()
->willReturn(true);
......@@ -65,10 +73,8 @@ class ManagerSpec extends ObjectBehavior
}
function it_should_unsubscribe_from_all_emails(Repository $repository)
function it_should_unsubscribe_from_all_emails()
{
$this->beConstructedWith($repository);
$user = new User();
$user->guid = '123';
......@@ -83,7 +89,7 @@ class ManagerSpec extends ObjectBehavior
->setTopic('top_posts'),
];
$repository->getList([
$this->repository->getList([
'campaigns' => [ 'when', 'with', 'global' ],
'topics' => [
'unread_notifications',
......@@ -102,14 +108,30 @@ class ManagerSpec extends ObjectBehavior
->shouldBeCalled()
->willReturn($subscriptions);
$repository->delete($subscriptions[0])
$this->repository->delete($subscriptions[0])
->shouldBeCalled();
$repository->delete($subscriptions[1])
$this->repository->delete($subscriptions[1])
->shouldBeCalled();
$this->unsubscribe($user)
->shouldReturn(true);
}
function it_should_save_a_campaign_log() {
$campaignLog = new CampaignLog();
$this->campaignLogsRepository->add($campaignLog)->shouldBeCalled();
$this->saveCampaignLog($campaignLog);
}
function it_should_get_campaign_logs() {
$user = new User();
$user->guid = '123';
$options = [
'receiver_guid' => $user->guid
];
$this->campaignLogsRepository->getList($options)->shouldBeCalled();
$this->getCampaignLogs($user);
}
}