public async Task CanCreateShiftRecurringWorkItem()
        {
            var dto    = new RecurringWorkItemDto();
            int userId = 1;

            var shift = new Shift()
            {
                Name      = "Shift",
                Id        = 60,
                StartHour = 9,
                EndHour   = 17
            };

            dto.CompletionMode    = CompletionMode.AnyAssigned;
            dto.DescriptionMarkup = "Description";
            dto.Location          = "Location";
            dto.Name     = "Name";
            dto.PatrolId = 1;
            dto.Shifts   = new List <ShiftRecurringWorkItemDto>();
            var shiftRecurringWorkItem = new ShiftRecurringWorkItemDto()
            {
                ScheduledAtHour     = 10,
                ScheduledAtMinute   = 0,
                ShiftAssignmentMode = ShiftAssignmentMode.Auto,
                ShiftId             = shift.Id
            };

            dto.Shifts.Add(shiftRecurringWorkItem);

            var patrol = new Api.Models.Patrol()
            {
                Id       = 1,
                Name     = "Patrol",
                TimeZone = TimeZoneInfo.Local.Id
            };

            _patrolRepositoryMock.Setup(x => x.GetPatrol(patrol.Id))
            .Returns(Task.FromResult(patrol))
            .Verifiable();

            _workItemRepository.Setup(x => x.InsertShiftRecurringWorkItem(It.Is <ShiftRecurringWorkItem>(y => y.ShiftId == shiftRecurringWorkItem.ShiftId)))
            .Verifiable();

            _workItemRepository.Setup(x => x.InsertRecurringWorkItem(It.Is <RecurringWorkItem>(y => y.Name == dto.Name)))
            .Verifiable();

            var now = new DateTimeOffset(2001, 1, 1, 0, 0, 0, new TimeSpan());

            _systemClockMock.Setup(x => x.UtcNow).Returns(now);

            await _workItemService.SaveRecurringWorkItem(dto, userId, false, false);

            _workItemRepository.Verify();
        }
        public async Task CanCreateWorkItemAssignmentsForRecurringWorkitem()
        {
            var dto    = new RecurringWorkItemDto();
            int userId = 1;

            var shift = new Shift()
            {
                Name      = "Shift",
                Id        = 60,
                StartHour = 9,
                EndHour   = 17
            };

            dto.CompletionMode    = CompletionMode.AnyAssigned;
            dto.DescriptionMarkup = "Description";
            dto.Location          = "Location";
            dto.Name     = "Name";
            dto.PatrolId = 1;
            dto.Shifts   = new List <ShiftRecurringWorkItemDto>();
            var shiftRecurringWorkItem = new ShiftRecurringWorkItemDto()
            {
                ScheduledAtHour     = 10,
                ScheduledAtMinute   = 0,
                ShiftAssignmentMode = ShiftAssignmentMode.Auto,
                ShiftId             = shift.Id
            };

            dto.Shifts.Add(shiftRecurringWorkItem);

            var now = new DateTimeOffset(2001, 1, 1, 0, 0, 0, new TimeSpan());

            _systemClockMock.Setup(x => x.UtcNow).Returns(now);

            var assignments = new List <ScheduledShiftAssignmentDto>();

            assignments.Add(new ScheduledShiftAssignmentDto()
            {
                Id           = 1,
                AssignedUser = new UserIdentifier()
                {
                    Id = 1, FirstName = "1"
                },
                StartsAt         = new DateTime(2001, 1, 1, 9, 0, 0),
                EndsAt           = new DateTime(2001, 1, 1, 17, 0, 0),
                ScheduledShiftId = 1,
                Shift            = shift
            });
            assignments.Add(new ScheduledShiftAssignmentDto()
            {
                Id           = 2,
                AssignedUser = new UserIdentifier()
                {
                    Id = 2, FirstName = "2"
                },
                StartsAt         = new DateTime(2001, 1, 1, 9, 0, 0),
                EndsAt           = new DateTime(2001, 1, 1, 17, 0, 0),
                ScheduledShiftId = 1,
                Shift            = shift
            });
            assignments.Add(new ScheduledShiftAssignmentDto()
            {
                Id           = 3,
                AssignedUser = new UserIdentifier()
                {
                    Id = 1, FirstName = "1"
                },
                StartsAt         = new DateTime(2001, 1, 2, 9, 0, 0),
                EndsAt           = new DateTime(2001, 1, 2, 17, 0, 0),
                ScheduledShiftId = 2,
                Shift            = shift
            });
            assignments.Add(new ScheduledShiftAssignmentDto()
            {
                Id           = 4,
                AssignedUser = new UserIdentifier()
                {
                    Id = 2, FirstName = "2"
                },
                StartsAt         = new DateTime(2001, 1, 2, 9, 0, 0),
                EndsAt           = new DateTime(2001, 1, 2, 17, 0, 0),
                ScheduledShiftId = 2,
                Shift            = shift
            });

            //_shiftRepositoryMock.Setup(x => x.GetScheduledShiftAssignments(dto.PatrolId, null, now.UtcDateTime, null, null, null, null, dto.Shifts.First().ShiftId))
            //    .Returns(Task.FromResult(assignments.AsEnumerable()))
            //    .Verifiable();

            _workItemRepository.Setup(x => x.GetWorkItemsForShifts(It.Is <List <int> >(x => assignments.Select(x => x.ScheduledShiftId).Distinct().ToArray().SequenceEqual(x.ToArray()))))
            .Returns(Task.FromResult(new List <WorkItem>()
            {
                new WorkItem()
                {
                    Id = 1,
                    ScheduledShiftId    = 1,
                    RecurringWorkItemId = 1,
                    CompletionMode      = dto.CompletionMode,
                    DescriptionMarkup   = dto.DescriptionMarkup,
                    Name        = dto.Name,
                    Location    = dto.Location,
                    ScheduledAt = new DateTime(2001, 1, 1, 9, 0, 0)
                },
                new WorkItem()
                {
                    Id = 2,
                    ScheduledShiftId    = 2,
                    RecurringWorkItemId = 1,
                    CompletionMode      = dto.CompletionMode,
                    DescriptionMarkup   = dto.DescriptionMarkup,
                    Name        = dto.Name,
                    Location    = dto.Location,
                    ScheduledAt = new DateTime(2001, 1, 2, 9, 0, 0)
                }
            }.AsEnumerable()))
            .Verifiable();

            _workItemRepository.Setup(x => x.GetWorkItemAssignmentsForShifts(It.Is <List <int> >(x => assignments.Select(x => x.ScheduledShiftId).Distinct().ToArray().SequenceEqual(x.ToArray()))))
            .Returns(Task.FromResult(new List <WorkItemAssignment>().AsEnumerable()))
            .Verifiable();

            _workItemRepository.Setup(x => x.GetRecurringWorkItemsForShifts(It.Is <List <int> >(x => assignments.Select(x => x.ScheduledShiftId).Distinct().ToArray().SequenceEqual(x.ToArray()))))
            .Returns(Task.FromResult(new List <RecurringWorkItem>()
            {
                new RecurringWorkItem()
                {
                    CompletionMode    = dto.CompletionMode,
                    DescriptionMarkup = dto.DescriptionMarkup,
                    Id       = 1,
                    Location = dto.Location,
                    Name     = dto.Name,
                    PatrolId = dto.PatrolId,
                }
            }.AsEnumerable()))
            .Verifiable();

            _workItemRepository.Setup(x => x.GetShiftRecurringWorkItemsForShifts(It.Is <List <int> >(x => assignments.Select(x => x.ScheduledShiftId).Distinct().ToArray().SequenceEqual(x.ToArray()))))
            .Returns(Task.FromResult(new List <ShiftRecurringWorkItem>()
            {
                new ShiftRecurringWorkItem()
                {
                    Id = 1,
                    RecurringWorkItemId = 1,
                    ScheduledAtHour     = shiftRecurringWorkItem.ScheduledAtHour,
                    ScheduledAtMinute   = shiftRecurringWorkItem.ScheduledAtMinute,
                    ShiftAssignmentMode = shiftRecurringWorkItem.ShiftAssignmentMode,
                    ShiftId             = shift.Id
                }
            }.AsEnumerable()))
            .Verifiable();

            _workItemRepository.Setup(x => x.InsertWorkItemAssignment(It.Is <WorkItemAssignment>(y => y.UserId == 1)))
            .Verifiable();
            _workItemRepository.Setup(x => x.InsertWorkItemAssignment(It.Is <WorkItemAssignment>(y => y.UserId == 2)))
            .Verifiable();


            await _workItemService.RecalculateShiftWorkItemAssignments(assignments);

            _workItemRepository.Verify();
        }
        public async Task CanCreateWorkItemsFromShiftRecurringWorkitem()
        {
            var dto    = new RecurringWorkItemDto();
            int userId = 1;

            var shift = new Shift()
            {
                Name      = "Shift",
                Id        = 60,
                StartHour = 9,
                EndHour   = 17
            };

            dto.CompletionMode    = CompletionMode.AnyAssigned;
            dto.DescriptionMarkup = "Description";
            dto.Location          = "Location";
            dto.Name     = "Name";
            dto.PatrolId = 1;
            dto.Shifts   = new List <ShiftRecurringWorkItemDto>();
            var shiftRecurringWorkItem = new ShiftRecurringWorkItemDto()
            {
                ScheduledAtHour     = 10,
                ScheduledAtMinute   = 0,
                ShiftAssignmentMode = ShiftAssignmentMode.Auto,
                ShiftId             = shift.Id
            };

            dto.Shifts.Add(shiftRecurringWorkItem);

            var patrol = new Api.Models.Patrol()
            {
                Id       = 1,
                Name     = "Patrol",
                TimeZone = TimeZoneInfo.Local.Id
            };

            _workItemRepository.Setup(x => x.GetShiftRecurringWorkItems(It.IsAny <int>()))
            .Returns(Task.FromResult(new List <ShiftRecurringWorkItem>()
            {
                new ShiftRecurringWorkItem()
                {
                    RecurringWorkItemId = 0,
                    ScheduledAtHour     = 9,
                    ScheduledAtMinute   = 0,
                    ShiftAssignmentMode = ShiftAssignmentMode.Auto,
                    ShiftId             = shift.Id
                }
            }.AsEnumerable()))
            .Verifiable();

            var now = new DateTimeOffset(2001, 1, 1, 0, 0, 0, new TimeSpan());

            _systemClockMock.Setup(x => x.UtcNow).Returns(now);

            _workItemRepository.Setup(x => x.GetWorkItems(It.IsAny <int>(), now.UtcDateTime))
            .Returns(Task.FromResult(new List <WorkItem>()
            {
            }.AsEnumerable()))
            .Verifiable();

            var assignments = new List <ScheduledShiftAssignmentDto>();

            assignments.Add(new ScheduledShiftAssignmentDto()
            {
                Id           = 1,
                AssignedUser = new UserIdentifier()
                {
                    Id = 1, FirstName = "1"
                },
                StartsAt         = new DateTime(2001, 1, 1, 9, 0, 0),
                EndsAt           = new DateTime(2001, 1, 1, 17, 0, 0),
                ScheduledShiftId = 1,
                Shift            = shift
            });
            assignments.Add(new ScheduledShiftAssignmentDto()
            {
                Id           = 2,
                AssignedUser = new UserIdentifier()
                {
                    Id = 2, FirstName = "2"
                },
                StartsAt         = new DateTime(2001, 1, 1, 9, 0, 0),
                EndsAt           = new DateTime(2001, 1, 1, 17, 0, 0),
                ScheduledShiftId = 1,
                Shift            = shift
            });
            assignments.Add(new ScheduledShiftAssignmentDto()
            {
                Id           = 3,
                AssignedUser = new UserIdentifier()
                {
                    Id = 1, FirstName = "1"
                },
                StartsAt         = new DateTime(2001, 1, 2, 9, 0, 0),
                EndsAt           = new DateTime(2001, 1, 2, 17, 0, 0),
                ScheduledShiftId = 2,
                Shift            = shift
            });
            assignments.Add(new ScheduledShiftAssignmentDto()
            {
                Id           = 4,
                AssignedUser = new UserIdentifier()
                {
                    Id = 2, FirstName = "2"
                },
                StartsAt         = new DateTime(2001, 1, 2, 9, 0, 0),
                EndsAt           = new DateTime(2001, 1, 2, 17, 0, 0),
                ScheduledShiftId = 2,
                Shift            = shift
            });

            _shiftRepositoryMock.Setup(x => x.GetScheduledShiftAssignments(dto.PatrolId, null, now.UtcDateTime, null, null, null, null, dto.Shifts.First().ShiftId))
            .Returns(Task.FromResult(assignments.AsEnumerable()))
            .Verifiable();

            _workItemRepository.Setup(x => x.InsertWorkItem(It.Is <WorkItem>(y => y.ScheduledShiftId == 1)))
            .Verifiable();
            _workItemRepository.Setup(x => x.InsertWorkItem(It.Is <WorkItem>(y => y.ScheduledShiftId == 2)))
            .Verifiable();

            await _workItemService.PopulateShiftWorkItemOccurences(dto, now.UtcDateTime, userId, patrol, false);

            _workItemRepository.Verify();
            _shiftRepositoryMock.Verify();
        }