Use correct statuses for number of orders filter
MAILPOET-5083
This commit is contained in:
committed by
Aschepikov
parent
192bdce421
commit
aa7bd6eb67
@@ -7,6 +7,7 @@ use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Util\DBCollationChecker;
|
||||
use MailPoet\Util\Security;
|
||||
use MailPoetVendor\Carbon\Carbon;
|
||||
use MailPoetVendor\Doctrine\DBAL\Connection;
|
||||
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
|
||||
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||
|
||||
@@ -19,12 +20,17 @@ class WooCommerceNumberOfOrders implements Filter {
|
||||
/** @var DBCollationChecker */
|
||||
private $collationChecker;
|
||||
|
||||
/** @var WooFilterHelper */
|
||||
private $wooFilterHelper;
|
||||
|
||||
public function __construct(
|
||||
EntityManager $entityManager,
|
||||
DBCollationChecker $collationChecker
|
||||
DBCollationChecker $collationChecker,
|
||||
WooFilterHelper $wooFilterHelper
|
||||
) {
|
||||
$this->entityManager = $entityManager;
|
||||
$this->collationChecker = $collationChecker;
|
||||
$this->wooFilterHelper = $wooFilterHelper;
|
||||
}
|
||||
|
||||
public function apply(QueryBuilder $queryBuilder, DynamicSegmentFilterEntity $filter): QueryBuilder {
|
||||
@@ -53,7 +59,7 @@ class WooCommerceNumberOfOrders implements Filter {
|
||||
'customer',
|
||||
$wpdb->prefix . 'wc_order_stats',
|
||||
'orderStats',
|
||||
'customer.customer_id = orderStats.customer_id AND orderStats.date_created >= :date' . $parameterSuffix . ' AND orderStats.status NOT IN ("wc-cancelled", "wc-failed")'
|
||||
'customer.customer_id = orderStats.customer_id AND orderStats.date_created >= :date' . $parameterSuffix . ' AND orderStats.status IN (:allowedStatuses' . $parameterSuffix . ')'
|
||||
);
|
||||
|
||||
$queryBuilder->add('join', [
|
||||
@@ -70,6 +76,7 @@ class WooCommerceNumberOfOrders implements Filter {
|
||||
],
|
||||
], \true)
|
||||
->setParameter('date' . $parameterSuffix, $date->toDateTimeString())
|
||||
->setParameter('allowedStatuses' . $parameterSuffix, $this->wooFilterHelper->defaultIncludedStatuses(), Connection::PARAM_STR_ARRAY)
|
||||
->groupBy('inner_subscriber_id');
|
||||
|
||||
if ($type === '=') {
|
||||
|
@@ -73,6 +73,47 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest {
|
||||
$this->assertEqualsCanonicalizing([$createdSub->getEmail()], $emails);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider allowedStatuses
|
||||
*/
|
||||
public function testItIncludesAllowedStatuses($status) {
|
||||
$email = "$status@example.com";
|
||||
$customerId = $this->createCustomer($email, 'customer');
|
||||
$this->createOrder($customerId, Carbon::now(), $status);
|
||||
$segmentFilterData = $this->getSegmentFilterData('=', 1, 1);
|
||||
$emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter);
|
||||
expect($emails)->contains($email);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider disallowedStatuses
|
||||
*/
|
||||
public function testItExcludesDisallowedOrderStatuses($status) {
|
||||
$email = "$status@example.com";
|
||||
$customerId = $this->createCustomer($email, 'customer');
|
||||
$this->createOrder($customerId, Carbon::now(), $status);
|
||||
$segmentFilterData = $this->getSegmentFilterData('=', 1, 1);
|
||||
$emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->numberOfOrdersFilter);
|
||||
expect($emails)->notContains($email);
|
||||
}
|
||||
|
||||
public function allowedStatuses() {
|
||||
return [
|
||||
'completed' => ['wc-completed'],
|
||||
'processing' => ['wc-processing'],
|
||||
];
|
||||
}
|
||||
|
||||
public function disallowedStatuses() {
|
||||
return [
|
||||
'refunded' => ['wc-refunded'],
|
||||
'cancelled' => ['wc-cancelled'],
|
||||
'on hold' => ['wc-on-hold'],
|
||||
'pending' => ['wc-pending'],
|
||||
'failed' => ['wc-failed'],
|
||||
];
|
||||
}
|
||||
|
||||
private function getSegmentFilterData(string $comparisonType, int $ordersCount, int $days): DynamicSegmentFilterData {
|
||||
return new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_WOOCOMMERCE, WooCommerceNumberOfOrders::ACTION_NUMBER_OF_ORDERS, [
|
||||
'number_of_orders_type' => $comparisonType,
|
||||
@@ -99,12 +140,9 @@ class WooCommerceNumberOfOrdersTest extends \MailPoetTest {
|
||||
|
||||
private function cleanUp(): void {
|
||||
global $wpdb;
|
||||
$this->truncateEntity(SegmentEntity::class);
|
||||
$this->truncateEntity(SubscriberEntity::class);
|
||||
|
||||
if (!empty($this->orders)) {
|
||||
foreach ($this->orders as $orderId) {
|
||||
wp_delete_post($orderId);
|
||||
}
|
||||
}
|
||||
$this->connection->executeQuery("TRUNCATE TABLE {$wpdb->prefix}wc_customer_lookup");
|
||||
$this->connection->executeQuery("TRUNCATE TABLE {$wpdb->prefix}wc_order_stats");
|
||||
}
|
||||
|
Reference in New Issue
Block a user