예제 #1
0
        public void AddSchemaFromString()
        {
            // arrange
            var builder = new MockStitchingBuilder();

            // act
            builder.AddSchemaFromString("contract",
                                        FileResource.Open("Contract.graphql"))
            .AddSchemaFromString("customer",
                                 FileResource.Open("Customer.graphql"));

            // assert
            var services = new EmptyServiceProvider();
            var merger   = new SchemaMerger();

            foreach (KeyValuePair <NameString, LoadSchemaDocument> item in
                     builder.Schemas)
            {
                merger.AddSchema(item.Key, item.Value.Invoke(services));
            }

            SchemaSyntaxSerializer.Serialize(merger.Merge()).MatchSnapshot();
        }
예제 #2
0
        public void LastFieldRenameWins()
        {
            // arrange
            DocumentNode schema_a =
                Utf8GraphQLParser.Parse(
                    "type A { b1: B } " +
                    "type B implements D { c: String } " +
                    "type C implements D { c: String } " +
                    "interface D { c: String }");

            DocumentNode schema_b =
                Utf8GraphQLParser.Parse(
                    "type B { b1: String b3: String } type C { c: String }");

            // act
            DocumentNode a = SchemaMerger.New()
                             .AddSchema("A", schema_a)
                             .AddSchema("B", schema_b)
                             .RenameField("A", new FieldReference("B", "c"), "c123")
                             .RenameField("A", new FieldReference("C", "c"), "c456")
                             .RenameField("A", new FieldReference("D", "c"), "c789")
                             .Merge();

            DocumentNode b = SchemaMerger.New()
                             .AddSchema("A", schema_a)
                             .AddSchema("B", schema_b)
                             .RenameField("A", new FieldReference("B", "c"), "c123")
                             .RenameField("A", new FieldReference("D", "c"), "c789")
                             .RenameField("A", new FieldReference("C", "c"), "c456")
                             .Merge();

            // assert
            SchemaSyntaxSerializer.Serialize(a).MatchSnapshot(
                SnapshotNameExtension.Create("A"));
            SchemaSyntaxSerializer.Serialize(b).MatchSnapshot(
                SnapshotNameExtension.Create("B"));
        }
        public void Merge_DifferentTypes_InputMergesLeftoversArePassed()
        {
            // arrange
            DocumentNode schema_a =
                Parser.Default.Parse("input A { b: String }");
            DocumentNode schema_b =
                Parser.Default.Parse("enum A { B C }");

            var types = new List<ITypeInfo>
            {
                TypeInfo.Create(
                    schema_a.Definitions.OfType<ITypeDefinitionNode>().First(),
                    new SchemaInfo("Schema_A", schema_a)),
                TypeInfo.Create(
                    schema_b.Definitions.OfType<ITypeDefinitionNode>().First(),
                    new SchemaInfo("Schema_B", schema_b)),
            };

            var context = new SchemaMergeContext();

            var leftovers = new List<ITypeInfo>();

            // act
            var typeMerger = new InputObjectTypeMergeHandler(
                (c, t) => leftovers.AddRange(t));
            typeMerger.Merge(context, types);

            // assert
            Assert.Collection(leftovers,
                t => Assert.IsType<EnumTypeInfo>(t));

            Snapshot.Match(new List<object>
            {
                SchemaSyntaxSerializer.Serialize(context.CreateSchema()),
                leftovers
            });
        }
        public void Merge_ThreeDirectivessWhereTwoAreIdentical_TwoTypesAfterMerge()
        {
            // arrange
            DocumentNode schema_a =
                Utf8GraphQLParser.Parse(
                    "directive @test(arg: String) on OBJECT");
            DocumentNode schema_b =
                Utf8GraphQLParser.Parse(
                    "directive @test1(arg: String) on OBJECT");
            DocumentNode schema_c =
                Utf8GraphQLParser.Parse(
                    "directive @test(arg: String) on OBJECT");

            var types = new List <IDirectiveTypeInfo>
            {
                new DirectiveTypeInfo(schema_a.Definitions
                                      .OfType <DirectiveDefinitionNode>().First(),
                                      new SchemaInfo("Schema_A", schema_a)),
                new DirectiveTypeInfo(schema_b.Definitions
                                      .OfType <DirectiveDefinitionNode>().First(),
                                      new SchemaInfo("Schema_B", schema_b)),
                new DirectiveTypeInfo(schema_c.Definitions
                                      .OfType <DirectiveDefinitionNode>().First(),
                                      new SchemaInfo("Schema_C", schema_c))
            };

            var context = new SchemaMergeContext();

            // act
            var typeMerger = new DirectiveTypeMergeHandler((c, t) => { });

            typeMerger.Merge(context, types);

            // assert
            SchemaSyntaxSerializer.Serialize(context.CreateSchema())
            .MatchSnapshot();
        }
예제 #5
0
        public void RenameObjectField()
        {
            // arrange
            DocumentNode schema_a =
                Utf8GraphQLParser.Parse(
                    "type A { b1: B } " +
                    "type B { c: String } " +
                    "type C implements D { c: String } " +
                    "interface D { c: String }");

            DocumentNode schema_b =
                Utf8GraphQLParser.Parse(
                    "type B { b1: String b3: String } type C { c: String }");

            // act
            DocumentNode a = SchemaMerger.New()
                             .AddSchema("A", schema_a)
                             .AddSchema("B", schema_b)
                             .RenameField("A", new FieldReference("B", "c"), "c123")
                             .Merge();

            // assert
            SchemaSyntaxSerializer.Serialize(a).MatchSnapshot();
        }
예제 #6
0
        public async Task DownloadSchemaAsync(
            HttpClient client,
            Stream stream,
            CancellationToken cancellationToken = default)
        {
            if (client is null)
            {
                throw new ArgumentNullException(nameof(client));
            }

            if (stream is null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            DocumentNode document = await DownloadSchemaAsync(
                client, cancellationToken)
                                    .ConfigureAwait(false);

            await Task.Run(
                () => SchemaSyntaxSerializer.Serialize(document, stream, true),
                cancellationToken)
            .ConfigureAwait(false);
        }
예제 #7
0
        public void AddSchemaFromHttp()
        {
            // arrange
            IHttpClientFactory clientFactory = CreateRemoteSchemas();
            var builder = new MockStitchingBuilder();

            // act
            builder.AddSchemaFromHttp("customer")
            .AddSchemaFromHttp("contract");

            // assert
            var services = new DictionaryServiceProvider(
                typeof(IHttpClientFactory),
                clientFactory);
            var merger = new SchemaMerger();

            foreach (KeyValuePair <NameString, LoadSchemaDocument> item in
                     builder.Schemas)
            {
                merger.AddSchema(item.Key, item.Value.Invoke(services));
            }

            SchemaSyntaxSerializer.Serialize(merger.Merge()).MatchSnapshot();
        }
예제 #8
0
        public async Task <int> OnExecute()
        {
            if (Path is null)
            {
                throw new InvalidOperationException("Path mustn't not be null.");
            }

            if (Url is null)
            {
                throw new InvalidOperationException("Url mustn't not be null.");
            }

            var httpClient = new HttpClient();

            httpClient.BaseAddress = new Uri(Url);
            httpClient.DefaultRequestHeaders.UserAgent.Add(
                new ProductInfoHeaderValue(
                    new ProductHeaderValue(
                        "StrawberryShake",
                        GetType() !.Assembly !.GetName() !.Version !.ToString())));

            if (Token != null)
            {
                httpClient.DefaultRequestHeaders.Authorization =
                    new AuthenticationHeaderValue(
                        Scheme ?? "bearer", Token);
            }

            var stopwatch = Stopwatch.StartNew();

            Console.WriteLine("Download schema started.");
            DocumentNode schema = await IntrospectionClient.LoadSchemaAsync(httpClient);

            schema = IntrospectionClient.RemoveBuiltInTypes(schema);
            Console.WriteLine(
                "Download schema completed in " +
                $"{stopwatch.ElapsedMilliseconds} ms.");

            stopwatch.Restart();
            Console.WriteLine("Client configuration started.");

            if (!Directory.Exists(Path))
            {
                Directory.CreateDirectory(Path);
            }

            SchemaName = (SchemaName ?? "schema").Trim();
            string schemaFielName = SchemaName + ".graphql";

            var configuration = new Configuration();

            configuration.ClientName = SchemaName + "Client";
            configuration.Schemas    = new List <SchemaFile>();
            configuration.Schemas.Add(new SchemaFile
            {
                Type = "http",
                Name = SchemaName,
                File = schemaFielName,
                Url  = Url
            });

            using (var stream = File.Create(IOPath.Combine(Path, WellKnownFiles.Config)))
            {
                await JsonSerializer.SerializeAsync(stream, configuration);
            }

            using (var stream = File.Create(IOPath.Combine(Path, schemaFielName)))
            {
                using (var sw = new StreamWriter(stream))
                {
                    SchemaSyntaxSerializer.Serialize(schema, sw, true);
                }
            }

            Console.WriteLine(
                "Client configuration completed in " +
                $"{stopwatch.ElapsedMilliseconds} ms for {Path}.");
            return(0);
        }
예제 #9
0
        public async Task <int> OnExecute()
        {
            var httpClient = new HttpClient();

            httpClient.BaseAddress = new Uri(Url);

            if (Token != null)
            {
                httpClient.DefaultRequestHeaders.Authorization =
                    new AuthenticationHeaderValue(
                        Scheme ?? "bearer", Token);
            }

            var stopwatch = Stopwatch.StartNew();

            Console.WriteLine("Download schema started.");
            DocumentNode schema = await IntrospectionClient.LoadSchemaAsync(httpClient);

            schema = IntrospectionClient.RemoveBuiltInTypes(schema);
            Console.WriteLine(
                "Download schema completed in " +
                $"{stopwatch.ElapsedMilliseconds} ms.");

            stopwatch.Restart();
            Console.WriteLine("Client configuration started.");

            if (!Directory.Exists(Path))
            {
                Directory.CreateDirectory(Path);
            }

            SchemaName = SchemaName ?? "schema";
            string schemaFielName = SchemaName + ".graphql";

            var configuration = new Configuration();

            configuration.ClientName = SchemaName + "Client";
            configuration.Schemas    = new List <SchemaFile>();
            configuration.Schemas.Add(new SchemaFile
            {
                Type = "http",
                Name = SchemaName,
                File = schemaFielName,
                Url  = Url
            });

            using (var stream = File.Create(IOPath.Combine(Path, "config.json")))
            {
                await JsonSerializer.SerializeAsync(stream, configuration);
            }

            using (var stream = File.Create(IOPath.Combine(Path, schemaFielName)))
            {
                using (var sw = new StreamWriter(stream))
                {
                    SchemaSyntaxSerializer.Serialize(schema, sw, true);
                }
            }

            Console.WriteLine(
                "Client configuration completed in " +
                $"{stopwatch.ElapsedMilliseconds} ms for {Path}.");
            return(0);
        }