public async Task CheckedOutBooksReturnsSuccess()
        {
            var bookServiceMock = new Mock<IBooksService>();
            var checkedOutBook = new CheckedOutBookDTO
            {
                State = CheckedOutBookState.Success
            };
            bookServiceMock.Setup(bs => bs.CheckOutBook(It.IsAny<int>()))
                .ReturnsAsync(checkedOutBook);


            var controller = new BooksController(bookServiceMock.Object);

            var result = await controller.CheckoutBook(1) as OkResult;

            Assert.IsNotNull(result);
        }
        public async Task<CheckedOutBookDTO> CheckOutBook(int bookId)
        {
            var userId = _userService.UserId;

            var book = await _repository.GetBook(bookId);
            if (book == null)
            {
                return new CheckedOutBookDTO { State = CheckedOutBookState.BookNotFound };
            }

            var checkedOutBookDTO = new CheckedOutBookDTO
            {
                Author = book.Author,
                BookId = book.BookId,
                Title = book.Title
            };

            var booksCheckedOut = await _repository.GetCheckedOutBooks(userId);

            if (booksCheckedOut != null && booksCheckedOut.Count() >= 3)
            {
                checkedOutBookDTO.State = CheckedOutBookState.TooManyBooksCheckedOut;
                return checkedOutBookDTO;
            }

            var physicalBookToCheckOut = book.PhysicalBooks.FirstOrDefault(pb => pb.UserId == null);
            if (physicalBookToCheckOut == null)
            {
                checkedOutBookDTO.State = CheckedOutBookState.BookIsNotAvailable;
                return checkedOutBookDTO;
            }

            await _repository.CheckoutBook(physicalBookToCheckOut, userId);
            checkedOutBookDTO.State = CheckedOutBookState.Success;
            checkedOutBookDTO.PhysicalBookId = physicalBookToCheckOut.Id;

            return checkedOutBookDTO;
        }