public void CanScanBook() { var member = CreateMockIMember(); var ctrl = new BorrowController(_display, _reader, _scanner, _printer, _bookDao, _loanDao, _memberDao); InitialiseToScanBookPreConditions(ctrl, member); // Make the bookDao return a successful read _bookDao.GetBookByID(0).Returns(Substitute.For <IBook>()); ctrl.bookScanned(0); // if we get this far we've worked. }
public void ScanningABook_ThatIsOnLoan_ResultsInNotAvailableError(IEventAggregator eventAggregator , IBookDAO bookDao , [Frozen] IBook book , ILoanDAO loanDao , ScanBookModel scanBookModel , IScanBookViewModel viewModel) { // Arrange - Setup book on loan. eventAggregator.GetEvent<BorrowingStateEvent>().Returns(new BorrowingStateEvent()); bookDao.GetBookByID(scanBookModel.Barcode).Returns(book); book.State.Returns(BookState.ON_LOAN); loanDao.LoanList.Returns(new List<ILoan>()); var controller = new ScanBookController(eventAggregator) { BookDao = bookDao, LoanDao = loanDao, ViewModel = viewModel }; // Act -Scan a book. controller.Scanning(scanBookModel); // Assert - viewModel.ErrorMessage.Should().Be($"Book {book.ID} is not available: {book.State}"); }
public void bookScanned(int barcode) { if (_state != EBorrowState.SCANNING_BOOKS) { throw new InvalidOperationException("Control state must be set to 'Scanning Books'"); } var book = _bookDAO.GetBookByID(barcode); if (book == null) { _ui.DisplayErrorMessage("Book scanned was not found"); return; } if (book.State != BookState.AVAILABLE) { _ui.DisplayErrorMessage("Book is not available to be borrowed"); return; } if (_bookList.Contains(book)) { _ui.DisplayErrorMessage("Book has already been scanned"); return; } this.scanCount++; var loan = _loanDAO.CreateLoan(_borrower, book, DateTime.Today, DateTime.Today.AddDays(7)); _ui.DisplayPendingLoan(loan.ToString()); _ui.DisplayScannedBookDetails(book.ToString()); _ui.DisplayErrorMessage(""); _loanList.Add(loan); _bookList.Add(book); if (this.scanCount == BookConstants.LOAN_LIMIT) { _scanner.Enabled = false; setState(EBorrowState.CONFIRMING_LOANS); foreach (var l in _loanList) { _ui.DisplayConfirmingLoan(l.ToString()); } } }
public void ScanningABook_ThatsAlreadyScanned_ResultsInAlreadyScannedError(IEventAggregator eventAggregator , IBookDAO bookDao , [Frozen] IBook book , ILoanDAO loanDao , IMemberDAO memberDao , ScanBookModel scanBookModel , IBorrowingModel borrowingModel , ScanBookViewModel viewModel , List<ILoan> loanList , [Frozen] Member borrower) { // Arrange - Setup a book that has already been scanned. // Mock the events. eventAggregator.GetEvent<BorrowingStateEvent>().Returns(new BorrowingStateEvent()); eventAggregator.GetEvent<ScanningRecievedEvent>().Returns(new ScanningRecievedEvent()); eventAggregator.GetEvent<ScanningEvent>().Returns(new ScanningEvent()); // We are currently in the scanning book state. borrowingModel.BorrowingState.Returns(EBorrowState.SCANNING_BOOKS); // Establish the current user identified on borrowing model, and returned from member dao. borrowingModel.ID = borrower.ID; memberDao.GetMemberByID(borrower.ID).Returns(borrower); // Configure mapping. AutoMapperConfig.RegisterMaps(); // One of the loans in the loan list has a status of pending for the current borrower. var existingLoan = loanList.First(); existingLoan.State.Returns(LoanState.PENDING); existingLoan.Borrower.Returns(borrower); // The loan Dao returns this loan list when requested loanDao.LoanList.Returns(loanList); // The book to be scanned is the same book as already scanned. bookDao.GetBookByID(scanBookModel.Barcode).Returns(existingLoan.Book); // The book is available for loan. existingLoan.Book.State.Returns(BookState.AVAILABLE); var controller = new ScanBookController(eventAggregator) { BookDao = bookDao, LoanDao = loanDao, MemberDao = memberDao, ViewModel = viewModel }; // Prepare Scanner controller.ScanBook(borrowingModel); // Act -Scan a book. controller.Scanning(scanBookModel); // Assert - Already scanned error message appears. viewModel.ErrorMessage.Should().Be($"Book {existingLoan.Book.ID} already scanned "); }