示例#1
0
        public void GetReadableAccessorAsync_GivenUnsupportedObjectProviderName_ShouldThrowException()
        {
            var expectedProviderName = "expected-provider";
            var actualProviderName   = "actual-provider";

            var mockServiceProvider             = new Mock <IServiceProvider>();
            var mockInputObjectAccessorProvider = new Mock <IInputObjectAccessorProvider>();

            var accessorProviderFactory = new NamedServiceFactory <IInputObjectAccessorProvider>(
                new Dictionary <string, Func <IServiceProvider, IInputObjectAccessorProvider> >
            {
                [expectedProviderName] = sp => mockInputObjectAccessorProvider.Object
            });

            var accessorRequest = new InputObjectAccessorRequest
            {
                ExecutionMetadata = new ExecutionRequest {
                    ExecutionId = Guid.NewGuid().ToString()
                },
                ObjectMetadata = new ExtensionInputObject {
                    Name = "InputObjectA"
                },
                ObjectProviderName = actualProviderName
            };

            var testAccessorProvider = new CompositeInputObjectAccessorProvider(
                mockServiceProvider.Object,
                accessorProviderFactory);

            Func <Task> act = async() => await testAccessorProvider.GetReadableAccessorAsync(accessorRequest);

            act.Should().Throw <NotSupportedException>();
        }
        public async Task RouteRequestAsync_ServiceWithGivenExecutionModelName_ShouldRouteSuccessfully()
        {
            const string modelName = "expected-model/v1";

            var mockProcessor = new Mock<IExecutionProcessor>();
            var mockServiceProvider = new Mock<IServiceProvider>();

            var processorFactory = new NamedServiceFactory<IExecutionProcessor>(
                new Dictionary<string, Func<IServiceProvider, IExecutionProcessor>>
                {
                    [modelName] = sp => mockProcessor.Object
                });

            var execRequest = new ExecutionRequest
            {
                ExecutionId = Guid.NewGuid().ToString(),
                ExecutionModelName = modelName
            };

            var execContext = new Core.Models.ExecutionContext
            {
                ExecutionId = execRequest.ExecutionId,
                Status = ExecutionStatus.Succeeded
            };

            mockProcessor.Setup(ep => ep.ProcessRequestAsync(execRequest, CancellationToken.None))
                         .Returns(Task.FromResult(execContext));

            var execRequestRouter = new ExecutionRequestRouter(processorFactory, mockServiceProvider.Object);
            var actualExecContext = await execRequestRouter.RouteRequestAsync(execRequest, CancellationToken.None);

            actualExecContext.Should().NotBeNull();
            actualExecContext.Should().Be(execContext);
        }
        public void RouteRequestAsync_NoServiceWithGivenExecutionModelName_ShouldThrowException()
        {
            const string actualModelName = "actual-model/v1";
            const string expectedModelName = "expected-model/v1";

            var mockProcessor = new Mock<IExecutionProcessor>();
            var mockServiceProvider = new Mock<IServiceProvider>();

            var processorFactory = new NamedServiceFactory<IExecutionProcessor>(
                new Dictionary<string, Func<IServiceProvider, IExecutionProcessor>>
                {
                    [expectedModelName] = sp => mockProcessor.Object
                });

            var execRequest = new ExecutionRequest
            {
                ExecutionId = Guid.NewGuid().ToString(),
                ExecutionModelName = actualModelName
            };

            var execRequestRouter = new ExecutionRequestRouter(processorFactory, mockServiceProvider.Object);

            Func<Task> act = async () => await execRequestRouter.RouteRequestAsync(execRequest, CancellationToken.None);

            act.Should().Throw<NotSupportedException>();
        }
        public void RouteRequestAsync_NullExecutionRequest_ShouldThrowException()
        {
            var mockServiceProvider = new Mock<IServiceProvider>();
            var processorFactory = new NamedServiceFactory<IExecutionProcessor>();
            var execRequestRouter = new ExecutionRequestRouter(processorFactory, mockServiceProvider.Object);

            Func<Task> act = async () => await execRequestRouter.RouteRequestAsync(null, CancellationToken.None);

            act.Should().Throw<ArgumentNullException>();
        }
示例#5
0
        public void GetReadableAccessorAsync_GivenNullInputObjectAccessorRequest_ShouldThrowException()
        {
            var mockServiceProvider     = new Mock <IServiceProvider>();
            var accessorProviderFactory = new NamedServiceFactory <IInputObjectAccessorProvider>();

            var testAccessorProvider = new CompositeInputObjectAccessorProvider(
                mockServiceProvider.Object,
                accessorProviderFactory);

            Func <Task> act = async() => await testAccessorProvider.GetReadableAccessorAsync(null);

            act.Should().Throw <ArgumentNullException>();
        }
        public ServiceProviderCodecFactory(IServiceProvider serviceProvider)
        {
            this.serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));

            // Get the registered service collection, which can be used to get a list of registered types
            var serviceCollection = serviceProvider.GetService <IServiceCollection>();

            // Retrieve a list of registered types that subclass Codec. Codecs must be registered by
            // their concrete type so we can differentiate between them later when calling GetService().
            this.codecTypes = serviceCollection
                              .Where(t => typeof(Codec).IsAssignableFrom(t.ServiceType))
                              .ToDictionary(
                t => NamedServiceFactory <Codec> .GetServiceName(t.ImplementationType),
                t => t.ImplementationType
                );
        }
示例#7
0
        public BlockType(BlockService blockService, FieldTemplateService fieldTemplateService,
                         NamedServiceFactory <IBlockDataBuilder> blockDataBuilderFactory,
                         RouteInfoService routeInfoService)
        {
            Name        = "Block";
            Description = "Block data";
            Field(p => p.SystemId, type: typeof(IdGraphType)).Description("The block Id");

            Field <StringGraphType>(nameof(BlockModel.BlockType), "The block type",
                                    resolve: context =>
            {
                var block    = blockService.Get(context.Source.SystemId);
                var template = fieldTemplateService.Get <BlockFieldTemplate>(block.FieldTemplateSystemId);
                return(template.Id);
            });

            FieldAsync <StringGraphType>(nameof(BlockModel.ValueAsJSON), "Value as JSON string",
                                         arguments: new QueryArguments(
                                             new QueryArgument <GlobalInputType> {
                Name = "global", Description = "The global object"
            }
                                             ),
                                         resolve: async context =>
            {
                var block    = blockService.Get(context.Source.SystemId);
                var template = fieldTemplateService.Get <BlockFieldTemplate>(block.FieldTemplateSystemId);
                // Special treatment for scoped services https://graphql-dotnet.github.io/docs/getting-started/dependency-injection/#scoped-services-with-a-singleton-schema-lifetime
                // and make sure it is thread safe https://graphql-dotnet.github.io/docs/getting-started/dependency-injection/#thread-safety-with-scoped-services
                using var scope = context.RequestServices.CreateScope();
                var builder     = scope.ServiceProvider.GetNamedService <IBlockDataBuilder>(template.Id);
                if (builder == null)
                {
                    return(null);
                }
                var globalModel = context.GetArgument <GlobalModel>("global");
                routeInfoService.Setup(globalModel, context.Source.PageSystemId);
                var buildMethod = builder.GetType().GetMethod(nameof(IBlockDataBuilder <IViewModel> .BuildAsync));
                var value       = await(dynamic) buildMethod.Invoke(builder,
                                                                    new object[] { scope, new Web.Models.Blocks.BlockModel(block, block.Fields) });
                var jsonSerializerSettings = ApplicationConverter.JsonSerializerSettings();
                // jsonSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                return(JsonConvert.SerializeObject(value, jsonSerializerSettings));
            });
        }
示例#8
0
        public async Task GetReadableAccessorAsync_GivenSupportedObjectProviderName_ShouldReturnAccessor()
        {
            var providerName = "provider";

            var mockServiceProvider             = new Mock <IServiceProvider>();
            var mockInputObjectAccessorProvider = new Mock <IInputObjectAccessorProvider>();
            var objectMetadata = new ExtensionInputObject {
                Name = "InputObjectA"
            };

            var accessorProviderFactory = new NamedServiceFactory <IInputObjectAccessorProvider>(
                new Dictionary <string, Func <IServiceProvider, IInputObjectAccessorProvider> >
            {
                [providerName] = sp => mockInputObjectAccessorProvider.Object
            });

            var accessorRequest = new InputObjectAccessorRequest
            {
                ExecutionMetadata = new ExecutionRequest {
                    ExecutionId = Guid.NewGuid().ToString()
                },
                ObjectMetadata     = objectMetadata,
                ObjectProviderName = providerName
            };

            var expectedAccessor = JObject.FromObject(new InputObjectAccessor
            {
                ObjectAccessor = JObject.FromObject(accessorRequest),
                ObjectMetadata = objectMetadata
            });

            mockInputObjectAccessorProvider.Setup(ap => ap.GetReadableAccessorAsync(accessorRequest))
            .Returns(Task.FromResult(expectedAccessor));

            var testAccessorProvider = new CompositeInputObjectAccessorProvider(
                mockServiceProvider.Object,
                accessorProviderFactory);

            var actualAccessor = await testAccessorProvider.GetReadableAccessorAsync(accessorRequest);

            actualAccessor.Should().NotBeNull();
            actualAccessor.Should().BeEquivalentTo(expectedAccessor);
        }
示例#9
0
 /// <summary>
 /// Creates a new codec.
 /// <para/>
 /// The <see cref="Codec.Name"/> will be written into the index segment: in order for
 /// the segment to be read this class should be registered by subclassing <see cref="DefaultCodecFactory"/> and
 /// calling <see cref="DefaultCodecFactory.ScanForCodecs(System.Reflection.Assembly)"/> in the class constructor.
 /// The new <see cref="ICodecFactory"/> can be registered by calling <see cref="SetCodecFactory"/> at application startup.</summary>
 protected Codec()
 {
     name = NamedServiceFactory <Codec> .GetServiceName(this.GetType());
 }
示例#10
0
 /// <summary>
 /// Creates a new docvalues format.
 /// <para/>
 /// The provided name will be written into the index segment in some configurations
 /// (such as when using <see cref="Codecs.PerField.PerFieldDocValuesFormat"/>): in such configurations,
 /// for the segment to be read this class should be registered by subclassing <see cref="DefaultDocValuesFormatFactory"/> and
 /// calling <see cref="DefaultDocValuesFormatFactory.ScanForDocValuesFormats(System.Reflection.Assembly)"/> in the class constructor.
 /// The new <see cref="IDocValuesFormatFactory"/> can be registered by calling <see cref="SetDocValuesFormatFactory(IDocValuesFormatFactory)"/>
 /// at application startup.
 /// </summary>
 protected DocValuesFormat()
 {
     this.name = NamedServiceFactory <DocValuesFormat> .GetServiceName(this.GetType());
 }
示例#11
0
 /// <summary>
 /// Creates a new postings format.
 /// <para/>
 /// The provided name will be written into the index segment in some configurations
 /// (such as when using <see cref="PerField.PerFieldPostingsFormat"/>): in such configurations,
 /// for the segment to be read this class should be registered by subclassing <see cref="DefaultPostingsFormatFactory"/> and
 /// calling <see cref="DefaultPostingsFormatFactory.ScanForPostingsFormats(System.Reflection.Assembly)"/> in the class constructor.
 /// The new <see cref="IPostingsFormatFactory"/> can be registered by calling <see cref="SetPostingsFormatFactory(IPostingsFormatFactory)"/> at application startup.</summary>
 protected PostingsFormat()
 {
     this.name = NamedServiceFactory <PostingsFormat> .GetServiceName(this.GetType());
 }
 public ProductFieldViewModelBuilder(FieldDefinitionService fieldDefinitionService, NamedServiceFactory <FieldFormatter> fieldFormatterServiceFactory)
 {
     _fieldDefinitionService       = fieldDefinitionService;
     _fieldFormatterServiceFactory = fieldFormatterServiceFactory;
 }