using FakeItEasy; using Quartz; using Quartz.Spi; using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; using Xunit; using SilkierQuartz.HostedService; namespace SilkierQuartz.Test { public class QuartzHostedServiceUnitTest { [Fact(DisplayName = "Install JobFactory (For DI)")] public async void IServiceCollectionExtensions_Register_HostedService() { IServiceProvider serviceProvider = A.Fake(); A.CallTo(() => serviceProvider.GetService(typeof(IEnumerable))).Returns(null); ISchedulerFactory schedulerFactory = A.Fake(); IScheduler scheduler = A.Fake(); A.CallTo(() => schedulerFactory.GetScheduler(A.Ignored)) .Returns(Task.FromResult(scheduler)); IJobFactory jobFactory = A.Fake(); var testClass = new QuartzHostedService(serviceProvider, schedulerFactory, jobFactory); await testClass.StartAsync(CancellationToken.None); A.CallTo(scheduler) .Where(a => a.Method.Name.Equals("set_JobFactory")); } [Fact(DisplayName = "All Registered Job")] public async void IServiceCollectionExtensions_Register_RegisterJob() { // Registered jobs var scheduleJobc = new List(); var jobDetail1 = A.Fake(); var jobDetail2 = A.Fake(); var jobDetail3 = A.Fake(); scheduleJobc.Add(new ScheduleJob(jobDetail1, new List() { A.Fake() })); scheduleJobc.Add(new ScheduleJob(jobDetail2, new List() { A.Fake() })); scheduleJobc.Add(new ScheduleJob(jobDetail3, new List() { A.Fake() })); IServiceProvider serviceProvider = A.Fake(); A.CallTo(() => serviceProvider.GetService(typeof(IEnumerable))).Returns(scheduleJobc); ISchedulerFactory schedulerFactory = A.Fake(); IScheduler scheduler = A.Fake(); A.CallTo(() => schedulerFactory.GetScheduler(A.Ignored)) .Returns(Task.FromResult(scheduler)); IJobFactory jobFactory = A.Fake(); var testClass = new QuartzHostedService(serviceProvider, schedulerFactory, jobFactory); await testClass.StartAsync(CancellationToken.None); A.CallTo( () => scheduler.ScheduleJob( A.That.Matches(jd => jd == jobDetail1 || jd == jobDetail2 || jd == jobDetail3), A.Ignored, A.Ignored)) .MustHaveHappened(3, Times.Exactly); } [Fact(DisplayName = "Started all registered Job with specified ITrigger")] public async void IServiceCollectionExtensions_Register_RegisterJob_ITrigger() { // Registered jobas var scheduleJobc = new List(); var jobDetail1 = A.Fake(); var trigger1 = A.Fake(); var trigger2 = A.Fake(); var trigger3 = A.Fake(); scheduleJobc.Add(new ScheduleJob(jobDetail1, new List() { trigger1, trigger2, trigger3 })); IServiceProvider serviceProvider = A.Fake(); A.CallTo(() => serviceProvider.GetService(typeof(IEnumerable))).Returns(scheduleJobc); ISchedulerFactory schedulerFactory = A.Fake(); IScheduler scheduler = A.Fake(); A.CallTo(() => schedulerFactory.GetScheduler(A.Ignored)) .Returns(Task.FromResult(scheduler)); IJobFactory jobFactory = A.Fake(); var testClass = new QuartzHostedService(serviceProvider, schedulerFactory, jobFactory); await testClass.StartAsync(CancellationToken.None); A.CallTo( () => scheduler.ScheduleJob( A.That.Matches(jd => jd == jobDetail1), A.That.Matches(t => t == trigger1), A.Ignored)) .MustHaveHappened(1,Times.Exactly); A.CallTo( () => scheduler.ScheduleJob( A.That.Matches(t => t == trigger2 || t == trigger3), A.Ignored)) .MustHaveHappened(2,Times.Exactly); } } }