Use WordPress current_time for setting lats engagement
[MAILPOET-3762]
This commit is contained in:
committed by
Veljko V
parent
a6b58e501a
commit
eae0072f24
@@ -18,6 +18,9 @@ use MailPoetVendor\Doctrine\ORM\Query\Expr\Join;
|
|||||||
* @extends Repository<SubscriberEntity>
|
* @extends Repository<SubscriberEntity>
|
||||||
*/
|
*/
|
||||||
class SubscribersRepository extends Repository {
|
class SubscribersRepository extends Repository {
|
||||||
|
/** @var WPFunctions */
|
||||||
|
private $wp;
|
||||||
|
|
||||||
protected $ignoreColumnsForUpdate = [
|
protected $ignoreColumnsForUpdate = [
|
||||||
'wp_user_id',
|
'wp_user_id',
|
||||||
'is_woocommerce_user',
|
'is_woocommerce_user',
|
||||||
@@ -26,6 +29,11 @@ class SubscribersRepository extends Repository {
|
|||||||
'last_subscribed_at',
|
'last_subscribed_at',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function __construct(EntityManager $entityManager, WPFunctions $wp) {
|
||||||
|
$this->wp = $wp;
|
||||||
|
parent::__construct($entityManager);
|
||||||
|
}
|
||||||
|
|
||||||
protected function getEntityClassName() {
|
protected function getEntityClassName() {
|
||||||
return SubscriberEntity::class;
|
return SubscriberEntity::class;
|
||||||
}
|
}
|
||||||
@@ -312,12 +320,13 @@ class SubscribersRepository extends Repository {
|
|||||||
if ($userAgent instanceof UserAgentEntity && $userAgent->getUserAgentType() === UserAgentEntity::USER_AGENT_TYPE_MACHINE) {
|
if ($userAgent instanceof UserAgentEntity && $userAgent->getUserAgentType() === UserAgentEntity::USER_AGENT_TYPE_MACHINE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
$now = Carbon::createFromTimestamp((int)$this->wp->currentTime('timestamp'));
|
||||||
// Do not update engagement if was recently updated to avoid unnecessary updates in DB
|
// Do not update engagement if was recently updated to avoid unnecessary updates in DB
|
||||||
if ($subscriberEntity->getLastEngagementAt() && $subscriberEntity->getLastEngagementAt() > Carbon::now()->subMinute()) {
|
if ($subscriberEntity->getLastEngagementAt() && $subscriberEntity->getLastEngagementAt() > $now->subMinute()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Update last engagement for human (and also unknown) user agent
|
// Update last engagement for human (and also unknown) user agent
|
||||||
$subscriberEntity->setLastEngagementAt(Carbon::now());
|
$subscriberEntity->setLastEngagementAt($now);
|
||||||
$this->flush();
|
$this->flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,7 @@ use MailPoet\Subscribers\LinkTokens;
|
|||||||
use MailPoet\Subscribers\SubscribersRepository;
|
use MailPoet\Subscribers\SubscribersRepository;
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
use MailPoet\Util\Cookies;
|
use MailPoet\Util\Cookies;
|
||||||
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
use MailPoetVendor\Carbon\Carbon;
|
use MailPoetVendor\Carbon\Carbon;
|
||||||
|
|
||||||
class ClicksTest extends \MailPoetTest {
|
class ClicksTest extends \MailPoetTest {
|
||||||
@@ -482,7 +483,11 @@ class ClicksTest extends \MailPoetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testItUpdatesSubscriberEngagementForHumanAgent() {
|
public function testItUpdatesSubscriberEngagementForHumanAgent() {
|
||||||
Carbon::setTestNow($now = Carbon::now());
|
$now = Carbon::now();
|
||||||
|
$wpMock = $this->createMock(WPFunctions::class);
|
||||||
|
$wpMock->expects($this->once())
|
||||||
|
->method('currentTime')
|
||||||
|
->willReturn($now->getTimestamp());
|
||||||
$clicksRepository = $this->diContainer->get(StatisticsClicksRepository::class);
|
$clicksRepository = $this->diContainer->get(StatisticsClicksRepository::class);
|
||||||
$data = $this->trackData;
|
$data = $this->trackData;
|
||||||
$data->userAgent = 'User Agent';
|
$data->userAgent = 'User Agent';
|
||||||
@@ -494,17 +499,22 @@ class ClicksTest extends \MailPoetTest {
|
|||||||
$clicksRepository,
|
$clicksRepository,
|
||||||
$this->diContainer->get(UserAgentsRepository::class),
|
$this->diContainer->get(UserAgentsRepository::class),
|
||||||
$this->diContainer->get(LinkShortcodeCategory::class),
|
$this->diContainer->get(LinkShortcodeCategory::class),
|
||||||
$this->diContainer->get(SubscribersRepository::class),
|
new SubscribersRepository($this->entityManager, $wpMock),
|
||||||
], [
|
], [
|
||||||
'redirectToUrl' => null,
|
'redirectToUrl' => null,
|
||||||
], $this);
|
], $this);
|
||||||
$clicks->track($data);
|
$clicks->track($data);
|
||||||
expect($this->subscriber->getLastEngagementAt())->equals($now);
|
$savedEngagementTime = $this->subscriber->getLastEngagementAt();
|
||||||
Carbon::setTestNow();
|
$this->assertInstanceOf(\DateTimeInterface::class, $savedEngagementTime);
|
||||||
|
expect($savedEngagementTime->getTimestamp())->equals($now->getTimestamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItUpdatesSubscriberEngagementForUnknownAgent() {
|
public function testItUpdatesSubscriberEngagementForUnknownAgent() {
|
||||||
Carbon::setTestNow($now = Carbon::now());
|
$now = Carbon::now();
|
||||||
|
$wpMock = $this->createMock(WPFunctions::class);
|
||||||
|
$wpMock->expects($this->once())
|
||||||
|
->method('currentTime')
|
||||||
|
->willReturn($now->getTimestamp());
|
||||||
$clicksRepository = $this->diContainer->get(StatisticsClicksRepository::class);
|
$clicksRepository = $this->diContainer->get(StatisticsClicksRepository::class);
|
||||||
$data = $this->trackData;
|
$data = $this->trackData;
|
||||||
$data->userAgent = null;
|
$data->userAgent = null;
|
||||||
@@ -516,13 +526,14 @@ class ClicksTest extends \MailPoetTest {
|
|||||||
$clicksRepository,
|
$clicksRepository,
|
||||||
$this->diContainer->get(UserAgentsRepository::class),
|
$this->diContainer->get(UserAgentsRepository::class),
|
||||||
$this->diContainer->get(LinkShortcodeCategory::class),
|
$this->diContainer->get(LinkShortcodeCategory::class),
|
||||||
$this->diContainer->get(SubscribersRepository::class),
|
new SubscribersRepository($this->entityManager, $wpMock),
|
||||||
], [
|
], [
|
||||||
'redirectToUrl' => null,
|
'redirectToUrl' => null,
|
||||||
], $this);
|
], $this);
|
||||||
$clicks->track($data);
|
$clicks->track($data);
|
||||||
expect($this->subscriber->getLastEngagementAt())->equals($now);
|
$savedEngagementTime = $this->subscriber->getLastEngagementAt();
|
||||||
Carbon::setTestNow();
|
$this->assertInstanceOf(\DateTimeInterface::class, $savedEngagementTime);
|
||||||
|
expect($savedEngagementTime->getTimestamp())->equals($now->getTimestamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItWontUpdateSubscriberEngagementForMachineAgent() {
|
public function testItWontUpdateSubscriberEngagementForMachineAgent() {
|
||||||
|
@@ -17,6 +17,7 @@ use MailPoet\Statistics\UserAgentsRepository;
|
|||||||
use MailPoet\Subscribers\LinkTokens;
|
use MailPoet\Subscribers\LinkTokens;
|
||||||
use MailPoet\Subscribers\SubscribersRepository;
|
use MailPoet\Subscribers\SubscribersRepository;
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
use MailPoetVendor\Carbon\Carbon;
|
use MailPoetVendor\Carbon\Carbon;
|
||||||
|
|
||||||
class OpensTest extends \MailPoetTest {
|
class OpensTest extends \MailPoetTest {
|
||||||
@@ -358,35 +359,45 @@ class OpensTest extends \MailPoetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testItUpdatesSubscriberEngagementForHumanAgent() {
|
public function testItUpdatesSubscriberEngagementForHumanAgent() {
|
||||||
Carbon::setTestNow($now = Carbon::now());
|
$now = Carbon::now();
|
||||||
|
$wpMock = $this->createMock(WPFunctions::class);
|
||||||
|
$wpMock->expects($this->once())
|
||||||
|
->method('currentTime')
|
||||||
|
->willReturn($now->getTimestamp());
|
||||||
$this->trackData->userAgent = 'User agent';
|
$this->trackData->userAgent = 'User agent';
|
||||||
$opens = Stub::construct($this->opens, [
|
$opens = Stub::construct($this->opens, [
|
||||||
$this->diContainer->get(StatisticsOpensRepository::class),
|
$this->diContainer->get(StatisticsOpensRepository::class),
|
||||||
$this->diContainer->get(UserAgentsRepository::class),
|
$this->diContainer->get(UserAgentsRepository::class),
|
||||||
$this->diContainer->get(SubscribersRepository::class),
|
new SubscribersRepository($this->entityManager, $wpMock),
|
||||||
], [
|
], [
|
||||||
'returnResponse' => null,
|
'returnResponse' => null,
|
||||||
], $this);
|
], $this);
|
||||||
|
|
||||||
$opens->track($this->trackData);
|
$opens->track($this->trackData);
|
||||||
expect($this->subscriber->getLastEngagementAt())->equals($now);
|
$savedEngagementTime = $this->subscriber->getLastEngagementAt();
|
||||||
Carbon::setTestNow();
|
$this->assertInstanceOf(\DateTimeInterface::class, $savedEngagementTime);
|
||||||
|
expect($savedEngagementTime->getTimestamp())->equals($now->getTimestamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItUpdatesSubscriberEngagementFoUnknownAgent() {
|
public function testItUpdatesSubscriberEngagementForUnknownAgent() {
|
||||||
Carbon::setTestNow($now = Carbon::now());
|
$now = Carbon::now();
|
||||||
|
$wpMock = $this->createMock(WPFunctions::class);
|
||||||
|
$wpMock->expects($this->once())
|
||||||
|
->method('currentTime')
|
||||||
|
->willReturn($now->getTimestamp());
|
||||||
$this->trackData->userAgent = null;
|
$this->trackData->userAgent = null;
|
||||||
$opens = Stub::construct($this->opens, [
|
$opens = Stub::construct($this->opens, [
|
||||||
$this->diContainer->get(StatisticsOpensRepository::class),
|
$this->diContainer->get(StatisticsOpensRepository::class),
|
||||||
$this->diContainer->get(UserAgentsRepository::class),
|
$this->diContainer->get(UserAgentsRepository::class),
|
||||||
$this->diContainer->get(SubscribersRepository::class),
|
new SubscribersRepository($this->entityManager, $wpMock),
|
||||||
], [
|
], [
|
||||||
'returnResponse' => null,
|
'returnResponse' => null,
|
||||||
], $this);
|
], $this);
|
||||||
|
|
||||||
$opens->track($this->trackData);
|
$opens->track($this->trackData);
|
||||||
expect($this->subscriber->getLastEngagementAt())->equals($now);
|
$savedEngagementTime = $this->subscriber->getLastEngagementAt();
|
||||||
Carbon::setTestNow();
|
$this->assertInstanceOf(\DateTimeInterface::class, $savedEngagementTime);
|
||||||
|
expect($savedEngagementTime->getTimestamp())->equals($now->getTimestamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItWontUpdateSubscriberEngagementForMachineAgent() {
|
public function testItWontUpdateSubscriberEngagementForMachineAgent() {
|
||||||
|
@@ -4,12 +4,16 @@ namespace MailPoet\WooCommerce;
|
|||||||
|
|
||||||
use MailPoet\Entities\SubscriberEntity;
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
use MailPoet\Subscribers\SubscribersRepository;
|
use MailPoet\Subscribers\SubscribersRepository;
|
||||||
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
use MailPoetVendor\Carbon\Carbon;
|
use MailPoetVendor\Carbon\Carbon;
|
||||||
use PHPUnit\Framework\MockObject\MockObject;
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
use WC_Order;
|
use WC_Order;
|
||||||
|
|
||||||
class SubscriberEngagementTest extends \MailPoetTest {
|
class SubscriberEngagementTest extends \MailPoetTest {
|
||||||
|
|
||||||
|
/** @var WPFunctions & MockObject */
|
||||||
|
private $wpMock;
|
||||||
|
|
||||||
/** @var Helper & MockObject */
|
/** @var Helper & MockObject */
|
||||||
private $wooCommerceHelperMock;
|
private $wooCommerceHelperMock;
|
||||||
|
|
||||||
@@ -18,15 +22,19 @@ class SubscriberEngagementTest extends \MailPoetTest {
|
|||||||
|
|
||||||
public function _before() {
|
public function _before() {
|
||||||
$this->wooCommerceHelperMock = $this->createMock(Helper::class);
|
$this->wooCommerceHelperMock = $this->createMock(Helper::class);
|
||||||
|
$this->wpMock = $this->createMock(WPFunctions::class);
|
||||||
$this->subscriberEngagement = new SubscriberEngagement(
|
$this->subscriberEngagement = new SubscriberEngagement(
|
||||||
$this->wooCommerceHelperMock,
|
$this->wooCommerceHelperMock,
|
||||||
$this->diContainer->get(SubscribersRepository::class)
|
new SubscribersRepository($this->entityManager, $this->wpMock)
|
||||||
);
|
);
|
||||||
$this->truncateEntity(SubscriberEntity::class);
|
$this->truncateEntity(SubscriberEntity::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItUpdatesLastEngagementForSubscriberWhoCreatedNewOrder() {
|
public function testItUpdatesLastEngagementForSubscriberWhoCreatedNewOrder() {
|
||||||
Carbon::setTestNow($now = new Carbon('2021-08-31 13:13:00'));
|
$now = new Carbon('2021-08-31 13:13:00');
|
||||||
|
$this->wpMock->expects($this->once())
|
||||||
|
->method('currentTime')
|
||||||
|
->willReturn($now->getTimestamp());
|
||||||
$subscriber = $this->createSubscriber();
|
$subscriber = $this->createSubscriber();
|
||||||
$order = $this->createOrderMock($subscriber->getEmail());
|
$order = $this->createOrderMock($subscriber->getEmail());
|
||||||
$this->wooCommerceHelperMock
|
$this->wooCommerceHelperMock
|
||||||
@@ -36,7 +44,6 @@ class SubscriberEngagementTest extends \MailPoetTest {
|
|||||||
$this->subscriberEngagement->updateSubscriberEngagement(1);
|
$this->subscriberEngagement->updateSubscriberEngagement(1);
|
||||||
$this->entityManager->refresh($subscriber);
|
$this->entityManager->refresh($subscriber);
|
||||||
expect($subscriber->getLastEngagementAt())->equals($now);
|
expect($subscriber->getLastEngagementAt())->equals($now);
|
||||||
Carbon::setTestNow();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItDoesntUpdateAnythingForNonExistingOder() {
|
public function testItDoesntUpdateAnythingForNonExistingOder() {
|
||||||
|
Reference in New Issue
Block a user