magento2-docker/dev/tests/api-functional/testsuite/Magento/GraphQl/Cms/CmsBlockTest.php

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;
}
}