public async Task TestTodoService_GetById_ShouldCallFindRepositoryAndAutoMapper()
        {
            // Arrange
            var expectedTodos = new TodoModel[] { };
            // mock repository
            Mock <IRepository <TodoModel> > todoRepository = new Mock <IRepository <TodoModel> >();

            todoRepository.Setup(repo => repo.Find(It.IsAny <Expression <Func <TodoModel, bool> > >()))
            .Returns(expectedTodos.AsQueryable());
            // mock automapper
            var mapperMock = new Mock <IMapper>();

            mapperMock.Setup(m => m.Map <Todo>(It.IsAny <TodoModel>()))
            .Returns(It.IsAny <Todo>());

            var cacheMock = new Mock <ICacheProvider>();

            cacheMock.Setup(x => x.GetAsync <Todo>(It.IsAny <string>())).ReturnsAsync(It.IsAny <Todo>());
            cacheMock.Setup(x => x.SetAsync <Todo>(It.IsAny <string>(), It.IsAny <Todo>(), TimeSpan.FromSeconds(10))).Returns(Task.CompletedTask);
            cacheMock.Setup(x => x.CacheOptions).Returns(new CacheOptions {
                DefaultCacheTime = 10000, IsCachingEnabled = false
            });
            var todoService = new TodoService(todoRepository.Object, mapperMock.Object, cacheMock.Object);

            // Act
            var result = await todoService.GetByIdAsync(1);

            // Assert
            todoRepository.Verify(x => x.Find(It.IsAny <Expression <Func <TodoModel, bool> > >()), Times.Once);
            mapperMock.Verify(x => x.Map <Todo>(It.IsAny <TodoModel>()), Times.Once);
        }
        public void TestTodoService_GetAll_ShouldCallFindAllRepositoryAndAutoMapper()
        {
            // Arrange
            var expectedTodos = new TodoModel[] { };
            Mock <IRepository <TodoModel> > todoRepository = new Mock <IRepository <TodoModel> >();

            todoRepository.Setup(x => x.FindAll())
            .Returns(expectedTodos.AsQueryable());
            var mapperMock = new Mock <IMapper>();

            mapperMock.Setup(m => m.Map <IEnumerable <Todo> >(It.IsAny <IEnumerable <TodoModel> >()))
            .Returns(It.IsAny <IEnumerable <Todo> >());
            var cacheMock = new Mock <ICacheProvider>();

            var todoService = new TodoService(todoRepository.Object, mapperMock.Object, cacheMock.Object);

            // Act
            var results = todoService.GetAllData();

            // Assert
            todoRepository.Verify(x => x.FindAll(), Times.Once);
            mapperMock.Verify(x => x.Map <IEnumerable <Todo> >(It.IsAny <IEnumerable <TodoModel> >()), Times.Once);
        }
        public void TestTodoService_UnComplete_ShouldCompleteTodo()
        {
            // Arrange
            var expectedTodos = new TodoModel[] {
                new TodoModel {
                    Id          = 1,
                    IsCompleted = true
                }
            };
            var mappedTodoDomainModel = new Mock <Todo>();
            // mock repository
            Mock <IRepository <TodoModel> > todoRepository = new Mock <IRepository <TodoModel> >();

            todoRepository.Setup(repo => repo.Find(It.IsAny <Expression <Func <TodoModel, bool> > >()))
            .Returns(expectedTodos.AsQueryable());
            todoRepository.Setup(repo => repo.Update(It.IsAny <TodoModel>()));
            // mock automapper
            var mapperMock = new Mock <IMapper>();

            mapperMock.Setup(m => m.Map <Todo>(It.IsAny <TodoModel>()))
            .Returns(mappedTodoDomainModel.Object);
            mapperMock.Setup(m => m.Map <Todo, TodoModel>(It.IsAny <Todo>(), It.IsAny <TodoModel>()))
            .Returns(It.IsAny <TodoModel>());
            var cacheMock = new Mock <ICacheProvider>();

            var todoService = new TodoService(todoRepository.Object, mapperMock.Object, cacheMock.Object);

            // Act
            todoService.UnComplete(1);

            // Assert
            todoRepository.Verify(x => x.Find(It.IsAny <Expression <Func <TodoModel, bool> > >()), Times.Once);
            todoRepository.Verify(x => x.Update(It.IsAny <TodoModel>()), Times.Once);
            mapperMock.Verify(x => x.Map <Todo>(It.IsAny <TodoModel>()), Times.Once);
            mapperMock.Verify(x => x.Map <Todo, TodoModel>(It.IsAny <Todo>(), It.IsAny <TodoModel>()), Times.Once);
            mappedTodoDomainModel.Verify(x => x.UnComplete(), Times.Once);
        }