예제 #1
0
        public void ShouldNotInstanceWithNullLoggerFactory()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobSuccessful.Options);
            var serviceProvider = new ServiceProviderFake();

            Assert.Throws <ArgumentNullException>(() => new JobRunner(optionsMonitor, serviceProvider, null));
        }
예제 #2
0
        public void ShouldNotInstanceWithNullOptions()
        {
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();

            Assert.Throws <ArgumentNullException>(() => new JobRunner(null, serviceProvider, loggerFactory));
        }
        public static void Execute(
            IPlugin plugin
            , IOrganizationService service, PluginExecutionContextFake context
            , ITracingService tracingService = null
            , IServiceEndpointNotificationService notificationService = null
            )
        {
            ServiceProviderFake serviceProvider = new ServiceProviderFake();

            serviceProvider.MyPluginExecutionContext = context;
            serviceProvider.MyTracingServiceFake     = new TracingServiceFake();
            if (tracingService != null)
            {
                serviceProvider.MyTracingServiceFake.crmTracingService = tracingService;
            }

            serviceProvider.MyOrganizationServiceFactory         = new OrganizationServiceFactoryFake();
            serviceProvider.MyOrganizationServiceFactory.Service = service;

            serviceProvider.MyServiceEndpointNotificationServiceFake = new ServiceEndpointNotificationServiceFake();
            if (notificationService != null)
            {
                serviceProvider.MyServiceEndpointNotificationServiceFake.crmServiceEndpointNotificationService
                    = notificationService;
            }

            plugin.Execute(serviceProvider);
        }
예제 #4
0
        public async Task ShouldThrowWhenRunManuallyJobNotEnqueued()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobSuccessful.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            await Assert.ThrowsAsync <ArgumentException>(async() => await jobRunner.RunAsync(typeof(JobSuccessful)));
        }
예제 #5
0
        public void ShouldLogJobNotConfigured()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobNotConfigured.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            jobRunner.Enqueue <JobNotConfigured>();
            jobRunner.Start();

            Assert.Contains(loggerFactory.Logger.Messages, message =>
                            message == $"No job configuration matches '{nameof(JobNotConfigured)}'.");
        }
예제 #6
0
        public async Task ShouldRunJobManually()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobSuccessful.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            jobRunner.Enqueue <JobSuccessful>();

            await jobRunner.RunAsync(typeof(JobSuccessful));

            Assert.True(serviceProvider.GetService <JobSuccessful>().Executed);
        }
예제 #7
0
        public void ShouldNotRunStoppedJob()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobStopped.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            jobRunner.Enqueue <JobStopped>();
            jobRunner.Start();

            Task.Delay(1500).GetAwaiter().GetResult(); // Waiting for the job

            Assert.False(serviceProvider.GetService <JobStopped>().Executed);
        }
예제 #8
0
        public void ShouldRunJobSuccessfully()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobSuccessful.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            jobRunner.Enqueue <JobSuccessful>();
            jobRunner.Start();

            Task.Delay(1500).GetAwaiter().GetResult(); // Waiting for the job

            Assert.True(serviceProvider.GetService <JobSuccessful>().Executed);
        }
예제 #9
0
        public async Task ShouldLogJobFailAfterRunManually()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobWithError.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            jobRunner.Enqueue <JobWithError>();

            await jobRunner.RunAsync(typeof(JobWithError));

            Assert.Contains(loggerFactory.Logger.Messages, message =>
                            message == $"Job '{nameof(JobWithError)}' failed during running.");
        }
예제 #10
0
        public void ShouldLogJobFail()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobWithError.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            jobRunner.Enqueue <JobWithError>();
            jobRunner.Start();

            Task.Delay(1500).GetAwaiter().GetResult(); // Waiting for the job

            Assert.Contains(loggerFactory.Logger.Messages, message =>
                            message == $"Job '{nameof(JobWithError)}' failed during running.");
        }
예제 #11
0
        public void ShouldLogWhenCronIsInvalid()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobBadlyConfigured.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            jobRunner.Enqueue <JobBadlyConfigured>();
            jobRunner.Start();

            Task.Delay(1500).GetAwaiter().GetResult(); // Waiting for the job

            Assert.Contains(loggerFactory.Logger.Messages, message =>
                            message == $"Invalid cron expression for '{nameof(JobBadlyConfigured)}'.");
        }
예제 #12
0
        internal void Receive(
            AggregateCommandHandler <Customer> handler,
            RepositoryFake <Customer> repo,
            IContext context,
            Customer customer,
            ID customerID
            )
        {
            GIVEN["a handler instance and a service provider"] = () => {
                handler = new AggregateCommandHandler <Customer>();
                IServiceProvider sp = new ServiceProviderFake().Register <IRepository <Customer> >(
                    repo = Substitute.ForPartsOf <RepositoryFake <Customer> >());
                context  = new GenericContext();
                context.Set(sp, false);
            };

            When["sending a create message to the aggregate"] = () => Send(customerID = ID.NewID(), new Customer.Create());
            Then["the aggregate gets created"] = async() => customer = await repo.Get(customerID);

            AND["it receives the command"] = () => customer.Commands.Should().BeEmpty();

            When["sending a non-create message to the aggregate"] = () => {
                repo.ClearReceivedCalls();
                customer.Commands.Clear();
                return(Send(customerID, new Customer.Promote()));
            };
            Then["the aggregate is loaded and saved"] = async() => {
                await repo.Received().Get(customerID);

                await repo.Received().Save(customer);
            };
            AND["it receives the command"] = () => customer.Commands.Should().ContainSingle(m => m is Customer.Promote);

            When["sending a message that does not belong to the aggregate"] = () => {
                repo.ClearReceivedCalls();
                return(Send(customerID, new Order.Ship()));
            };
            THEN["no action is performed"] = () => repo.ReceivedCalls().Should().BeEmpty();


            Task Send(ID target, ICommandMessage message)
            {
                Maybe <Task> result = handler.Receive(new HandleCommand(
                                                          new Command(message, target), context));

                return(result is Some <Task> t ? (Task)t : Task.CompletedTask);
            }
        }
예제 #13
0
        public void ShouldAssumeNewConfigurationImmediately()
        {
            var optionsMonitor  = new OptionsMonitorFake(JobSuccessful.Options);
            var serviceProvider = new ServiceProviderFake();
            var loggerFactory   = new LoggerFactoryFake();
            var jobRunner       = new JobRunner(optionsMonitor, serviceProvider, loggerFactory);

            jobRunner.Enqueue <JobSuccessful>();
            jobRunner.Start();

            optionsMonitor.Change(options => options.Running = false);

            Task.Delay(1500).GetAwaiter().GetResult(); // Waiting for the job

            Assert.False(serviceProvider.GetService <JobSuccessful>().Executed);
        }