diff --git a/mailpoet/tests/integration/API/JSON/v1/CouponsTest.php b/mailpoet/tests/integration/API/JSON/v1/CouponsTest.php new file mode 100644 index 0000000000..f8d746af22 --- /dev/null +++ b/mailpoet/tests/integration/API/JSON/v1/CouponsTest.php @@ -0,0 +1,168 @@ +endpoint = $this->diContainer->get(Coupons::class); + $this->wcHelper = $this->diContainer->get(WooCommerceHelper::class); + $this->wpFunctions = $this->diContainer->get(WPFunctions::class); + } + + public function testItCanGetAllCoupons(): void { + $coupons = [ + $this->createCoupon('coupon-1'), + $this->createCoupon('coupon-2'), + $this->createCoupon('coupon-3'), + ]; + $response = $this->endpoint->getCoupons(); + + $this->validateResponse($response, $coupons); + } + + public function testItGetsIncludedCouponIds(): void { + $coupons = [ + $this->createCoupon('coupon-1'), + $this->createCoupon('coupon-2'), + $this->createCoupon('coupon-3'), + $this->createCoupon('include-coupon-4'), + $this->createCoupon('coupon-5'), + $this->createCoupon('include-coupon-6'), + ]; + + $response = $this->endpoint->getCoupons([ + 'include_coupon_ids' => [ + $coupons[3]->get_id(), + $coupons[5]->get_id(), + ], + 'page_size' => 1, + ]); + // expected coupons ordered by code + $expectedResult = [ + $coupons[3], // include-coupon-4 + $coupons[5], // include-coupon-6 + $coupons[0], // coupon-1 + ]; + + $this->validateResponse($response, $expectedResult); + } + + public function testItGetsCouponsBySearchQuery(): void { + $coupons = [ + $this->createCoupon('search-coupon-1'), + $this->createCoupon('coupon-search-2'), + $this->createCoupon('coupon-3'), + $this->createCoupon('coupon-4'), + $this->createCoupon('coupon-5-search'), + $this->createCoupon('coupon-6'), + ]; + + $response = $this->endpoint->getCoupons([ + 'search' => 'search', + 'page_size' => 3, + ]); + + // expected coupons ordered by code + $expectedResult = [ + $coupons[4], // coupon-5-search + $coupons[1], // coupon-search-2 + $coupons[0], // search-coupon-1 + ]; + $this->validateResponse($response, $expectedResult); + } + + public function testItGetsCouponsByPageNumber(): void { + $coupons = [ + $this->createCoupon('coupon-1'), + $this->createCoupon('coupon-2'), + $this->createCoupon('coupon-3'), + $this->createCoupon('coupon-4'), + $this->createCoupon('coupon-5'), + $this->createCoupon('coupon-6'), + ]; + + $response = $this->endpoint->getCoupons([ + 'page_number' => 2, + 'page_size' => 2, + ]); + + // expected coupons ordered by code + $expectedResult = [ + $coupons[2], // coupon-3 + $coupons[3], // coupon-4 + ]; + $this->validateResponse($response, $expectedResult); + } + + public function testItGetsCouponsByDiscountType(): void { + $coupons = [ + $this->createCoupon('coupon-1', 'fixed_cart'), + $this->createCoupon('coupon-2', 'percent'), + $this->createCoupon('coupon-3', 'percent'), + $this->createCoupon('coupon-4', 'fixed_product'), + $this->createCoupon('coupon-5', 'fixed_cart'), + $this->createCoupon('coupon-6', 'fixed_product'), + ]; + + $response = $this->endpoint->getCoupons(['discount_type' => 'fixed_product']); + + // expected coupons ordered by code + $expectedResult = [ + $coupons[3], // coupon-4 + $coupons[5], // coupon-6 + ]; + $this->validateResponse($response, $expectedResult); + } + + public function _after() { + parent::_after(); + $coupons = $this->wpFunctions->getPosts([ + 'post_type' => 'shop_coupon', + 'posts_per_page' => -1, + ]); + foreach ($coupons as $coupon) { + $this->wpFunctions->wpDeletePost($coupon->ID, true); + } + } + + private function validateResponse($response, $expectedCoupons): void { + $returnedCoupons = $response->data; + expect($response->status)->equals(APIResponse::STATUS_OK); + expect($returnedCoupons)->count(count($expectedCoupons)); + + foreach ($expectedCoupons as $key => $coupon) { + expect($coupon->get_id())->equals($returnedCoupons[$key]['id']); + expect($coupon->get_code())->equals($returnedCoupons[$key]['text']); + expect($coupon->get_discount_type())->equals($returnedCoupons[$key]['discountType']); + } + } + + private function createCoupon(?string $couponCode = null, ?string $discountType = null): \WC_Coupon { + $discountType = $discountType ?: current(array_keys($this->wcHelper->wcGetCouponTypes())); + $coupon = $this->wcHelper->createWcCoupon(''); + $coupon->set_code($couponCode); + $coupon->set_discount_type($discountType); + $coupon->set_amount(10); + $coupon->save(); + return $coupon; + } +}