Use correct statuses for number of orders filter

MAILPOET-5083
This commit is contained in:
John Oleksowicz
2023-04-06 14:44:52 -05:00
committed by Aschepikov
parent 192bdce421
commit aa7bd6eb67
2 changed files with 52 additions and 7 deletions

View File

@@ -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 === '=') {

View File

@@ -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");
}