public bool TestCheckAvailabilityForYearlyEvents(string currentDate, string dayOfYear, int weekdaySequence, int weekday, int month, int frequency, int option)
        {
            var service = new RecurrenceService();

            RecurrenceYearlyModel model;

            if (option == 1)
            {
                model = new RecurrenceYearlyModel
                {
                    StartDate  = DateTime.Parse("01/11/2016"),
                    EndDate    = DateTime.Parse("30/11/2017"),
                    DateOfYear = DateTime.Parse(dayOfYear), // date of year
                    NthWeekday = WeekdaySequences.None,
                    Weekday    = Weekdays.None,
                    Month      = Months.None,
                    NumOfYears = frequency // frequency
                };
            }
            else
            {
                model = new RecurrenceYearlyModel
                {
                    StartDate  = DateTime.Parse("01/11/2016"),
                    EndDate    = DateTime.Parse("30/11/2017"),
                    DateOfYear = DateTime.MinValue,
                    NthWeekday = (WeekdaySequences)weekdaySequence, // number of weekday
                    Weekday    = (Weekdays)weekday,                 // weekday
                    Month      = (Months)month,                     // month
                    NumOfYears = frequency                          // frequency
                };
            }

            return(service.CheckAvailability(DateTime.Parse(currentDate), model));
        }
        public async Task SaveAsync_ReturnUpdatedCount()
        {
            var repoMock = new Mock <IPlannedRecurrenceRepository>();

            repoMock.Setup(x => x.GetByIdAsync("42"))
            .Returns(() => Task.FromResult(new PlannedRecurrenceEntity {
                Uid = "42"
            }));
            repoMock.Setup(x => x.GetByIdAsync("43"))
            .Returns(() => Task.FromResult(new PlannedRecurrenceEntity {
                Uid = "43", Task = "Old"
            }));
            repoMock.Setup(x => x.TryUpdateVersionAsync(It.IsAny <PlannedRecurrenceEntity>()))
            .Returns(() => Task.FromResult <(bool, PlannedRecurrenceEntity)>((true, null)));
            var service = new RecurrenceService(repoMock.Object, Mapper, _specFactoryMock.Object);

            var result = await service.SaveAsync(new[]
            {
                new PlannedRecurrenceDto {
                    Uid = "42"
                },
                new PlannedRecurrenceDto {
                    Uid = "43", Task = "New"
                },
            }, null);

            Assert.Equal(1, result);
        }
        public bool TestCheckAvailabilityForMonthlyEvents(string currentDate, int dayOfMonth, int weekdaySequence, int weekday, int frequency, int option)
        {
            var service = new RecurrenceService();

            RecurrenceMonthlyModel model;

            if (option == 1)
            {
                // Option 1
                model = new RecurrenceMonthlyModel
                {
                    StartDate   = DateTime.Parse("01/11/2016"),
                    EndDate     = DateTime.Parse("30/11/2017"),
                    DateOfMoth  = dayOfMonth,                // day of month
                    NthWeekday  = 0,
                    Weekday     = Weekdays.None,
                    NumOfMonths = frequency,                 // frequency
                };
            }
            else
            {
                // Option 2
                model = new RecurrenceMonthlyModel
                {
                    StartDate   = DateTime.Parse("01/11/2016"),
                    EndDate     = DateTime.Parse("30/11/2017"),
                    DateOfMoth  = 0,
                    NthWeekday  = (WeekdaySequences)weekdaySequence, // number of weekday
                    Weekday     = (Weekdays)weekday,                 // weekday
                    NumOfMonths = frequency                          // frequency
                };
            }

            return(service.CheckAvailability(DateTime.Parse(currentDate), model));
        }
        public async Task SaveAsync_DoNotUpdateIfNoChanges()
        {
            var repoMock = new Mock <IPlannedRecurrenceRepository>();

            repoMock.Setup(x => x.GetByIdAsync("42"))
            .Returns(() => Task.FromResult(new PlannedRecurrenceEntity
            {
                Uid           = "42",
                Task          = "42",
                StartDate     = new DateTime(2010, 10, 10),
                EndDate       = new DateTime(2011, 11, 11),
                EveryWeekday  = RecurrenceWeekdayEnum.Monday | RecurrenceWeekdayEnum.Sunday,
                EveryMonthDay = "1,2,3",
                EveryNthDay   = 100500
            }));
            var service = new RecurrenceService(repoMock.Object, Mapper, _specFactoryMock.Object);

            await service.SaveAsync(new[]
            {
                new PlannedRecurrenceDto
                {
                    Uid           = "42",
                    Task          = "42",
                    StartDate     = new DateTime(2010, 10, 10),
                    EndDate       = new DateTime(2011, 11, 11),
                    EveryWeekday  = RecurrenceWeekdayEnum.Monday | RecurrenceWeekdayEnum.Sunday,
                    EveryMonthDay = "1,2,3",
                    EveryNthDay   = 100500
                }
            }, null);

            repoMock.Verify(x => x.GetByIdAsync("42"));
            repoMock.Verify(x => x.AnyAsync(It.IsAny <IPlannedRecurrenceSpecification>()));
            repoMock.VerifyNoOtherCalls();
        }
        public async Task SaveAsync_DeleteIfDtoIsDeleted()
        {
            var repoMock = MocksCreator.RepoRecurrence();
            var service  = new RecurrenceService(repoMock.Object, Mapper, _specFactoryMock.Object);

            await service.SaveAsync(new[] { new PlannedRecurrenceDto {
                                                Uid = "42", IsDeleted = true
                                            } }, null);

            repoMock.Verify(x => x.DeleteAsync("42"));
            repoMock.Verify(x => x.AnyAsync(It.IsAny <IPlannedRecurrenceSpecification>()));
            repoMock.VerifyNoOtherCalls();
        }
        public bool TestCheckAvailabilityForDailyEvents(string currentDate, int frequency)
        {
            var service = new RecurrenceService();

            // recur every day.
            var model = new RecurrenceDailyModel
            {
                StartDate = DateTime.Parse("01/11/2016"),
                EndDate   = DateTime.Parse("31/01/2017"),
                Days      = frequency
            };

            return(service.CheckAvailability(DateTime.Parse(currentDate), model));
        }
        public async Task SaveAsync_CheckIsUserCanEdit()
        {
            var repoMock = MocksCreator.RepoRecurrence(new PlannedRecurrenceEntity {
                UserId = "other", Uid = "1"
            });

            repoMock.Setup(x => x.AnyAsync(It.IsAny <IPlannedRecurrenceSpecification>()))
            .Returns(Task.FromResult(true));

            var service = new RecurrenceService(repoMock.Object, Mapper, _specFactoryMock.Object);

            var list   = new PlannedRecurrenceDto[] { new() { Uid = "1" } };
            var userId = "userid";

            await Assert.ThrowsAsync <ServiceException>(() => service.SaveAsync(list, userId));
        }
        public async Task SaveAsync_CreateNewIfNoSuchUid()
        {
            var repoMock = MocksCreator.RepoRecurrence();
            var service  = new RecurrenceService(repoMock.Object, Mapper, _specFactoryMock.Object);

            await service.SaveAsync(new[] { new PlannedRecurrenceDto {
                                                Uid = "42", Task = "42"
                                            } }, "userid1");

            repoMock.Verify(x => x.UpsertAsync(It.Is <PlannedRecurrenceEntity>(y =>
                                                                               y.Uid == "42" &&
                                                                               y.Task == "42" &&
                                                                               y.UserId == "userid1")));
            repoMock.Verify(x => x.AnyAsync(It.IsAny <IPlannedRecurrenceSpecification>()));
            repoMock.Verify(x => x.GetByIdAsync("42"));
            repoMock.VerifyNoOtherCalls();
        }
        public bool TestCheckAvailabilityForWeeklyEvents(string currentDate, int frequency)
        {
            var service = new RecurrenceService();

            var model = new RecurrenceWeeklyModel
            {
                StartDate  = DateTime.Parse("1/11/2016"),
                EndDate    = DateTime.Parse("31/1/2017"),
                NumOfWeeks = frequency,
                Monday     = true,
                Tuesday    = false,
                Wednesday  = false,
                Thursday   = true,
                Friday     = true,
                Saturday   = false,
                Sunday     = true
            };

            var result = service.CheckAvailability(DateTime.Parse(currentDate), model);

            return(result);
        }
        public string TestAdjustRecurringDate(string startDate)
        {
            var service = new RecurrenceService();

            var model = new RecurrenceWeeklyModel
            {
                StartDate  = DateTime.Parse(startDate),
                EndDate    = DateTime.Parse("31/1/2017"),
                NumOfWeeks = 1,
                Monday     = true,
                Tuesday    = false,
                Wednesday  = false,
                Thursday   = true,
                Friday     = true,
                Saturday   = false,
                Sunday     = true
            };

            var availableDates = service.AdjustRecurringDate(model);

            var result = availableDates.Keys.Min(x => x.Date);

            return(result.Date.ToString("d/MM/yyyy"));
        }