Ejemplo n.º 1
0
 public async Task WhenReleaseTimesAreAllExisting_ItShouldHaveNoEffect()
 {
     await this.AssertSuccessAsync(
         WeeklyReleaseSchedule.Parse(new[] { ExistingReleaseA, ExistingReleaseB, ExistingReleaseC }),
         Enumerable.Empty <HourOfWeek>(),
         Enumerable.Empty <HourOfWeek>());
 }
Ejemplo n.º 2
0
        public async Task <WeeklyReleaseSchedule> ExecuteAsync(QueueId queueId)
        {
            queueId.AssertNotNull("queueId");

            var parameters = new
            {
                QueueId = queueId.Value
            };

            using (var connection = this.connectionFactory.CreateConnection())
            {
                var releaseTimes = await connection.QueryAsync <WeeklyReleaseTime>(Sql, parameters);

                var hoursOfWeek = releaseTimes.Select(_ => HourOfWeek.Parse(_.HourOfWeek)).ToArray();

                if (hoursOfWeek.Length == 0)
                {
                    throw new Exception(
                              string.Format(
                                  "Queue does not have any weekly release times defined. At least one should exist per collection at all times. {0}",
                                  queueId));
                }

                return(WeeklyReleaseSchedule.Parse(hoursOfWeek));
            }
        }
        public void ItShouldReturnDatesThatAlignWithReleaseTimes()
        {
            foreach (var schedule in Schedules)
            {
                foreach (var date in Dates)
                {
                    var results = this.target.GetNextLiveDates(date, WeeklyReleaseSchedule.Parse(schedule), 10);

                    var expectedFirstReleaseTime = 0;
                    var currentHourOfWeek        = HourOfWeek.Parse(date);
                    for (var i = 0; i < schedule.Count; i++)
                    {
                        // If this never evaluates, it means the current date is beyond any scheduled date for this week,
                        // so we wrap around to the start of next week, which is 0 (initialized above).
                        if (currentHourOfWeek.Value < schedule[i].Value)
                        {
                            expectedFirstReleaseTime = i;
                            break;
                        }
                    }

                    for (var i = 0; i < results.Count; i++)
                    {
                        var expectedWeeklyReleaseTime = schedule[(i + expectedFirstReleaseTime) % schedule.Count];
                        var actualWeeklyReleaseTime   = HourOfWeek.Parse(results[i]);

                        Assert.AreEqual(expectedWeeklyReleaseTime, actualWeeklyReleaseTime);
                    }
                }
            }
        }
 public void ItShouldRequireUtcStartTime()
 {
     foreach (var schedule in Schedules)
     {
         this.target.GetNextLiveDates(DateTime.Now, WeeklyReleaseSchedule.Parse(schedule), 1);
     }
 }
 public void ItShouldAllowZeroCount()
 {
     foreach (var schedule in Schedules)
     {
         foreach (var date in Dates)
         {
             this.target.GetNextLiveDates(date, WeeklyReleaseSchedule.Parse(schedule), 0);
         }
     }
 }
 public void ItShouldRequireNonNegativeCount()
 {
     foreach (var schedule in Schedules)
     {
         foreach (var date in Dates)
         {
             this.target.GetNextLiveDates(date, WeeklyReleaseSchedule.Parse(schedule), -1);
         }
     }
 }
 public void ItShouldReturnDatesGreaterThanTheLowerBound()
 {
     foreach (var schedule in Schedules)
     {
         foreach (var date in Dates)
         {
             foreach (var result in this.target.GetNextLiveDates(date, WeeklyReleaseSchedule.Parse(schedule), 10))
             {
                 Assert.IsTrue(result > date);
             }
         }
     }
 }
 public void ItShouldReturnDatesInUtc()
 {
     foreach (var schedule in Schedules)
     {
         foreach (var date in Dates)
         {
             foreach (var result in this.target.GetNextLiveDates(date, WeeklyReleaseSchedule.Parse(schedule), 10))
             {
                 Assert.AreEqual(result.Kind, DateTimeKind.Utc);
             }
         }
     }
 }
 public void ItShouldReturnListWithSameSizeAsCount()
 {
     foreach (var schedule in Schedules)
     {
         foreach (var date in Dates)
         {
             var weeklyReleaseSchedule = WeeklyReleaseSchedule.Parse(schedule);
             Assert.AreEqual(0, this.target.GetNextLiveDates(date, weeklyReleaseSchedule, 0).Count);
             Assert.AreEqual(1, this.target.GetNextLiveDates(date, weeklyReleaseSchedule, 1).Count);
             Assert.AreEqual(10, this.target.GetNextLiveDates(date, weeklyReleaseSchedule, 10).Count);
         }
     }
 }
        public void ItShouldReturnDatesInAnIncreasingSequence()
        {
            foreach (var schedule in Schedules)
            {
                foreach (var date in Dates)
                {
                    var result = this.target.GetNextLiveDates(date, WeeklyReleaseSchedule.Parse(schedule), 10);

                    result.Aggregate(
                        date,
                        (previous, current) =>
                    {
                        Assert.IsTrue(current > previous);
                        return(current);
                    });
                }
            }
        }
        public void ItShouldReturnDatesClippedToTheHour()
        {
            foreach (var schedule in Schedules)
            {
                foreach (var date in Dates)
                {
                    foreach (var result in this.target.GetNextLiveDates(date, WeeklyReleaseSchedule.Parse(schedule), 10))
                    {
                        var timeWithHourPrecision = new DateTime(
                            result.Year,
                            result.Month,
                            result.Day,
                            result.Hour,
                            minute: 0,
                            second: 0,
                            kind: DateTimeKind.Utc);

                        Assert.AreEqual(result, timeWithHourPrecision);
                    }
                }
            }
        }