public void When_resource_has_constructor_with_injectable_parameter_it_must_succeed()
        {
            // Arrange
            var contextOptions = new DbContextOptionsBuilder <AppDbContext>().Options;
            var systemClock    = new FrozenSystemClock();
            var appDbContext   = new AppDbContext(contextOptions, systemClock);

            using var serviceContainer = new ServiceContainer();
            serviceContainer.AddService(typeof(DbContextOptions <AppDbContext>), contextOptions);
            serviceContainer.AddService(typeof(ISystemClock), systemClock);
            serviceContainer.AddService(typeof(AppDbContext), appDbContext);

            var factory = new DefaultResourceFactory(serviceContainer);

            // Act
            NewExpression newExpression = factory.CreateNewExpression(typeof(ResourceWithDbContextConstructor));

            // Assert
            var function = Expression
                           .Lambda <Func <ResourceWithDbContextConstructor> >(newExpression)
                           .Compile();

            ResourceWithDbContextConstructor resource = function();

            Assert.NotNull(resource);
            Assert.Equal(appDbContext, resource.AppDbContext);
        }
        public async Task Can_Select_Sparse_Fieldsets()
        {
            // Arrange
            var todoItem = new TodoItem
            {
                Description  = "description",
                Ordinal      = 1,
                CreatedDate  = new DateTime(2002, 2, 2),
                AchievedDate = new DateTime(2002, 2, 4)
            };

            _dbContext.TodoItems.Add(todoItem);
            await _dbContext.SaveChangesAsync();

            var properties = _resourceGraph
                             .GetAttributes <TodoItem>(e => new { e.Id, e.Description, e.CreatedDate, e.AchievedDate })
                             .Select(x => x.PropertyInfo.Name);

            var resourceFactory = new DefaultResourceFactory(new ServiceContainer());

            // Act
            var query = _dbContext
                        .TodoItems
                        .Where(t => t.Id == todoItem.Id)
                        .Select(properties, resourceFactory);

            var result = await query.FirstAsync();

            // Assert
            Assert.Equal(0, result.Ordinal);
            Assert.Equal(todoItem.Description, result.Description);
            Assert.Equal(todoItem.CreatedDate.ToString("G"), result.CreatedDate.ToString("G"));
            Assert.Equal(todoItem.AchievedDate.GetValueOrDefault().ToString("G"), result.AchievedDate.GetValueOrDefault().ToString("G"));
        }
        private DefaultResourceRepository <TodoItem> Setup()
        {
            var contextResolverMock = new Mock <IDbContextResolver>();

            contextResolverMock.Setup(m => m.GetContext()).Returns(new Mock <DbContext>().Object);
            var resourceGraph   = new Mock <IResourceGraph>();
            var targetedFields  = new Mock <ITargetedFields>();
            var resourceFactory = new DefaultResourceFactory(new ServiceContainer());
            var repository      = new DefaultResourceRepository <TodoItem>(targetedFields.Object, contextResolverMock.Object, resourceGraph.Object, null, resourceFactory, NullLoggerFactory.Instance);

            return(repository);
        }
        private (DefaultResourceRepository <TodoItem> Repository, Mock <ITargetedFields> TargetedFields) Setup(AppDbContext context)
        {
            var serviceProvider     = ((IInfrastructure <IServiceProvider>)context).Instance;
            var resourceFactory     = new DefaultResourceFactory(serviceProvider);
            var contextResolverMock = new Mock <IDbContextResolver>();

            contextResolverMock.Setup(m => m.GetContext()).Returns(context);
            var resourceGraph  = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance).AddResource <TodoItem>().Build();
            var targetedFields = new Mock <ITargetedFields>();
            var repository     = new DefaultResourceRepository <TodoItem>(targetedFields.Object, contextResolverMock.Object, resourceGraph, null, resourceFactory, NullLoggerFactory.Instance);

            return(repository, targetedFields);
        }
        protected void AddResource(string name, string resourceName, Assembly asm)
        {
            IResourceFactory resourceFactory = new DefaultResourceFactory();
            var descriptor = new ResourceDescriptor(
                null,
                name,
                resourceName,
                null,
                null);
            var resource = resourceFactory.Create(
                descriptor,
                asm);

            ControllerContext.Resources.Add(name, resource);
        }
        public void When_resource_has_constructor_with_string_parameter_it_must_fail()
        {
            // Arrange
            var factory = new DefaultResourceFactory(new ServiceContainer());

            // Act
            Action action = () => factory.CreateNewExpression(typeof(ResourceWithStringConstructor));

            // Assert
            var exception = Assert.Throws <InvalidOperationException>(action);

            Assert.Equal(
                "Failed to create an instance of 'UnitTests.Models.ResourceWithStringConstructor': Parameter 'text' could not be resolved.",
                exception.Message);
        }
        public void When_resource_has_default_constructor_it_must_succeed()
        {
            // Arrange
            var factory = new DefaultResourceFactory(new ServiceContainer());

            // Act
            NewExpression newExpression = factory.CreateNewExpression(typeof(ResourceWithoutConstructor));

            // Assert
            var function = Expression
                           .Lambda <Func <ResourceWithoutConstructor> >(newExpression)
                           .Compile();

            ResourceWithoutConstructor resource = function();

            Assert.NotNull(resource);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="StubMonoRailServices"/> class.
        /// </summary>
        /// <param name="urlBuilder">The URL builder.</param>
        /// <param name="filterFactory">The filter factory.</param>
        /// <param name="viewEngineManager">The view engine manager.</param>
        /// <param name="actionSelector">The action selector.</param>
        /// <param name="dynamicActionProviderFactory">The dynamic action provider factory.</param>
        public StubMonoRailServices(IUrlBuilder urlBuilder, IFilterFactory filterFactory, IViewEngineManager viewEngineManager,
                                    IActionSelector actionSelector, IDynamicActionProviderFactory dynamicActionProviderFactory)
        {
            this.UrlBuilder                   = urlBuilder;
            this.FilterFactory                = filterFactory;
            this.ViewEngineManager            = viewEngineManager;
            this.ActionSelector               = actionSelector;
            this.DynamicActionProviderFactory = dynamicActionProviderFactory;
            controllerTree         = new DefaultControllerTree();
            ControllerFactory      = new DefaultControllerFactory(controllerTree);
            StaticResourceRegistry = new DefaultStaticResourceRegistry();

            ControllerContextFactory = new DefaultControllerContextFactory();

            ControllerDescriptorProvider = new DefaultControllerDescriptorProvider(
                new DefaultHelperDescriptorProvider(),
                new DefaultFilterDescriptorProvider(),
                new DefaultLayoutDescriptorProvider(),
                new DefaultRescueDescriptorProvider(),
                new DefaultResourceDescriptorProvider(),
                new DefaultTransformFilterDescriptorProvider(),
                new DefaultReturnBinderDescriptorProvider(),
                new DefaultDynamicActionProviderDescriptorProvider());

            ResourceFactory    = new DefaultResourceFactory();
            ScaffoldingSupport = new StubScaffoldingSupport();
            CacheProvider      = new StubCacheProvider();
            HelperFactory      = new DefaultHelperFactory();
            ServiceInitializer = new DefaultServiceInitializer();

            ExtensionManager = new ExtensionManager(this);

            ValidatorRegistry = new CachedValidationRegistry();

            JSONSerializer = new NewtonsoftJSONSerializer();

            DictionaryAdapterFactory = new DictionaryAdapterFactory();

            ScriptBuilder = new DefaultScriptBuilder();
        }
		protected void AddResource(string name, string resourceName, Assembly asm)
		{
			IResourceFactory resourceFactory = new DefaultResourceFactory();
			ResourceDescriptor descriptor = new ResourceDescriptor(
				null,
				name,
				resourceName,
				null,
				null);
			IResource resource = resourceFactory.Create(
				descriptor,
				asm);
			ControllerContext.Resources.Add(name, resource);
		}