352 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			352 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 *
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\SalesRule\Api;
 | 
						|
 | 
						|
use Magento\Framework\Api\SearchCriteriaBuilder;
 | 
						|
use Magento\SalesRule\Model\Coupon;
 | 
						|
use Magento\SalesRule\Model\RuleRepository;
 | 
						|
use Magento\TestFramework\TestCase\WebapiAbstract;
 | 
						|
 | 
						|
/**
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class RuleRepositoryTest extends WebapiAbstract
 | 
						|
{
 | 
						|
    public const SERVICE_NAME = 'salesRuleRuleRepositoryV1';
 | 
						|
    public const RESOURCE_PATH = '/V1/salesRules';
 | 
						|
    public const SERVICE_VERSION = "V1";
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Framework\ObjectManagerInterface
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
    }
 | 
						|
 | 
						|
    protected function getSalesRuleData()
 | 
						|
    {
 | 
						|
        $data = [
 | 
						|
            'name' => '40% Off on Large Orders',
 | 
						|
            'store_labels' => [
 | 
						|
                [
 | 
						|
                    'store_id' => 0,
 | 
						|
                    'store_label' => 'TestRule_Label',
 | 
						|
                ],
 | 
						|
                [
 | 
						|
                    'store_id' => 1,
 | 
						|
                    'store_label' => 'TestRule_Label_default',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'description' => 'Test sales rule',
 | 
						|
            'website_ids' => [1],
 | 
						|
            'customer_group_ids' => [0, 1, 3],
 | 
						|
            'uses_per_customer' => 2,
 | 
						|
            'is_active' => true,
 | 
						|
            'condition' => [
 | 
						|
                'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class,
 | 
						|
                'conditions' => [
 | 
						|
                    [
 | 
						|
                        'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Address::class,
 | 
						|
                        'operator' => '>',
 | 
						|
                        'attribute_name' => 'base_subtotal',
 | 
						|
                        'value' => 800
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'aggregator_type' => 'all',
 | 
						|
                'operator' => null,
 | 
						|
                'value' => null,
 | 
						|
            ],
 | 
						|
            'action_condition' => [
 | 
						|
                'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Product\Combine::class,
 | 
						|
                "conditions" => [
 | 
						|
                    [
 | 
						|
                        'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Product::class,
 | 
						|
                        'operator' => '==',
 | 
						|
                        'attribute_name' => 'attribute_set_id',
 | 
						|
                        'value' => '4',
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'aggregator_type' => 'all',
 | 
						|
                'operator' => null,
 | 
						|
                'value' => null,
 | 
						|
            ],
 | 
						|
            'stop_rules_processing' => true,
 | 
						|
            'is_advanced' => true,
 | 
						|
            'sort_order' => 2,
 | 
						|
            'simple_action' => 'cart_fixed',
 | 
						|
            'discount_amount' => 40,
 | 
						|
            'discount_qty' => 2,
 | 
						|
            'discount_step' => 0,
 | 
						|
            'apply_to_shipping' => false,
 | 
						|
            'times_used' => 1,
 | 
						|
            'is_rss' => true,
 | 
						|
            'coupon_type' => \Magento\SalesRule\Api\Data\RuleInterface::COUPON_TYPE_SPECIFIC_COUPON,
 | 
						|
            'use_auto_generation' => false,
 | 
						|
            'uses_per_coupon' => 0,
 | 
						|
            'simple_free_shipping' => 0,
 | 
						|
            'from_date' => '2022-04-22',
 | 
						|
            'to_date' => '2022-09-25',
 | 
						|
        ];
 | 
						|
        return $data;
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCrud()
 | 
						|
    {
 | 
						|
        //test create
 | 
						|
        $inputData = $this->getSalesRuleData();
 | 
						|
        $result = $this->createRule($inputData);
 | 
						|
        $ruleId = $result['rule_id'];
 | 
						|
        $this->assertArrayHasKey('rule_id', $result);
 | 
						|
        $this->assertEquals($ruleId, $result['rule_id']);
 | 
						|
        $this->assertEquals($inputData['from_date'], $result['from_date']);
 | 
						|
        $this->assertEquals($inputData['to_date'], $result['to_date']);
 | 
						|
        unset($result['rule_id']);
 | 
						|
        unset($result['extension_attributes']);
 | 
						|
        $this->assertEquals($inputData, $result);
 | 
						|
 | 
						|
        //test getList
 | 
						|
        $result = $this->verifyGetList($ruleId);
 | 
						|
        unset($result['rule_id']);
 | 
						|
        unset($result['extension_attributes']);
 | 
						|
        $this->assertEquals($inputData, $result);
 | 
						|
 | 
						|
        //test update
 | 
						|
        $inputData['times_used'] = 2;
 | 
						|
        $inputData['customer_group_ids'] = [0, 1, 3];
 | 
						|
        $inputData['discount_amount'] = 30;
 | 
						|
        $result = $this->updateRule($ruleId, $inputData);
 | 
						|
        unset($result['rule_id']);
 | 
						|
        unset($result['extension_attributes']);
 | 
						|
        $this->assertEquals($inputData, $result);
 | 
						|
 | 
						|
        //test get
 | 
						|
        $result = $this->getRule($ruleId);
 | 
						|
        unset($result['rule_id']);
 | 
						|
        unset($result['extension_attributes']);
 | 
						|
        $this->assertEquals($inputData, $result);
 | 
						|
 | 
						|
        //test delete
 | 
						|
        $this->assertTrue($this->deleteRule($ruleId));
 | 
						|
    }
 | 
						|
 | 
						|
    public function verifyGetList($ruleId)
 | 
						|
    {
 | 
						|
        $searchCriteria = [
 | 
						|
            'searchCriteria' => [
 | 
						|
                'filter_groups' => [
 | 
						|
                    [
 | 
						|
                        'filters' => [
 | 
						|
                            [
 | 
						|
                                'field' => 'rule_id',
 | 
						|
                                'value' => $ruleId,
 | 
						|
                                'condition_type' => 'eq',
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'current_page' => 1,
 | 
						|
                'page_size' => 2,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($searchCriteria),
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'GetList',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $response = $this->_webApiCall($serviceInfo, $searchCriteria);
 | 
						|
 | 
						|
        $this->assertArrayHasKey('search_criteria', $response);
 | 
						|
        $this->assertArrayHasKey('total_count', $response);
 | 
						|
        $this->assertArrayHasKey('items', $response);
 | 
						|
 | 
						|
        $this->assertEquals($searchCriteria['searchCriteria'], $response['search_criteria']);
 | 
						|
        $this->assertTrue($response['total_count'] > 0);
 | 
						|
        $this->assertTrue(count($response['items']) > 0);
 | 
						|
 | 
						|
        $this->assertNotNull($response['items'][0]['rule_id']);
 | 
						|
        $this->assertEquals($ruleId, $response['items'][0]['rule_id']);
 | 
						|
 | 
						|
        return $response['items'][0];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoApiDataFixture Magento/SalesRule/_files/rules_advanced.php
 | 
						|
     */
 | 
						|
    public function testGetListWithMultipleFiltersAndSorting()
 | 
						|
    {
 | 
						|
        /** @var $searchCriteriaBuilder  \Magento\Framework\Api\SearchCriteriaBuilder */
 | 
						|
        $searchCriteriaBuilder = $this->objectManager->create(
 | 
						|
            \Magento\Framework\Api\SearchCriteriaBuilder::class
 | 
						|
        );
 | 
						|
        /** @var $filterBuilder  \Magento\Framework\Api\FilterBuilder */
 | 
						|
        $filterBuilder = $this->objectManager->create(
 | 
						|
            \Magento\Framework\Api\FilterBuilder::class
 | 
						|
        );
 | 
						|
        /** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
 | 
						|
        $sortOrderBuilder = $this->objectManager->create(
 | 
						|
            \Magento\Framework\Api\SortOrderBuilder::class
 | 
						|
        );
 | 
						|
 | 
						|
        $filter1 = $filterBuilder->setField('is_rss')
 | 
						|
            ->setValue(1)
 | 
						|
            ->setConditionType('eq')
 | 
						|
            ->create();
 | 
						|
        $filter2 = $filterBuilder->setField('name')
 | 
						|
            ->setValue('#4')
 | 
						|
            ->setConditionType('eq')
 | 
						|
            ->create();
 | 
						|
        $filter3 = $filterBuilder->setField('uses_per_coupon')
 | 
						|
            ->setValue(1)
 | 
						|
            ->setConditionType('gt')
 | 
						|
            ->create();
 | 
						|
        $sortOrder = $sortOrderBuilder->setField('name')
 | 
						|
            ->setDirection('ASC')
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
 | 
						|
        $searchCriteriaBuilder->addFilters([$filter3]);
 | 
						|
        $searchCriteriaBuilder->addSortOrder($sortOrder);
 | 
						|
        $searchCriteriaBuilder->setPageSize(20);
 | 
						|
        $searchData = $searchCriteriaBuilder->create()->__toArray();
 | 
						|
 | 
						|
        $requestData = ['searchCriteria' => $searchData];
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::RESOURCE_PATH . '/search?' . http_build_query($requestData),
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'GetList',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $result = $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
        $this->assertArrayHasKey('items', $result);
 | 
						|
        $this->assertArrayHasKey('search_criteria', $result);
 | 
						|
        $this->assertCount(2, $result['items']);
 | 
						|
        $this->assertEquals('#1', $result['items'][0]['name']);
 | 
						|
        $this->assertEquals('#2', $result['items'][1]['name']);
 | 
						|
        $this->assertEquals($searchData, $result['search_criteria']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoApiDataFixture Magento/SalesRule/_files/cart_rule_100_percent_off_with_coupon.php
 | 
						|
     */
 | 
						|
    public function testUpdateRuleHavingSpecificCouponCode(): void
 | 
						|
    {
 | 
						|
        $searchCriteria = $this->objectManager->create(SearchCriteriaBuilder::class)
 | 
						|
            ->addFilter('name', '100% discount on orders for registered customers')
 | 
						|
            ->create();
 | 
						|
        $salesRules = $this->objectManager->create(RuleRepositoryInterface::class)
 | 
						|
            ->getList($searchCriteria)
 | 
						|
            ->getItems();
 | 
						|
        $ruleId = array_pop($salesRules)->getRuleId();
 | 
						|
        $inputData = $this->getSalesRuleData();
 | 
						|
        unset($inputData['name']);
 | 
						|
        $result = $this->updateRule($ruleId, $inputData);
 | 
						|
        $this->assertNotEmpty($result);
 | 
						|
        $coupon = $this->objectManager->create(Coupon::class);
 | 
						|
        $coupon->loadByCode('free_use');
 | 
						|
        $this->assertInstanceOf(Coupon::class, $coupon);
 | 
						|
        $this->assertEquals($ruleId, $coupon->getRuleId());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create Sales rule
 | 
						|
     *
 | 
						|
     * @param $rule
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    protected function createRule($rule)
 | 
						|
    {
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::RESOURCE_PATH,
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'Save',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $requestData = ['rule' => $rule];
 | 
						|
        return $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param int $id
 | 
						|
     * @return bool
 | 
						|
     * @throws \Exception
 | 
						|
     */
 | 
						|
    protected function deleteRule($id)
 | 
						|
    {
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::RESOURCE_PATH . '/' . $id,
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'DeleteById',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        return $this->_webApiCall($serviceInfo, ['rule_id' => $id]);
 | 
						|
    }
 | 
						|
 | 
						|
    protected function updateRule($id, $data)
 | 
						|
    {
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::RESOURCE_PATH . '/' . $id,
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'Save',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $data['rule_id'] = $id;
 | 
						|
        return $this->_webApiCall($serviceInfo, ['rule_id' => $id, 'rule' => $data]);
 | 
						|
    }
 | 
						|
 | 
						|
    protected function getRule($id)
 | 
						|
    {
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::RESOURCE_PATH . '/' . $id,
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'GetById',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        return $this->_webApiCall($serviceInfo, ['rule_id' => $id]);
 | 
						|
    }
 | 
						|
}
 |