blitz_query_cpp
240 строк · 8.5 Кб
1#include <type_system/type_system_classes.hpp>2#include <gtest/gtest.h>3#include <gmock/gmock.h>4#include <type_system/schema.hpp>5#include <type_system/schema_parser.hpp>6#include <type_system/builtin_types.hpp>7
8#include <filesystem>9#include <fstream>10#include <string>11
12using namespace blitz_query_cpp;13
14TEST(Schema, ParseSchemaDef)15{
16std::string scm = "schema { query: Query mutation: Mutation }";17schema_t my_schema;18schema_parser_t parser;19bool res = parser.parse(my_schema, scm);20EXPECT_EQ(res, true);21EXPECT_EQ(my_schema.query_type_name, "Query");22EXPECT_EQ(my_schema.mutation_type_name, "Mutation");23}
24
25TEST(Schema, ParseScalarDef)26{
27std::string scm = "\"scalar description\" scalar UUID @specifiedBy(url: \"https://tools.ietf.org/html/rfc4122\" foo: {bar: 1 baz: false}, param: null)";28schema_t my_schema;29schema_parser_t parser;30bool res = parser.parse(my_schema, scm);31ASSERT_EQ(res, true);32ASSERT_EQ(my_schema.types.size(), 1u);33auto &type = *my_schema.types.begin();34EXPECT_EQ(type.description, "scalar description");35EXPECT_EQ(type.kind, type_kind::Scalar);36ASSERT_EQ(type.directives.size(), 1u);37EXPECT_EQ(type.directives[0].name, "@specifiedBy");38}
39
40TEST(Schema, ParseEnumDef)41{
42std::string scm = "\"enum description\" enum BookGenre @foo {ART CHILDREN_BOOK SCIENCE}";43schema_t my_schema;44schema_parser_t parser;45bool res = parser.parse(my_schema, scm);46ASSERT_EQ(res, true);47ASSERT_EQ(my_schema.types.size(), 1u);48auto &type = *my_schema.types.begin();49EXPECT_EQ(type.directives.size(), 1u);50
51EXPECT_EQ(type.description, "enum description");52ASSERT_EQ(type.kind, type_kind::Enum);53ASSERT_EQ(type.fields.size(), 3u);54ASSERT_EQ(type.fields.contains("ART"), true);55ASSERT_EQ(type.fields.contains("CHILDREN_BOOK"), true);56ASSERT_EQ(type.fields.contains("SCIENCE"), true);57}
58
59TEST(Schema, ParseDirectiveDef)60{
61std::string scm = "\"directive description\" directive @foo (\"param descr\" param: String!, foo :Foo = {bar: 1 buz: true}) repeatable on SCALAR | ENUM";62schema_t my_schema;63schema_parser_t parser;64bool res = parser.parse(my_schema, scm);65ASSERT_EQ(res, true);66ASSERT_EQ(my_schema.directive_types.size(), 1u);67auto &type = *my_schema.directive_types.begin();68EXPECT_EQ(type.description, "directive description");69EXPECT_EQ(type.name, "@foo");70EXPECT_EQ(type.target, directive_target_t::Scalar | directive_target_t::Enum | directive_target_t::IsRepeatable);71
72EXPECT_EQ(type.arguments.size(), 2u);73ASSERT_EQ(type.arguments.contains("param"), true);74ASSERT_EQ(type.arguments.contains("foo"), true);75
76auto param = *type.arguments.find("param");77EXPECT_EQ(param.field_type.name, "String");78EXPECT_EQ(param.field_type.not_nullable, 1u);79EXPECT_EQ(param.description, "param descr");80EXPECT_EQ(param.default_value.value_type, value_kind::None);81
82auto foo = *type.arguments.find("foo");83EXPECT_EQ(foo.field_type.name, "Foo");84EXPECT_EQ(foo.field_type.not_nullable, 0u);85EXPECT_EQ(foo.description, "");86EXPECT_EQ(foo.default_value.value_type, value_kind::Object);87}
88
89TEST(Schema, ParseUnionDef)90{
91std::string scm = "\"union description\" union MyUnion @foo = User | Group";92schema_t my_schema;93schema_parser_t parser;94bool res = parser.parse(my_schema, scm);95ASSERT_EQ(res, true);96
97auto &type = *my_schema.types.begin();98EXPECT_EQ(type.directives.size(), 1u);99
100EXPECT_EQ(type.description, "union description");101ASSERT_EQ(type.kind, type_kind::Union);102ASSERT_EQ(type.implements.size(), 2u);103ASSERT_EQ(type.implements.contains("User"), true);104ASSERT_EQ(type.implements.contains("Group"), true);105}
106
107TEST(Schema, ParseInputDef)108{
109std::string scm = "\"input description\" input fileInput @foo { \"file is deleted\" deleted: Boolean! = true @bar name: String Id: UUID }";110schema_t my_schema;111schema_parser_t parser;112bool res = parser.parse(my_schema, scm);113ASSERT_EQ(res, true);114
115auto &type = *my_schema.types.begin();116EXPECT_EQ(type.directives.size(), 1u);117EXPECT_EQ(type.directives[0].name, "@foo");118
119EXPECT_EQ(type.description, "input description");120EXPECT_EQ(type.kind, type_kind::InputObject);121EXPECT_EQ(type.fields.size(), 3u);122ASSERT_EQ(type.fields.contains("deleted"), true);123ASSERT_EQ(type.fields.contains("name"), true);124ASSERT_EQ(type.fields.contains("Id"), true);125
126auto deleted = *type.fields.find("deleted");127EXPECT_EQ(deleted.description, "file is deleted");128EXPECT_EQ(deleted.declaring_type.name, "fileInput");129EXPECT_EQ(deleted.field_type.name, "Boolean");130EXPECT_EQ(deleted.field_type.not_nullable, 1u);131EXPECT_EQ(deleted.field_type.list_nesting_depth, 0);132EXPECT_EQ(deleted.default_value.value_type, value_kind::Boolean);133EXPECT_EQ(deleted.default_value.bool_value, true);134EXPECT_EQ(deleted.directives.size(), 1u);135EXPECT_EQ(deleted.directives[0].name, "@bar");136EXPECT_EQ(deleted.index, 0);137EXPECT_EQ(deleted.is_optional(), true);138}
139
140TEST(Schema, ParseTypeDef)141{
142std::string scm = "\"files descr\" type Files implements FileSystem @foo(bar:\"baz\") { \"file descr\" file(skip: Int take: Int where: fileFilterInput order: [fileSortInput!]): fileCollectionSegment @bar }";143schema_t my_schema;144schema_parser_t parser;145bool res = parser.parse(my_schema, scm);146EXPECT_EQ(parser.get_error_msg(), "");147ASSERT_EQ(res, true);148
149auto &type = *my_schema.types.begin();150EXPECT_EQ(type.directives.size(), 1u);151EXPECT_EQ(type.directives[0].name, "@foo");152EXPECT_EQ(type.directives[0].parameters.contains("bar"), true);153
154EXPECT_EQ(type.description, "files descr");155EXPECT_EQ(type.kind, type_kind::Object);156EXPECT_EQ(type.fields.size(), 1u);157ASSERT_EQ(type.fields.contains("file"), true);158
159auto file = *type.fields.find("file");160EXPECT_EQ(file.description, "file descr");161EXPECT_EQ(file.declaring_type.name, "Files");162EXPECT_EQ(file.field_type.name, "fileCollectionSegment");163EXPECT_EQ(file.field_type.not_nullable, 0u);164EXPECT_EQ(file.field_type.list_nesting_depth, 0);165EXPECT_EQ(file.directives.size(), 1u);166EXPECT_EQ(file.directives[0].name, "@bar");167EXPECT_EQ(file.index, 0);168EXPECT_EQ(file.is_optional(), true);169}
170
171TEST(Schema, ParseInterfaceDef)172{
173std::string scm = "\"interface descr\" interface FileSystem @foo(bar:\"baz\") { \"file descr\" file(skip: Int take: Int where: fileFilterInput order: [fileSortInput!]): fileCollectionSegment @bar }";174schema_t my_schema;175schema_parser_t parser;176bool res = parser.parse(my_schema, scm);177EXPECT_EQ(parser.get_error_msg(), "");178ASSERT_EQ(res, true);179
180auto &type = *my_schema.types.begin();181EXPECT_EQ(type.directives.size(), 1u);182EXPECT_EQ(type.directives[0].name, "@foo");183EXPECT_EQ(type.directives[0].parameters.contains("bar"), true);184
185EXPECT_EQ(type.description, "interface descr");186EXPECT_EQ(type.kind, type_kind::Object);187EXPECT_EQ(type.fields.size(), 1u);188ASSERT_EQ(type.fields.contains("file"), true);189
190auto file = *type.fields.find("file");191EXPECT_EQ(file.description, "file descr");192EXPECT_EQ(file.declaring_type.name, "FileSystem");193EXPECT_EQ(file.field_type.name, "fileCollectionSegment");194EXPECT_EQ(file.field_type.not_nullable, 0u);195EXPECT_EQ(file.field_type.list_nesting_depth, 0);196EXPECT_EQ(file.directives.size(), 1u);197EXPECT_EQ(file.directives[0].name, "@bar");198EXPECT_EQ(file.index, 0);199EXPECT_EQ(file.is_optional(), true);200}
201
202namespace fs = std::filesystem;203
204std::string readFile(fs::path path)205{
206std::ifstream f(path, std::ios::in | std::ios::binary);207const auto sz = fs::file_size(path);208std::string result(sz, '\0');209f.read(result.data(), sz);210return result;211}
212
213TEST(Schema, LoadSchema)214{
215std::string scm = readFile("test_data/schema.graphql");216schema_t my_schema;217schema_parser_t parser;218bool res = parser.parse(my_schema, scm);219EXPECT_EQ(parser.get_error_msg(), "");220ASSERT_EQ(res, true);221}
222
223TEST(Schema, SchemaIntrospectionTypes)224{
225schema_t my_schema;226bool res = add_introspection_types(my_schema);227ASSERT_EQ(res, true);228}
229
230
231TEST(Schema, ParseObjectExt)232{
233std::string scm = "type Foo{bar:Int} extend type Foo{baz:Int} ";234schema_t my_schema;235schema_parser_t parser;236bool res = parser.parse(my_schema, scm);237EXPECT_EQ(parser.get_error_msg(), "");238ASSERT_EQ(res, true);239
240}