Skip to content
This repository has been archived by the owner on Dec 19, 2019. It is now read-only.

387-Test coverage of getting IDs of CMS page/blocks by GraphQL API #585

Merged
merged 15 commits into from
May 10, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
7a90599
magento/graphql-ce#387: Test coverage of getting IDs of CMS page/bloc…
atwixfirster Apr 10, 2019
8a5b3b7
magento/graphql-ce#387: Test coverage of getting IDs of CMS page/bloc…
atwixfirster Apr 10, 2019
b8d93d8
magento/graphql-ce#387: Test coverage of getting IDs of CMS page/bloc…
atwixfirster Apr 11, 2019
263588a
magento/graphql-ce#387: Test coverage of getting IDs of CMS page/bloc…
atwixfirster Apr 16, 2019
81984dc
magento/graphql-ce#387: Test coverage of getting IDs of CMS page/bloc…
atwixfirster Apr 16, 2019
f4a4a34
magento/graphql-ce#387: Test coverage of getting IDs of CMS page/bloc…
atwixfirster Apr 24, 2019
aae7428
387-Test coverage of getting IDs of CMS page/blocks by GraphQL API
atwixfirster Apr 30, 2019
cf119be
387-Test coverage of getting IDs of CMS page/blocks by GraphQL API
atwixfirster May 3, 2019
ff658b5
387-Test coverage of getting IDs of CMS page/blocks by GraphQL API
atwixfirster May 3, 2019
fed22e0
387-Test coverage of getting IDs of CMS page/blocks by GraphQL API
atwixfirster May 6, 2019
b4ea6b9
387-Test coverage of getting IDs of CMS page/blocks by GraphQL API
atwixfirster May 6, 2019
4ee64a5
387-Test coverage of getting IDs of CMS page/blocks by GraphQL API
atwixfirster May 6, 2019
d7b7a2e
GraphQl-387: Test coverage of getting IDs of CMS page/blocks by Graph…
naydav May 8, 2019
478f438
Merge remote-tracking branch 'origin/2.3-develop' into 387-test-cover…
naydav May 8, 2019
787d31b
GraphQl-387: Test coverage of getting IDs of CMS page/blocks by Graph…
naydav May 8, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 53 additions & 6 deletions app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Page.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
namespace Magento\CmsGraphQl\Model\Resolver\DataProvider;

use Magento\Cms\Api\Data\PageInterface;
use Magento\Cms\Api\GetPageByIdentifierInterface;
use Magento\Cms\Api\PageRepositoryInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Widget\Model\Template\FilterEmulate;

/**
Expand All @@ -18,46 +20,89 @@
class Page
{
/**
* @var FilterEmulate
* @var GetPageByIdentifierInterface
*/
private $widgetFilter;
private $pageByIdentifier;

/**
* @var PageRepositoryInterface
*/
private $pageRepository;

/**
* @var StoreManagerInterface
*/
private $storeManager;

/**
* @var FilterEmulate
*/
private $widgetFilter;

/**
* @param PageRepositoryInterface $pageRepository
* @param FilterEmulate $widgetFilter
* @param GetPageByIdentifierInterface $getPageByIdentifier
* @param StoreManagerInterface $storeManager
*/
public function __construct(
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
PageRepositoryInterface $pageRepository,
FilterEmulate $widgetFilter
FilterEmulate $widgetFilter,
GetPageByIdentifierInterface $getPageByIdentifier,
StoreManagerInterface $storeManager
) {

$this->pageRepository = $pageRepository;
$this->widgetFilter = $widgetFilter;
$this->pageByIdentifier = $getPageByIdentifier;
$this->storeManager = $storeManager;
}

/**
* Get the page data
* Returns page data by page_id
*
* @param int $pageId
* @return array
* @throws NoSuchEntityException
*/
public function getData(int $pageId): array
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
public function getDataByPageId(int $pageId): array
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
{
$page = $this->pageRepository->getById($pageId);

return $this->convertPageData($page);
}

/**
* Returns page data by page identifier
*
* @param string $pageIdentifier
* @return array
* @throws NoSuchEntityException
*/
public function getDataByPageIdentifier(string $pageIdentifier): array
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
{
$storeId = (int)$this->storeManager->getStore()->getId();
$page = $this->pageByIdentifier->execute($pageIdentifier, $storeId);

return $this->convertPageData($page);
}

/**
* Convert page data
*
* @param PageInterface $page
* @return array
* @throws NoSuchEntityException
*/
private function convertPageData(PageInterface $page)
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
{
if (false === $page->isActive()) {
throw new NoSuchEntityException();
}

$renderedContent = $this->widgetFilter->filter($page->getContent());

$pageData = [
PageInterface::PAGE_ID => $page->getId(),
'url_key' => $page->getIdentifier(),
PageInterface::TITLE => $page->getTitle(),
PageInterface::CONTENT => $renderedContent,
Expand All @@ -66,6 +111,8 @@ public function getData(int $pageId): array
PageInterface::META_TITLE => $page->getMetaTitle(),
PageInterface::META_DESCRIPTION => $page->getMetaDescription(),
PageInterface::META_KEYWORDS => $page->getMetaKeywords(),
PageInterface::PAGE_ID => $page->getId(),
PageInterface::IDENTIFIER => $page->getIdentifier(),
];
return $pageData;
}
Expand Down
34 changes: 9 additions & 25 deletions app/code/Magento/CmsGraphQl/Model/Resolver/Page.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class Page implements ResolverInterface
private $pageDataProvider;

/**
*
* @param PageDataProvider $pageDataProvider
*/
public function __construct(
Expand All @@ -44,35 +45,18 @@ public function resolve(
array $value = null,
array $args = null
) {
$pageId = $this->getPageId($args);
$pageData = $this->getPageData($pageId);

return $pageData;
}

/**
* @param array $args
* @return int
* @throws GraphQlInputException
*/
private function getPageId(array $args): int
{
if (!isset($args['id'])) {
throw new GraphQlInputException(__('"Page id should be specified'));
if (!isset($args['id']) && !isset($args['identifier'])) {
throw new GraphQlInputException(__('"Page id/identifier should be specified'));
}

return (int)$args['id'];
}
$pageData = [];

/**
* @param int $pageId
* @return array
* @throws GraphQlNoSuchEntityException
*/
private function getPageData(int $pageId): array
{
try {
$pageData = $this->pageDataProvider->getData($pageId);
if (isset($args['id'])) {
$pageData = $this->pageDataProvider->getDataByPageId((int)$args['id']);
} elseif (isset($args['identifier'])) {
$pageData = $this->pageDataProvider->getDataByPageIdentifier((string)$args['identifier']);
}
} catch (NoSuchEntityException $e) {
throw new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
}
Expand Down
1 change: 1 addition & 0 deletions app/code/Magento/CmsGraphQl/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"php": "~7.1.3||~7.2.0",
"magento/framework": "*",
"magento/module-cms": "*",
"magento/module-store": "*",
"magento/module-widget": "*"
},
"suggest": {
Expand Down
4 changes: 3 additions & 1 deletion app/code/Magento/CmsGraphQl/etc/schema.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@ type StoreConfig @doc(description: "The type contains information about a store

type Query {
cmsPage (
id: Int @doc(description: "Id of the CMS page")
id: Int @doc(description: "Id of the CMS page") @deprecated(reason: "The `id` is deprecated. Use `identifier` instead.") @doc(description: "The CMS page query returns information about a CMS page")
identifier: String @doc(description: "Identifier of the CMS page")
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
): CmsPage @resolver(class: "Magento\\CmsGraphQl\\Model\\Resolver\\Page") @doc(description: "The CMS page query returns information about a CMS page") @cache(cacheTag: "cms_p", cacheIdentity: "Magento\\CmsGraphQl\\Model\\Resolver\\Page\\Identity")
cmsBlocks (
identifiers: [String] @doc(description: "Identifiers of the CMS blocks")
): CmsBlocks @resolver(class: "Magento\\CmsGraphQl\\Model\\Resolver\\Blocks") @doc(description: "The CMS block query returns information about CMS blocks") @cache(cacheTag: "cms_b", cacheIdentity: "Magento\\CmsGraphQl\\Model\\Resolver\\Block\\Identity")
}

type CmsPage @doc(description: "CMS page defines all CMS page information") {
identifier: String @doc(description: "Identifier of the CMS page")
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
url_key: String @doc(description: "URL key of CMS page")
title: String @doc(description: "CMS page title")
content: String @doc(description: "CMS page content")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
use Magento\TestFramework\TestCase\GraphQlAbstract;
use Magento\Widget\Model\Template\FilterEmulate;

/**
* Get CMS Block test
*/
class CmsBlockTest extends GraphQlAbstract
{
/**
Expand Down Expand Up @@ -64,6 +67,39 @@ public function testGetCmsBlock()
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->setUseSessionInUrl(false)->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
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
use Magento\TestFramework\ObjectManager;
use Magento\TestFramework\TestCase\GraphQlAbstract;

/**
* Get CMS Page test
*/
class CmsPageTest extends GraphQlAbstract
{
/**
Expand Down Expand Up @@ -50,6 +53,28 @@ public function testGetCmsPageById()
$this->assertEquals($cmsPageData['meta_keywords'], $response['cmsPage']['meta_keywords']);
}

/**
* Verify the fields of CMS Page selected by page_id
*
* @magentoApiDataFixture Magento/Cms/_files/pages.php
*/
public function testGetCmsPageByIdentifier()
{
$cmsPageIdentifier = 'page100';

$query =
<<<QUERY
{
cmsPage(identifier: "$cmsPageIdentifier") {
identifier
}
}
QUERY;

$response = $this->graphQlQuery($query);
$this->assertEquals($cmsPageIdentifier, $response['cmsPage']['identifier']);
}

/**
* Verify the message when page_id is not specified.
*/
Expand All @@ -72,7 +97,7 @@ public function testGetCmsPageWithoutId()
QUERY;

$this->expectException(\Exception::class);
$this->expectExceptionMessage('Page id should be specified');
$this->expectExceptionMessage('Page id/identifier should be specified');
$this->graphQlQuery($query);
}

Expand Down Expand Up @@ -102,6 +127,32 @@ public function testGetCmsPageByNonExistentId()
$this->graphQlQuery($query);
}

/**
* Verify the message when identifier does not exist.
*
* @expectedException \Exception
* @expectedExceptionMessage The CMS page with the "" ID doesn't exist.
*/
public function testGetCmsPageByNonExistentIdentifier()
{
$query =
<<<QUERY
{
cmsPage(identifier: "") {
url_key
title
content
content_heading
page_layout
meta_title
meta_description
meta_keywords
}
}
QUERY;
$this->graphQlQuery($query);
}

/**
* Verify the message when CMS Page selected by page_id is disabled
*
Expand Down Expand Up @@ -130,4 +181,32 @@ public function testGetDisabledCmsPageById()
$this->expectExceptionMessage('No such entity.');
$this->graphQlQuery($query);
}

/**
* Verify the message when CMS Page selected by identifier is disabled
*
* @magentoApiDataFixture Magento/Cms/_files/noroute.php
* @expectedException \Exception
* @expectedExceptionMessage The CMS page with the "no-route" ID doesn't exist.
*/
public function testGetDisabledCmsPageByIdentifier()
{
$cmsPageIdentifier = 'no-route';
$query =
<<<QUERY
{
cmsPage(identifier: "$cmsPageIdentifier") {
url_key
title
content
content_heading
page_layout
meta_title
meta_description
meta_keywords
}
}
QUERY;
$this->graphQlQuery($query);
}
}