478 lines
17 KiB
PHP
Executable File
478 lines
17 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\GraphQl\Framework;
|
|
|
|
use Magento\TestFramework\TestCase\GraphQlAbstract;
|
|
|
|
/**
|
|
* Tests query complexity limiter and depth limiter.
|
|
* Actual for production mode only
|
|
*/
|
|
class QueryComplexityLimiterTest extends GraphQlAbstract
|
|
{
|
|
/**
|
|
* @magentoApiDataFixture Magento/Catalog/_files/product_virtual.php
|
|
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
|
*/
|
|
public function testQueryComplexityIsLimited()
|
|
{
|
|
$query
|
|
= <<<QUERY
|
|
{
|
|
category(id: 2) {
|
|
products {
|
|
items {
|
|
name
|
|
nameAlias: name
|
|
...configurableFields
|
|
... on BundleProduct {
|
|
items {
|
|
options {
|
|
uid
|
|
label
|
|
}
|
|
}
|
|
}
|
|
categories {
|
|
id
|
|
position
|
|
level
|
|
url_key
|
|
url_path
|
|
product_count
|
|
breadcrumbs {
|
|
category_id
|
|
category_name
|
|
category_url_key
|
|
}
|
|
products {
|
|
items {
|
|
media_gallery_entries {
|
|
file
|
|
}
|
|
name
|
|
special_to_date
|
|
tier_price
|
|
manufacturer
|
|
thumbnail {
|
|
url
|
|
label
|
|
}
|
|
sku
|
|
image {
|
|
url
|
|
label
|
|
}
|
|
canonical_url
|
|
categories {
|
|
id
|
|
position
|
|
level
|
|
url_key
|
|
url_path
|
|
product_count
|
|
breadcrumbs {
|
|
category_id
|
|
category_name
|
|
category_url_key
|
|
}
|
|
products {
|
|
items {
|
|
name
|
|
special_to_date
|
|
thumbnail {
|
|
url
|
|
label
|
|
}
|
|
tier_price
|
|
manufacturer
|
|
sku
|
|
image {
|
|
url
|
|
label
|
|
}
|
|
canonical_url
|
|
media_gallery_entries {
|
|
position
|
|
id
|
|
types
|
|
}
|
|
categories {
|
|
id
|
|
position
|
|
level
|
|
url_key
|
|
url_path
|
|
product_count
|
|
breadcrumbs {
|
|
category_id
|
|
category_name
|
|
category_url_key
|
|
}
|
|
products {
|
|
items {
|
|
name
|
|
special_to_date
|
|
tier_price
|
|
manufacturer
|
|
thumbnail {
|
|
url
|
|
label
|
|
}
|
|
sku
|
|
image {
|
|
url
|
|
label
|
|
}
|
|
canonical_url
|
|
categories {
|
|
id
|
|
position
|
|
level
|
|
url_key
|
|
url_path
|
|
product_count
|
|
breadcrumbs {
|
|
category_id
|
|
category_name
|
|
category_url_key
|
|
}
|
|
products {
|
|
items {
|
|
name
|
|
special_to_date
|
|
tier_price
|
|
manufacturer
|
|
sku
|
|
image {
|
|
url
|
|
label
|
|
}
|
|
canonical_url
|
|
categories {
|
|
id
|
|
position
|
|
level
|
|
url_key
|
|
url_path
|
|
product_count
|
|
breadcrumbs {
|
|
category_id
|
|
category_name
|
|
category_url_key
|
|
}
|
|
products {
|
|
items {
|
|
name
|
|
special_to_date
|
|
price {
|
|
minimalPrice {
|
|
amount {
|
|
value
|
|
currency
|
|
}
|
|
}
|
|
maximalPrice {
|
|
amount {
|
|
value
|
|
currency
|
|
}
|
|
}
|
|
regularPrice {
|
|
amount {
|
|
value
|
|
currency
|
|
}
|
|
}
|
|
}
|
|
tier_price
|
|
special_price
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_prices {
|
|
customer_group_id
|
|
qty
|
|
percentage_value
|
|
website_id
|
|
}
|
|
tier_price
|
|
manufacturer
|
|
sku
|
|
image {
|
|
url
|
|
label
|
|
}
|
|
thumbnail {
|
|
url
|
|
label
|
|
}
|
|
canonical_url
|
|
categories {
|
|
id
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
position
|
|
level
|
|
url_key
|
|
url_path
|
|
product_count
|
|
default_sort_by
|
|
breadcrumbs {
|
|
category_id
|
|
category_name
|
|
category_url_key
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fragment configurableFields on ConfigurableProduct {
|
|
variants {
|
|
attributes {
|
|
uid
|
|
code
|
|
label
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
|
|
self::expectExceptionMessageMatches('/Max query complexity should be 300 but got 302/');
|
|
//Use POST request because request uri is too large for some servers
|
|
$this->graphQlMutation($query);
|
|
}
|
|
|
|
/**
|
|
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
|
*/
|
|
public function testQueryDepthIsLimited()
|
|
{
|
|
$query
|
|
= <<<QUERY
|
|
{
|
|
category(id: 2) {
|
|
products {
|
|
items {
|
|
name
|
|
categories {
|
|
products {
|
|
items {
|
|
media_gallery_entries {
|
|
file
|
|
}
|
|
categories {
|
|
products {
|
|
items {
|
|
categories {
|
|
products {
|
|
items {
|
|
categories {
|
|
products {
|
|
items {
|
|
categories {
|
|
products {
|
|
items {
|
|
categories {
|
|
products {
|
|
items {
|
|
categories {
|
|
products {
|
|
items {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
QUERY;
|
|
self::expectExceptionMessageMatches('/Max query depth should be 20 but got 23/');
|
|
$this->graphQlQuery($query);
|
|
}
|
|
}
|