public void GetDefinitionStore_ReturnsCustomStoreCorrespondingToTheSpecifiedType()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddSingleton(Mock.Of <IBpmNetDefinitionStore <CustomDefinition> >());

            var provider = services.BuildServiceProvider();
            var resolver = new BpmNetStoreResolver(provider);

            // Act and assert
            Assert.NotNull(resolver.GetDefinitionStore <CustomDefinition>());
        }
        public void GetDefinitionStore_ReturnsCustomStoreCorrespondingToTheSpecifiedTypeWhenAvailable()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddSingleton(Mock.Of <IBpmNetDefinitionStore <BpmNetDefinition> >());

            var options  = Mock.Of <IOptionsMonitor <BpmNetEntityFrameworkCoreOptions> >();
            var provider = services.BuildServiceProvider();
            var resolver = new BpmNetStoreResolver(options, provider);

            // Act and assert
            Assert.NotNull(resolver.GetDefinitionStore <BpmNetDefinition>());
        }
        public void GetDefinitionStore_ThrowsAnExceptionWhenStoreCannotBeFound()
        {
            // Arrange
            var services = new ServiceCollection();
            var provider = services.BuildServiceProvider();
            var resolver = new BpmNetStoreResolver(provider);

            // Act and assert
            var exception = Assert.Throws <InvalidOperationException>(() => resolver.GetDefinitionStore <CustomDefinition>());

            Assert.Equal(new StringBuilder()
                         .AppendLine("No definition store has been registered in the dependency injection container.")
                         .Append("To register the Entity Framework Core stores, reference the 'BpmNet.EntityFrameworkCore' ")
                         .AppendLine("package and call 'services.AddBpmNet().AddCore().UseEntityFrameworkCore()'.")
                         .Append("To register a custom store, create an implementation of 'IBpmNetDefinitionStore' and ")
                         .Append("use 'services.AddBpmNet().AddCore().ReplaceDefinitionStore()' to add it to the DI container.")
                         .ToString(), exception.Message);
        }
        public void GetDefinitionStore_ThrowsAnExceptionForInvalidEntityType()
        {
            // Arrange
            var services = new ServiceCollection();

            var options  = Mock.Of <IOptionsMonitor <BpmNetEntityFrameworkCoreOptions> >();
            var provider = services.BuildServiceProvider();
            var resolver = new BpmNetStoreResolver(options, provider);

            // Act and assert
            var exception = Assert.Throws <InvalidOperationException>(() => resolver.GetDefinitionStore <CustomDefinition>());

            Assert.Equal(new StringBuilder()
                         .AppendLine("The specified definition type is not compatible with the Entity Framework Core stores. ")
                         .Append("When enabling the Entity Framework Core stores, make sure your custom entity is inherit From ")
                         .Append("'BpmNetDefinition' in your entity model (from the 'BpmNet.Core' package) ")
                         .ToString(), exception.Message);
        }
        public void GetDefinitionStore_ReturnsDefaultStoreCorrespondingToTheSpecifiedTypeWhenAvailable()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddSingleton(Mock.Of <IBpmNetDefinitionStore <BpmNetDefinition> >());
            services.AddSingleton(CreateStore <BpmNetDefinition>());

            var options = Mock.Of <IOptionsMonitor <BpmNetEntityFrameworkCoreOptions> >(
                mock => mock.CurrentValue == new BpmNetEntityFrameworkCoreOptions
            {
                DbContextType = typeof(DbContext)
            });

            var provider = services.BuildServiceProvider();
            var resolver = new BpmNetStoreResolver(options, provider);

            // Act and assert
            Assert.NotNull(resolver.GetDefinitionStore <BpmNetDefinition>());
        }
        public void GetDefinitionStore_ThrowsAnExceptionForNullDbContext()
        {
            // Arrange
            var services = new ServiceCollection();

            var options = Mock.Of <IOptionsMonitor <BpmNetEntityFrameworkCoreOptions> >(
                mock => mock.CurrentValue == new BpmNetEntityFrameworkCoreOptions
            {
                DbContextType = null
            });

            var provider = services.BuildServiceProvider();
            var resolver = new BpmNetStoreResolver(options, provider);

            // Act and assert
            var exception = Assert.Throws <InvalidOperationException>(() => resolver.GetDefinitionStore <BpmNetDefinition>());

            //Assert.Equal(new StringBuilder()
            //    .AppendLine("No Entity Framework Core context was specified in the BpmNet options.")
            //    .Append("To configure the BpmNet Entity Framework Core stores to use a specific 'DbContext', ")
            //    .Append("use 'options.UseEntityFrameworkCore().UseDbContext<TContext>()'.")
            //    .ToString(), exception.Message);
        }