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 7 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
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
use Magento\Widget\Model\Template\FilterEmulate;

/**
* @deprecated
* @see Magento\CmsGraphQl\Model\Resolver\DataProvider\PageDataProvider
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
*
* Cms page data provider
*/
class Page
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

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;

/**
* Cms page data provider
*/
class PageDataProvider
{
/**
* @var GetPageByIdentifierInterface
*/
private $pageByIdentifier;

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

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

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

/**
* @param GetPageByIdentifierInterface $getPageByIdentifier
* @param FilterEmulate $widgetFilter
* @param PageRepositoryInterface $pageRepository
* @param StoreManagerInterface $storeManager
*/
public function __construct(
GetPageByIdentifierInterface $getPageByIdentifier,
FilterEmulate $widgetFilter,
PageRepositoryInterface $pageRepository,
StoreManagerInterface $storeManager
) {
$this->pageByIdentifier = $getPageByIdentifier;
$this->pageRepository = $pageRepository;
$this->storeManager = $storeManager;
$this->widgetFilter = $widgetFilter;
}

/**
* @param int $pageId
* @return array
* @throws NoSuchEntityException
*/
public function getDataByPageId(int $pageId): array
{
$page = $this->pageRepository->getById($pageId);

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

/**
* @param string $pageIdentifier
* @return array
*/
public function getDataByPageIdentifier(string $pageIdentifier): array
{
$storeId = (int)$this->storeManager->getStore()->getId();
$page = $this->pageByIdentifier->execute($pageIdentifier, $storeId);

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

/**
* @param PageInterface $page
* @return array
* @throws NoSuchEntityException
*/
private function convertPageData(PageInterface $page)
{
if (false === $page->isActive()) {
throw new NoSuchEntityException();
}

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

$pageData = [
'url_key' => $page->getIdentifier(),
PageInterface::IDENTIFIER => $page->getIdentifier(),
PageInterface::TITLE => $page->getTitle(),
PageInterface::CONTENT => $renderedContent,
PageInterface::CONTENT_HEADING => $page->getContentHeading(),
PageInterface::PAGE_LAYOUT => $page->getPageLayout(),
PageInterface::META_TITLE => $page->getMetaTitle(),
PageInterface::META_DESCRIPTION => $page->getMetaDescription(),
PageInterface::META_KEYWORDS => $page->getMetaKeywords(),
];
return $pageData;
}
}
47 changes: 37 additions & 10 deletions app/code/Magento/CmsGraphQl/Model/Resolver/Page.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Magento\CmsGraphQl\Model\Resolver;

use Magento\CmsGraphQl\Model\Resolver\DataProvider\Page as PageDataProvider;
use Magento\CmsGraphQl\Model\Resolver\DataProvider\PageDataProvider as PageDataProvider;
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\GraphQl\Config\Element\Field;
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
Expand All @@ -26,6 +26,7 @@ class Page implements ResolverInterface
private $pageDataProvider;

/**
*
* @param PageDataProvider $pageDataProvider
*/
public function __construct(
Expand All @@ -44,35 +45,61 @@ public function resolve(
array $value = null,
array $args = null
) {
$pageId = $this->getPageId($args);
$pageData = $this->getPageData($pageId);
if (!isset($args['id']) && !isset($args['identifier'])) {
throw new GraphQlInputException(__('"Page id/identifier should be specified'));
}

if (isset($args['id'])) {
$pageData = $this->getPageDataById($this->getPageId($args));
} elseif (isset($args['identifier'])) {
$pageData = $this->getPageDataByIdentifier($this->getPageIdentifier($args));
}

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'));
}
return isset($args['id']) ? (int)$args['id'] : 0;
}

return (int)$args['id'];
/**
* @param array $args
* @return string
*/
private function getPageIdentifier(array $args): string
{
return isset($args['identifier']) ? (string)$args['identifier'] : '';
}

/**
* @param int $pageId
* @return array
* @throws GraphQlNoSuchEntityException
*/
private function getPageData(int $pageId): array
private function getPageDataById(int $pageId): array
{
try {
$pageData = $this->pageDataProvider->getDataByPageId($pageId);
} catch (NoSuchEntityException $e) {
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
throw new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
}
return $pageData;
}

/**
* @param string $pageIdentifier
* @return array
* @throws GraphQlNoSuchEntityException
*/
private function getPageDataByIdentifier(string $pageIdentifier): array
{
try {
$pageData = $this->pageDataProvider->getData($pageId);
$pageData = $this->pageDataProvider->getDataByPageIdentifier($pageIdentifier);
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
} 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: "Use `identifier`") @doc(description: "The CMS page query returns information about a CMS page")
vpodorozh marked this conversation as resolved.
Show resolved Hide resolved
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 @@ -64,6 +64,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 @@ -50,6 +50,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 +94,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 +124,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 +178,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);
}
}