public GetToDoItemsOutput GetToDoItems(GetToDoItemInput input)
        {
            this.Logger.Info($"Getting ToDoItems for input: {input}");

            using (this.DbContextScopeFactory.CreateReadOnly())
            {
                var query = this.toDoItemRepository.GetAll();

                if (!string.IsNullOrEmpty(input.AssignedUserId))
                {
                    query = query.Where(toDoItem => toDoItem.AssignedUserId == input.AssignedUserId);
                }

                if (input.State.HasValue)
                {
                    query = query.Where(toDoItem => toDoItem.State == this.Mapper.Map<ToDoItemState>(input.State.Value));
                }

                var toDoItems = query.OrderByDescending(toDoItem => toDoItem.CreationTime).Include(toDoItem => toDoItem.AssignedUser).ToList();
                var output = new GetToDoItemsOutput { ToDoItems = this.Mapper.Map<List<ToDoItemDto>>(toDoItems) };

                this.Logger.Info($"Got ToDoItems output: {output} for input: {input}");

                return output;
            }
        }
        public void ShouldGetToDoItemsWithoutUserAndState()
        {
            var getToDoItemInput = new GetToDoItemInput
            {
                AssignedUserId = null,
                State = null
            };

            var toDoItems = this.CreateToDoItems(NumberOfToDoItemsToCreate).AsQueryable();
            toDoItems.ToList().ForEach(
                toDoItem =>
                {
                    toDoItem.AssignedUserId = Guid.NewGuid().ToString();
                    toDoItem.State = (ToDoItemState)this.enumGenerator.Next(0, Enum.GetValues(typeof(ToDoItemState)).Length);
                });

            using (this.Repository.Record())
            {
                Expect.Call(() => this.Logger.Info(Arg.Text.Contains("Getting ToDoItems for input:")));
                Expect.Call(this.DbContextScopeFactory.CreateReadOnly());
                Expect.Call(this.ToDoItemRepository.GetAll()).Return(toDoItems);
                Expect.Call(this.Mapper.Map<ToDoItemState>(null)).Constraints(Is.Anything()).Repeat.Never();
                Expect.Call(this.Mapper.Map<List<ToDoItemDto>>(Arg<List<ToDoItem>>.List.Count(Is.Equal(toDoItems.Count()))));
                Expect.Call(() => this.Logger.Info(Arg.Text.Contains("Got ToDoItems output:")));
            }

            using (this.Repository.Playback())
            {
                var toDoItemApplicationService = new ToDoItemApplicationService(
                    this.ToDoItemRepository,
                    this.UserRepository,
                    this.DbContextScopeFactory,
                    this.Mapper,
                    this.Logger);

                toDoItemApplicationService.GetToDoItems(getToDoItemInput);
            }
        }
        public void ShouldGetToDoItemsWithUserAndState()
        {
            var getToDoItemInput = new GetToDoItemInput
            {
                AssignedUserId = Guid.NewGuid().ToString(),
                State = (Perfectial.Application.Model.ToDoItemState)this.enumGenerator.Next(0, Enum.GetValues(typeof(Perfectial.Application.Model.ToDoItemState)).Length)
            };

            Assert.IsNotNull(getToDoItemInput.State);
            var toDoItemState = (ToDoItemState)getToDoItemInput.State;

            var index = 0;
            var toDoItems = this.CreateToDoItems(NumberOfToDoItemsToCreate).AsQueryable();
            toDoItems.ToList().ForEach(
                toDoItem =>
                    {
                        if (index++ % 2 == 1)
                        {
                            toDoItem.AssignedUserId = getToDoItemInput.AssignedUserId;
                            toDoItem.State = toDoItemState;
                        }
                        else
                        {
                            while (toDoItem.State == toDoItemState)
                            {
                                toDoItem.State = (ToDoItemState)this.enumGenerator.Next(0, Enum.GetValues(typeof(ToDoItemState)).Length);
                            }
                        }
                    });

            using (this.Repository.Record())
            {
                Expect.Call(() => this.Logger.Info(Arg.Text.Contains("Getting ToDoItems for input:")));
                Expect.Call(this.DbContextScopeFactory.CreateReadOnly());
                Expect.Call(this.ToDoItemRepository.GetAll()).Return(toDoItems);
                Expect.Call(this.Mapper.Map<ToDoItemState>(null)).Constraints(Is.Equal(getToDoItemInput.State)).Return(toDoItemState).Repeat.AtLeastOnce();
                Expect.Call(this.Mapper.Map<List<ToDoItemDto>>(Arg<List<ToDoItem>>.List.Count(Is.Equal(toDoItems.Count() / 2))));
                Expect.Call(() => this.Logger.Info(Arg.Text.Contains("Got ToDoItems output:")));
            }

            using (this.Repository.Playback())
            {
                var toDoItemApplicationService = new ToDoItemApplicationService(
                    this.ToDoItemRepository,
                    this.UserRepository,
                    this.DbContextScopeFactory,
                    this.Mapper,
                    this.Logger);
                toDoItemApplicationService.GetToDoItems(getToDoItemInput);
            }
        }