// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include
#include "ValidationMock.h"
#include "graphqlservice/JSONResponse.h"
#include
#include
using namespace graphql;
using namespace std::literals;
class ValidationExamplesCase : public ::testing::Test
{
public:
static void SetUpTestCase()
{
_service = std::make_shared(std::make_shared(),
std::make_shared());
}
static void TearDownTestCase()
{
_service.reset();
}
protected:
static std::shared_ptr _service;
};
std::shared_ptr ValidationExamplesCase::_service;
TEST_F(ValidationExamplesCase, CounterExample102)
{
// https://spec.graphql.org/October2021/#example-12752
auto query = R"(query getDogName {
dog {
name
color
}
}
extend type Dog {
color: String
})"_graphql;
auto errors =
service::buildErrorValues(_service->validate(query)).release();
ASSERT_EQ(errors.size(), std::size_t { 2 });
EXPECT_EQ(
R"js({"message":"Undefined field type: Dog name: color","locations":[{"line":4,"column":5}]})js",
response::toJSON(std::move(errors[0])))
validate(query)).release();
ASSERT_EQ(errors.size(), std::size_t { 1 });
EXPECT_EQ(
R"js({"message":"Duplicate operation name: getName","locations":[{"line":7,"column":3}]})js",
response::toJSON(std::move(errors[0])))
validate(query)).release();
ASSERT_EQ(errors.size(), std::size_t { 1 });
EXPECT_EQ(
R"js({"message":"Duplicate operation name: dogOperation","locations":[{"line":7,"column":3}]})js",
response::toJSON(std::move(errors[0])))
validate(query);
ASSERT_TRUE(errors.empty());
}
TEST_F(ValidationExamplesCase, CounterExample107)
{
// https://spec.graphql.org/October2021/#example-44b85
auto query = R"({
dog {
name
}
}
query getName {
dog {
owner {
name
}
}
})"_graphql;
auto errors =
service::buildErrorValues(_service->validate(query)).release();
ASSERT_EQ(errors.size(), std::size_t { 1 });
EXPECT_EQ(
R"js({"message":"Anonymous operation not alone","locations":[{"line":1,"column":1}]})js",
response::toJSON(std::move(errors[0])))
validate(query);
ASSERT_TRUE(errors.empty());
}
TEST_F(ValidationExamplesCase, Example109)
{
// https://spec.graphql.org/October2021/#example-13061
auto query = R"(subscription sub {
...newMessageFields
}
fragment newMessageFields on Subscription {
newMessage {
body
sender
}
})"_graphql;
auto errors = _service->validate(query);
ASSERT_TRUE(errors.empty());
}
TEST_F(ValidationExamplesCase, CounterExample110)
{
// https://spec.graphql.org/October2021/#example-3997d
auto query = R"(subscription sub {
newMessage {
body
sender
}
disallowedSecondRootField
})"_graphql;
auto errors =
service::buildErrorValues(_service->validate(query)).release();
ASSERT_EQ(errors.size(), std::size_t { 1 });
EXPECT_EQ(
R"js({"message":"Subscription with more than one root field name: sub","locations":[{"line":1,"column":1}]})js",
response::toJSON(std::move(errors[0])))
validate(query)).release();
ASSERT_EQ(errors.size(), std::size_t { 1 });
EXPECT_EQ(
R"js({"message":"Subscription with more than one root field name: sub","locations":[{"line":1,"column":1}]})js",
response::toJSON(std::move(errors[0])))
validate(query)).release();
ASSERT_EQ(errors.size(), std::size_t { 1 });
EXPECT_EQ(
R"js({"message":"Subscription with Introspection root field name: sub","locations":[{"line":1,"column":1}]})js",
response::toJSON(std::move(errors[0])))
validate(query)).release();
EXPECT_EQ(errors.size(), std::size_t { 4 })