public void TestChange_JobParameter_Add()
        {
            DoWithData((session, provider) =>
            {
                // берем дату проверки
                var checkDate = DateTime.Now;

                // засыпаем на 2 секунды, чтобы детектить изменения
                Thread.Sleep(TimeSpan.FromSeconds(2));

                // у Job1 добавляем новый параметр
                var job1       = session.Query <SchJob>().Single(i => i.Code == "TST_JOB1");
                var job1Param2 = new SchJobParam
                {
                    Job   = job1,
                    Name  = "TST_JOB1_PARAM2",
                    Value = "Some value"
                };
                session.Save(job1Param2);
                job1.Job_SchJobParam_List.Add(job1Param2);

                session.Flush();

                // поехали
                JobKey[] deletedJobs;
                IDictionary <IJobDetail, Quartz.Collection.ISet <ITrigger> > changedJobs;

                provider.GetChangedJobs(TstSchedulerName, checkDate, out deletedJobs, out changedJobs);

                // проверяем
                deletedJobs.Should().HaveCount(0);
                changedJobs.Should().HaveCount(1);
                changedJobs.Keys.Single().Key.Name.ShouldBeEquivalentTo(job1.Code);
                changedJobs.Keys.Single().JobDataMap.Should().ContainKey(job1Param2.Name);
                changedJobs.Keys.Single().JobDataMap[job1Param2.Name].ShouldBeEquivalentTo(job1Param2.Value);
                changedJobs.Values.Single().Should().HaveCount(1);
                changedJobs.Values.Single().Single().Key.Name.ShouldBeEquivalentTo("TST_JOB1_TR1");
            });
        }
        /// <summary>
        /// Сценарий:
        /// Job1 - нормальный
        /// Job2 - имеет один триггер с датой старта больше текущей
        /// Job3 - имеет один триггер с датой окончания меньше текущей
        /// Job4 - имеет один заблокированный триггер
        /// Job5 - имеет два триггера: один заблокирован, один нормальный
        /// </summary>
        /// <param name="session"></param>
        private static void PopulateTestData(ISession session)
        {
            var scheduler = new SchScheduler {
                Code = TstSchedulerName
            };

            session.Save(scheduler);

            var jobType = new SchJobType
            {
                Code      = "TST Job Type",
                ClassName = string.Format("{0}, MLC.Wms.Scheduler.Tests", typeof(FakeJob).FullName),
                Scheduler = scheduler
            };

            session.Save(jobType);

            var job1 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB1",
                Scheduler = scheduler
            };

            session.Save(job1);

            var job1Param1 = new SchJobParam
            {
                Name  = "TST_JOB1_PARAM1",
                Job   = job1,
                Value = "TST VALUE"
            };

            session.Save(job1Param1);
            job1.Job_SchJobParam_List.Add(job1Param1);

            var job1Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB1_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-1),
                Job       = job1,
                Scheduler = scheduler
            };

            session.Save(job1Trigger1);
            job1.Job_SchTrigger_List.Add(job1Trigger1);

            // job 2
            var job2 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB2",
                Scheduler = scheduler
            };

            session.Save(job2);
            var job2Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB2_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(1),
                Job       = job2,
                Scheduler = scheduler
            };

            session.Save(job2Trigger1);
            job2.Job_SchTrigger_List.Add(job2Trigger1);

            // job 3
            var job3 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB3",
                Scheduler = scheduler
            };

            session.Save(job3);
            var job3Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB3_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-2),
                EndTimeUtc         = DateTime.UtcNow.AddDays(-1),
                Job       = job3,
                Scheduler = scheduler
            };

            session.Save(job3Trigger1);
            job3.Job_SchTrigger_List.Add(job3Trigger1);

            // job 4
            var job4 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB4",
                Scheduler = scheduler
            };

            session.Save(job4);
            var job4Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB4_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-2),
                EndTimeUtc         = DateTime.UtcNow.AddDays(+1),
                Disabled           = true,
                Job       = job4,
                Scheduler = scheduler
            };

            session.Save(job4Trigger1);
            job4.Job_SchTrigger_List.Add(job4Trigger1);

            // job 5
            var job5 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB5",
                Scheduler = scheduler
            };

            session.Save(job5);
            var job5Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB5_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-2),
                EndTimeUtc         = DateTime.UtcNow.AddDays(+1),
                Disabled           = true,
                Job       = job5,
                Scheduler = scheduler
            };

            session.Save(job5Trigger1);
            job5.Job_SchTrigger_List.Add(job5Trigger1);

            var job5Trigger2 = new SchCronTrigger
            {
                Code               = "TST_JOB5_TR2",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-2),
                EndTimeUtc         = DateTime.UtcNow.AddDays(+1),
                Job       = job5,
                Scheduler = scheduler
            };

            session.Save(job5Trigger2);
            job5.Job_SchTrigger_List.Add(job5Trigger2);
        }