From aa7bd6eb6739023416a4397584a7914dae17ea98 Mon Sep 17 00:00:00 2001 From: John Oleksowicz Date: Thu, 6 Apr 2023 14:44:52 -0500 Subject: [PATCH] Use correct statuses for number of orders filter MAILPOET-5083 --- .../Filters/WooCommerceNumberOfOrders.php | 11 ++++- .../Filters/WooCommerceNumberOfOrdersTest.php | 48 +++++++++++++++++-- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php index 280c326ba2..5aaf8a2e8b 100644 --- a/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php +++ b/mailpoet/lib/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrders.php @@ -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 === '=') { diff --git a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php index fb3ff058e5..b27eb8b03c 100644 --- a/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php +++ b/mailpoet/tests/integration/Segments/DynamicSegments/Filters/WooCommerceNumberOfOrdersTest.php @@ -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"); }