Exemplo n.º 1
0
        public async Task ExecutePublishDocumentServer_With_SchemaFile_Handler()
        {
            // arrange
            var handler = new PublishSchemaDocumentHandler(
                Storage, SchemaRepository, PublishSchemaEventSender);

            using var service = new PublishDocumentService(
                      PublishDocumentMessageReceiver, new
                      IPublishDocumentHandler[] { handler });

            var schema = new Schema("abc", "def");
            await SchemaRepository.AddSchemaAsync(schema);

            var environment = new Environment("abc", "def");
            await EnvironmentRepository.AddEnvironmentAsync(environment);

            var message = new PublishDocumentMessage(
                "ghi", environment.Id, schema.Id, Array.Empty <Tag>());

            IFileContainer fileContainer = await Storage.CreateContainerAsync("ghi");

            using (Stream stream = await fileContainer.CreateFileAsync("schema.graphql"))
            {
                byte[] buffer = Encoding.UTF8.GetBytes(@"
                    type Query {
                        foo: String
                    }
                ");
                await stream.WriteAsync(buffer, 0, buffer.Length);
            }

            await PublishDocumentMessageSender.SendAsync(message);

            // act
            await service.StartAsync(default);
Exemplo n.º 2
0
        public async Task PublishSchema()
        {
            // arrange
            var serializer = new IdSerializer();

            var schema = new Schema("abc", "def");
            await SchemaRepository.AddSchemaAsync(schema);

            var environment = new Environment("abc", "def");
            await EnvironmentRepository.AddEnvironmentAsync(environment);

            // act
            IExecutionResult result = await Executor.ExecuteAsync(
                QueryRequestBuilder.New()
                .SetQuery(
                    @"mutation(
                            $schemaName: String!
                            $environmentName: String!
                            $sourceText: String!
                            $version: String!) {
                            publishSchema(input: {
                                schemaName: $schemaName
                                environmentName: $environmentName
                                sourceText: $sourceText
                                tags: [ { key: ""version"" value: $version } ]
                                clientMutationId: ""ghi"" }) {
                                sessionId
                                clientMutationId
                            }
                        }")
                .SetVariableValue("schemaName", "abc")
                .SetVariableValue("environmentName", "abc")
                .SetVariableValue("sourceText", "type Query { a: String }")
                .SetVariableValue("version", "1.0.0")
                .Create());

            // assert
            result.MatchSnapshot(o =>
                                 o.Assert(fo =>
                                          Assert.NotNull(fo.Field <string>("Data.publishSchema.sessionId"))));
            Assert.Collection(ReceivedMessages,
                              t =>
            {
                PublishDocumentMessage message = Assert.IsType <PublishDocumentMessage>(t);
                Assert.Equal(schema.Id, message.SchemaId);
                Assert.Equal(environment.Id, message.EnvironmentId);
                Assert.Equal(DocumentType.Schema, message.Type);
                Assert.Null(message.ClientId);
                Assert.NotNull(message.SessionId);
                Assert.Collection(message.Tags,
                                  t =>
                {
                    Assert.Equal("version", t.Key);
                    Assert.Equal("1.0.0", t.Value);
                });
            });
        }
Exemplo n.º 3
0
        private async Task HandleInternalAsync(
            PublishDocumentMessage message,
            CancellationToken cancellationToken)
        {
            var issueLogger = new IssueLogger(message.SessionId, _eventSender);

            try
            {
                IFileContainer fileContainer =
                    await _fileStorage.GetContainerAsync(message.SessionId).ConfigureAwait(false);

                IEnumerable <IFile> files =
                    await fileContainer.GetFilesAsync(cancellationToken).ConfigureAwait(false);

                IFile schemaFile = files.Single();

                DocumentNode?schemaDocument = await TryParseSchemaAsync(
                    schemaFile, issueLogger, cancellationToken)
                                              .ConfigureAwait(false);

                string formattedSourceText = schemaDocument is { }
                    ?  PrintSchema(schemaDocument)
                    : await ReadSchemaSourceTextAsync(
                    schemaFile, cancellationToken)
                .ConfigureAwait(false);

                DocumentHash documentHash = DocumentHash.FromSourceText(formattedSourceText);

                SchemaVersion?schemaVersion =
                    await _schemaRepository.GetSchemaVersionByHashAsync(
                        documentHash.Hash, cancellationToken)
                    .ConfigureAwait(false);

                if (schemaVersion is null)
                {
                    await PublishNewSchemaVersionAsync(
                        message,
                        schemaDocument,
                        formattedSourceText,
                        issueLogger,
                        cancellationToken)
                    .ConfigureAwait(false);
                }
                else
                {
                    await PublishExistingSchemaVersionAsync(
                        message,
                        schemaDocument,
                        schemaVersion,
                        issueLogger,
                        cancellationToken)
                    .ConfigureAwait(false);
                }

                await fileContainer.DeleteAsync(cancellationToken).ConfigureAwait(false);
            }
Exemplo n.º 4
0
        public Task HandleAsync(
            PublishDocumentMessage message,
            CancellationToken cancellationToken)
        {
            if (message is null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            return(HandleInternalAsync(message, cancellationToken));
        }
Exemplo n.º 5
0
        private async Task HandleInternalAsync(
            PublishDocumentMessage message,
            CancellationToken cancellationToken)
        {
            var logger = new IssueLogger(message.SessionId, _eventSender);

            try
            {
                var documents = new List <QueryDocumentInfo>();
                IReadOnlyList <Guid> queryIds = Array.Empty <Guid>();

                ISchema?schema =
                    await SchemaHelper.TryLoadSchemaAsync(
                        SchemaRepository,
                        FileStorage,
                        message.SchemaId,
                        message.EnvironmentId,
                        logger,
                        cancellationToken)
                    .ConfigureAwait(false);

                IFileContainer fileContainer = await FileStorage.GetContainerAsync(
                    message.SessionId, cancellationToken)
                                               .ConfigureAwait(false);

                if (schema is { })
                {
                    queryIds = await ProcessDocumentsAsync(
                        message.SchemaId,
                        schema,
                        fileContainer,
                        message.Documents,
                        documents,
                        logger,
                        cancellationToken)
                               .ConfigureAwait(false);
                }

                Guid clientVersionId = await AddClientVersionAsync(
                    message, queryIds, cancellationToken)
                                       .ConfigureAwait(false);

                await AddEnvironmentPublishReport(
                    clientVersionId, message.EnvironmentId, logger, cancellationToken)
                .ConfigureAwait(false);

                await fileContainer.DeleteAsync(
                    cancellationToken)
                .ConfigureAwait(false);
            }
        public async Task HandleMessage()
        {
            // arrange
            string sessionId = await SessionCreator.CreateSessionAsync();

            var handler = new PublishNewSchemaDocumentHandler(
                Storage, SchemaRepository, PublishSchemaEventSender);

            var schema = new Schema("abc", "def");
            await SchemaRepository.AddSchemaAsync(schema);

            var environment = new Environment("abc", "def");
            await EnvironmentRepository.AddEnvironmentAsync(environment);

            var message = new PublishDocumentMessage(
                sessionId,
                environment.Id,
                schema.Id,
                "externalId",
                Array.Empty <DocumentInfo>(),
                Array.Empty <Tag>());

            IFileContainer fileContainer = await Storage.CreateContainerAsync(sessionId);

            byte[] buffer = Encoding.UTF8.GetBytes(@"
                    type Query {
                        foo: String
                    }
                ");
            await fileContainer.CreateFileAsync("schema.graphql", buffer, 0, buffer.Length);

            // act
            await handler.HandleAsync(message, default);

            // assert
            var list = new List <PublishDocumentEvent>();

            using var cts = new CancellationTokenSource(5000);
            IAsyncEnumerable <PublishDocumentEvent> eventStream =
                await PublishSchemaEventReceiver.SubscribeAsync(sessionId, cts.Token);

            await foreach (PublishDocumentEvent eventMessage in
                           eventStream.WithCancellation(cts.Token))
            {
                list.Add(eventMessage);
            }
            list.MatchSnapshot(matchOption =>
                               matchOption.Assert(fieldOption =>
                                                  Assert.Equal(sessionId, fieldOption.Field <string>("[0].SessionId"))));
        }
Exemplo n.º 7
0
        public Task HandleAsync(
            PublishDocumentMessage message,
            CancellationToken cancellationToken)
        {
            if (message is null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (message.ClientId is null)
            {
                throw new ArgumentException(
                          "The client id is not allowed to be null.",
                          nameof(message));
            }

            return(HandleInternalAsync(message, cancellationToken));
        }
Exemplo n.º 8
0
        public async Task HandleMessage()
        {
            // arrange
            var handler = new PublishSchemaDocumentHandler(
                Storage, SchemaRepository, PublishSchemaEventSender);

            var schema = new Schema("abc", "def");
            await SchemaRepository.AddSchemaAsync(schema);

            var environment = new Environment("abc", "def");
            await EnvironmentRepository.AddEnvironmentAsync(environment);

            var message = new PublishDocumentMessage(
                "ghi", environment.Id, schema.Id, Array.Empty <Tag>());

            IFileContainer fileContainer = await Storage.CreateContainerAsync("ghi");

            using (Stream stream = await fileContainer.CreateFileAsync("schema.graphql"))
            {
                byte[] buffer = Encoding.UTF8.GetBytes(@"
                    type Query {
                        foo: String
                    }
                ");
                await stream.WriteAsync(buffer, 0, buffer.Length);
            }

            // act
            await handler.HandleAsync(message, default);

            // assert
            var list = new List <PublishSchemaEvent>();

            using var cts = new CancellationTokenSource(5000);
            IAsyncEnumerable <PublishSchemaEvent> eventStream =
                await PublishSchemaEventReceiver.SubscribeAsync("ghi", cts.Token);

            await foreach (PublishSchemaEvent eventMessage in
                           eventStream.WithCancellation(cts.Token))
            {
                list.Add(eventMessage);
            }
            list.MatchSnapshot();
        }
 public async ValueTask <bool> CanHandleAsync(
     PublishDocumentMessage message,
     CancellationToken cancellationToken)
 {
     if (message is { Type : DocumentType.Schema })
Exemplo n.º 10
0
 public async ValueTask <bool> CanHandleAsync(
     PublishDocumentMessage message,
     CancellationToken cancellationToken)
 {
     if (message is { Type : DocumentType.Query, ExternalId : { } } ||
Exemplo n.º 11
0
 public abstract ValueTask <bool> CanHandleAsync(
     PublishDocumentMessage message,
     CancellationToken cancellationToken);
Exemplo n.º 12
0
 public override async ValueTask <bool> CanHandleAsync(
     PublishDocumentMessage message,
     CancellationToken cancellationToken)
 {
     if (message is { Type : DocumentType.Query })