/// <inheritdoc />
        public async ValueTask <IInMemoryClient> CreateAsync(
            string name,
            CancellationToken cancellationToken = default)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw ThrowHelper.Argument_IsNullOrEmpty(nameof(name));
            }

            InMemoryClientFactoryOptions options = _optionsMonitor.Get(name);
            var client = new InMemoryClient(name);

            for (var i = 0; i < options.InMemoryClientActions.Count; i++)
            {
                await options.InMemoryClientActions[i](client, cancellationToken);
            }

            if (client.Executor is not null)
            {
                client.SchemaName = client.Executor.Schema.Name;
            }
            else
            {
                client.Executor = await _requestExecutorResolver
                                  .GetRequestExecutorAsync(client.SchemaName, cancellationToken);
            }

            return(client);
        }
        public async Task ExecuteAsync_Default_CallInterceptor()
        {
            // arrange
            var interceptorMock  = new Mock <IInMemoryRequestInterceptor>();
            var client           = new InMemoryClient("Foo");
            var variables        = new Dictionary <string, object?>();
            var operationRequest = new OperationRequest("foo", new StubDocument(), variables);
            var executor         = new StubExecutor();

            client.Executor = executor;
            client.RequestInterceptors.Add(interceptorMock.Object);
            client.RequestInterceptors.Add(interceptorMock.Object);
            interceptorMock
            .Setup(x => x
                   .OnCreateAsync(
                       StubExecutor.ApplicationServiceProvider,
                       operationRequest,
                       It.IsAny <IQueryRequestBuilder>(),
                       It.IsAny <CancellationToken>()));

            // act
            await client.ExecuteAsync(operationRequest);

            // assert
            interceptorMock
            .Verify(x => x
                    .OnCreateAsync(
                        StubExecutor.ApplicationServiceProvider,
                        operationRequest,
                        It.IsAny <IQueryRequestBuilder>(),
                        It.IsAny <CancellationToken>()),
                    Times.Exactly(2));
        }
        public async Task ExecuteAsync_NoRequest_ThrowException()
        {
            // arrange
            var client = new InMemoryClient("Foo");

            // act
            Exception?ex =
                await Record.ExceptionAsync(async() => await client.ExecuteAsync(null !));

            // assert
            Assert.IsType <ArgumentNullException>(ex);
        }
        public async Task ExecuteAsync_NoExecutor_ThrowException()
        {
            // arrange
            var client           = new InMemoryClient("Foo");
            var operationRequest =
                new OperationRequest("foo", new StubDocument());

            // act
            Exception?ex =
                await Record.ExceptionAsync(async() =>
                                            await client.ExecuteAsync(operationRequest));

            // assert
            Assert.IsType <GraphQLClientException>(ex);
        }
        public async Task ExecuteAsync_Default_ExecuteQuery()
        {
            // arrange
            var client           = new InMemoryClient("Foo");
            var variables        = new Dictionary <string, object?>();
            var operationRequest = new OperationRequest("foo", new StubDocument(), variables);
            var executor         = new StubExecutor();

            client.Executor = executor;

            // act
            await client.ExecuteAsync(operationRequest);

            // assert
            Assert.Equal(operationRequest.Name, executor.Request.OperationName);
            Assert.Equal(variables, executor.Request.VariableValues);
            Assert.Equal("{ foo }", Encoding.UTF8.GetString(executor.Request.Query !.AsSpan()));
        }