337 lines
10 KiB
PHP
Executable File
337 lines
10 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\GraphQl\Cms;
|
|
|
|
use Magento\Cms\Api\BlockRepositoryInterface;
|
|
use Magento\Store\Model\Store;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use Magento\TestFramework\TestCase\GraphQl\ResponseContainsErrorsException;
|
|
use Magento\TestFramework\TestCase\GraphQlAbstract;
|
|
use Magento\Widget\Model\Template\FilterEmulate;
|
|
|
|
/**
|
|
* Get CMS Block test
|
|
*/
|
|
class CmsBlockTest extends GraphQlAbstract
|
|
{
|
|
/**
|
|
* @var BlockRepositoryInterface
|
|
*/
|
|
private $blockRepository;
|
|
|
|
/**
|
|
* @var FilterEmulate
|
|
*/
|
|
private $filterEmulate;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->blockRepository = Bootstrap::getObjectManager()->get(BlockRepositoryInterface::class);
|
|
$this->filterEmulate = Bootstrap::getObjectManager()->get(FilterEmulate::class);
|
|
}
|
|
|
|
/**
|
|
* Verify the fields of CMS Block selected by identifiers
|
|
*
|
|
* @magentoApiDataFixture Magento/Cms/_files/blocks.php
|
|
*/
|
|
public function testGetCmsBlock()
|
|
{
|
|
$cmsBlock = $this->blockRepository->getById('enabled_block');
|
|
$cmsBlockData = $cmsBlock->getData();
|
|
$renderedContent = $this->filterEmulate->filter($cmsBlock->getContent());
|
|
|
|
$query =
|
|
<<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: "enabled_block") {
|
|
items {
|
|
identifier
|
|
title
|
|
content
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
$response = $this->graphQlQuery($query);
|
|
|
|
self::assertArrayHasKey('cmsBlocks', $response);
|
|
self::assertArrayHasKey('items', $response['cmsBlocks']);
|
|
|
|
self::assertEquals($cmsBlockData['identifier'], $response['cmsBlocks']['items'][0]['identifier']);
|
|
self::assertEquals($cmsBlockData['title'], $response['cmsBlocks']['items'][0]['title']);
|
|
self::assertEquals($renderedContent, $response['cmsBlocks']['items'][0]['content']);
|
|
}
|
|
|
|
/**
|
|
* Verify the fields of CMS Block selected by block_id
|
|
*
|
|
* @magentoApiDataFixture Magento/Cms/_files/blocks.php
|
|
*/
|
|
public function testGetCmsBlockByBlockId()
|
|
{
|
|
$cmsBlock = $this->blockRepository->getById('enabled_block');
|
|
$cmsBlockData = $cmsBlock->getData();
|
|
$blockId = $cmsBlockData['block_id'];
|
|
$renderedContent = $this->filterEmulate->filter($cmsBlock->getContent());
|
|
|
|
$query =
|
|
<<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: "$blockId") {
|
|
items {
|
|
identifier
|
|
title
|
|
content
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
$response = $this->graphQlQuery($query);
|
|
|
|
self::assertArrayHasKey('cmsBlocks', $response);
|
|
self::assertArrayHasKey('items', $response['cmsBlocks']);
|
|
self::assertEquals($cmsBlockData['identifier'], $response['cmsBlocks']['items'][0]['identifier']);
|
|
self::assertEquals($cmsBlockData['title'], $response['cmsBlocks']['items'][0]['title']);
|
|
self::assertEquals($renderedContent, $response['cmsBlocks']['items'][0]['content']);
|
|
}
|
|
|
|
/**
|
|
* Verify the message when CMS Block is disabled
|
|
*
|
|
*
|
|
* @magentoApiDataFixture Magento/Cms/_files/blocks.php
|
|
*/
|
|
public function testGetDisabledCmsBlock()
|
|
{
|
|
$this->expectException(\Exception::class);
|
|
$this->expectExceptionMessage('The CMS block with the "disabled_block" ID doesn\'t exist');
|
|
|
|
$query =
|
|
<<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: "disabled_block") {
|
|
items {
|
|
identifier
|
|
title
|
|
content
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
$this->graphQlQuery($query);
|
|
}
|
|
|
|
/**
|
|
* Verify the message when identifiers were not specified
|
|
*
|
|
*/
|
|
public function testGetCmsBlocksWithoutIdentifiers()
|
|
{
|
|
$this->expectException(\Exception::class);
|
|
$this->expectExceptionMessage('"identifiers" of CMS blocks should be specified');
|
|
|
|
$query =
|
|
<<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: []) {
|
|
items {
|
|
identifier
|
|
title
|
|
content
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
$this->graphQlQuery($query);
|
|
}
|
|
|
|
/**
|
|
* Verify the message when CMS Block with such identifiers does not exist
|
|
*
|
|
*/
|
|
public function testGetCmsBlockByNonExistentIdentifier()
|
|
{
|
|
$this->expectException(\Exception::class);
|
|
$this->expectExceptionMessage('The CMS block with the "nonexistent_id" ID doesn\'t exist.');
|
|
|
|
$query =
|
|
<<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: "nonexistent_id") {
|
|
items {
|
|
identifier
|
|
title
|
|
content
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
$this->graphQlQuery($query);
|
|
}
|
|
|
|
/**
|
|
* Verify the fields of CMS Block selected by identifiers
|
|
*
|
|
* @magentoApiDataFixture Magento/Cms/_files/blocks.php
|
|
*/
|
|
public function testGetEnabledAndDisabledCmsBlockInOneRequest()
|
|
{
|
|
$query =
|
|
<<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: ["enabled_block", "disabled_block"]) {
|
|
items {
|
|
identifier
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
|
|
try {
|
|
$this->graphQlQuery($query);
|
|
self::fail('Response should contains errors.');
|
|
} catch (ResponseContainsErrorsException $e) {
|
|
$responseData = $e->getResponseData();
|
|
}
|
|
|
|
self::assertNotEmpty($responseData);
|
|
self::assertEquals('enabled_block', $responseData['data']['cmsBlocks']['items'][0]['identifier']);
|
|
self::assertEquals(
|
|
'The CMS block with the "disabled_block" ID doesn\'t exist.',
|
|
$responseData['errors'][0]['message']
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Verify correct CMS block information per store
|
|
*
|
|
* @magentoApiDataFixture Magento/Store/_files/multiple_websites_with_store_groups_stores.php
|
|
* @magentoApiDataFixture Magento/Cms/_files/blocks_for_different_stores.php
|
|
*/
|
|
public function testGetCmsBlockPerSpecificStore(): void
|
|
{
|
|
$blockIdentifier1 = 'test-block';
|
|
$blockIdentifier2 = 'test-block-2';
|
|
$secondStoreCode = 'second_store_view';
|
|
$thirdStoreCode = 'third_store_view';
|
|
|
|
//Verify the correct block information for second store is returned
|
|
$cmsBlockResponseSecondStore = $this->getCmsBlockQuery($blockIdentifier1, $secondStoreCode);
|
|
self::assertArrayHasKey('cmsBlocks', $cmsBlockResponseSecondStore);
|
|
self::assertArrayHasKey('items', $cmsBlockResponseSecondStore['cmsBlocks']);
|
|
self::assertEquals('test-block', $cmsBlockResponseSecondStore['cmsBlocks']['items'][0]['identifier']);
|
|
self::assertEquals('Second store block', $cmsBlockResponseSecondStore['cmsBlocks']['items'][0]['title']);
|
|
self::assertEquals('second_store_view', $cmsBlockResponseSecondStore['storeConfig']['code']);
|
|
|
|
//Verify the correct block information for third store is returned
|
|
$cmsBlockResponseThirdStore = $this->getCmsBlockQuery($blockIdentifier1, $thirdStoreCode);
|
|
self::assertArrayHasKey('cmsBlocks', $cmsBlockResponseThirdStore);
|
|
self::assertArrayHasKey('items', $cmsBlockResponseThirdStore['cmsBlocks']);
|
|
self::assertEquals('test-block', $cmsBlockResponseThirdStore['cmsBlocks']['items'][0]['identifier']);
|
|
self::assertEquals('Third store block', $cmsBlockResponseThirdStore['cmsBlocks']['items'][0]['title']);
|
|
self::assertEquals('third_store_view', $cmsBlockResponseThirdStore['storeConfig']['code']);
|
|
|
|
//Verify the correct block information for second block for second store is returned
|
|
$cmsBlockResponseSecondStore = $this->getCmsBlockQuery($blockIdentifier2, $secondStoreCode);
|
|
self::assertArrayHasKey('cmsBlocks', $cmsBlockResponseSecondStore);
|
|
self::assertArrayHasKey('items', $cmsBlockResponseSecondStore['cmsBlocks']);
|
|
self::assertEquals('test-block-2', $cmsBlockResponseSecondStore['cmsBlocks']['items'][0]['identifier']);
|
|
self::assertEquals('Second store block 2', $cmsBlockResponseSecondStore['cmsBlocks']['items'][0]['title']);
|
|
self::assertEquals('second_store_view', $cmsBlockResponseSecondStore['storeConfig']['code']);
|
|
|
|
//Verify that exception is returned if block is not assigned to the store specified
|
|
$this->expectException(\Exception::class);
|
|
$this->expectExceptionMessage('The CMS block with the "test-block-2" ID doesn\'t exist');
|
|
|
|
$query =
|
|
<<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: "$blockIdentifier2") {
|
|
items {
|
|
identifier
|
|
title
|
|
content
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
$headerMap['Store'] = $thirdStoreCode;
|
|
$this->graphQlQuery($query, [], '', $headerMap);
|
|
}
|
|
|
|
/**
|
|
* Verify CMS block for a disabled store
|
|
*
|
|
* @magentoApiDataFixture Magento/Store/_files/multiple_websites_with_store_groups_stores.php
|
|
* @magentoApiDataFixture Magento/Cms/_files/blocks_for_different_stores.php
|
|
*/
|
|
public function testGetCmsBlockForDisabledStore(): void
|
|
{
|
|
$blockIdentifier = 'test-block';
|
|
$thirdStoreCode = 'third_store_view';
|
|
$store = Bootstrap::getObjectManager()->get(Store::class);
|
|
$store->load('third_store_view', 'code')->setIsActive(0)->save();
|
|
$this->expectException(\Exception::class);
|
|
$this->expectExceptionMessage('Requested store is not found');
|
|
$this->getCmsBlockQuery($blockIdentifier, $thirdStoreCode);
|
|
}
|
|
|
|
/**
|
|
* @magentoApiDataFixture Magento/Cms/_files/block_default_store.php
|
|
*/
|
|
public function testGetCmsBlockAssignedToDefaultStore(): void
|
|
{
|
|
$blockIdentifier = 'default_store_block';
|
|
$query = <<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: "$blockIdentifier") {
|
|
items {
|
|
identifier
|
|
title
|
|
content
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
$response = $this->graphQlQuery($query);
|
|
$this->assertArrayNotHasKey('errors', $response);
|
|
$this->assertArrayHasKey('cmsBlocks', $response);
|
|
$this->assertCount(1, $response['cmsBlocks']['items']);
|
|
$this->assertEquals($blockIdentifier, $response['cmsBlocks']['items'][0]['identifier']);
|
|
}
|
|
|
|
/**
|
|
* Get cmsBlockQuery per store
|
|
*
|
|
* @param string $blockIdentifier
|
|
* @param string $storeCode
|
|
* @return array
|
|
* @throws \Exception
|
|
*/
|
|
private function getCmsBlockQuery($blockIdentifier, $storeCode): array
|
|
{
|
|
$query =
|
|
<<<QUERY
|
|
{
|
|
cmsBlocks(identifiers: "$blockIdentifier") {
|
|
items {
|
|
identifier
|
|
title
|
|
content
|
|
}
|
|
}
|
|
storeConfig{code}
|
|
}
|
|
QUERY;
|
|
$headerMap['Store'] = $storeCode;
|
|
$response = $this->graphQlQuery($query, [], '', $headerMap);
|
|
return $response;
|
|
}
|
|
}
|