public IHttpActionResult PutBook(int id, Book book) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != book.BookId) { return BadRequest(); } db.Entry(book).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!BookExists(id)) { return NotFound(); } else { throw; } } return StatusCode(HttpStatusCode.NoContent); }
public void BookImplementsIBookInterface() { var book = new Book("author", "title", "call number", 1); Assert.IsAssignableFrom<IBook>(book); var typedMember = book as IBook; Assert.NotNull(typedMember); }
public void BorrowBookThrowsRuntimeExceptionIfBookIsNotCurrentlyAvailable() { // Set book state to something other than Available. var book = new Book("author", "title", "call number", 1) {State = BookState.LOST}; var loan = Substitute.For<ILoan>(); // Associate the book with the loan. var ex = Assert.Throws<InvalidOperationException>(() => book.Borrow(loan)); Assert.Equal("Cannot borrow a book that is not available", ex.Message); }
public void CanGetBook() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); DateTime borrowDate = DateTime.Today; DateTime dueDate = DateTime.Today.AddDays(7); var loan = new Loan(book, member, borrowDate, dueDate); Assert.Equal(book, loan.Book); }
public IHttpActionResult PostBook(Book book) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.Books.Add(book); db.SaveChanges(); return CreatedAtRoute("DefaultApi", new { id = book.BookId }, book); }
public void AddLoanThrowsInvalidOperationExceptionIfMemberIsNotAllowedToBorrow() { var book = new Book("author", "title", "call number", 1); // Set member to BORROWING_DISALLOWED var member = new Member("first", "last", "phone", "email", 1) { State = MemberState.BORROWING_DISALLOWED }; var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; var ex = Assert.Throws<InvalidOperationException>(() => member.AddLoan(loan)); Assert.Equal("Cannot add a loan when member is not allowed to borrow", ex.Message); }
public void CanAddLoanToMember() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); // Add a loan. var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; member.AddLoan(loan); Assert.Contains(loan, member.Loans); }
public void CanCommitLoan() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); DateTime borrowDate = DateTime.Today; DateTime dueDate = DateTime.Today.AddDays(7); var loanId = 1; var loan = new Loan(book, member, borrowDate, dueDate); loan.Commit(loanId); }
public void BorrowBookThrowsRuntimeExceptionIfBookIsNotCurrentlyAvailable() { // Set book state to something other than Available. var book = new Book("author", "title", "call number", 1) { State = BookState.LOST }; var member = new Member("first", "last", "phone", "email", 1); var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)); // Associate the book with the loan. var ex = Assert.Throws<InvalidOperationException>(() => book.Borrow(loan)); Assert.Equal("Cannot borrow a book that is not available", ex.Message); }
public void CanBorrowBook() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)); // Associate the book with the loan. book.Borrow(loan); // Set book state to ON_LOAN - affected by GetLoanFromBookReturnsNullIfBookIsNotON_LOAN() book.State = BookState.ON_LOAN; Assert.Equal(loan, book.Loan); }
public void CanCreateLoan() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); DateTime borrowDate = DateTime.Today; DateTime dueDate = DateTime.Today.AddDays(7); // Jim has stated that the initial spec is incorrect and it should not take an ID, but should return a default ID of 0. var loan = new Loan(book, member, borrowDate, dueDate); Assert.NotNull(loan); // By new rule, assert ID = 0. Assert.Equal(0, loan.ID); }
public void CanRemoveLoanFromMember() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; member.AddLoan(loan); // Make sure Member has Loan. Assert.Contains(loan, member.Loans); member.RemoveLoan(loan); // Make sure Loan has been removed from Member. Assert.DoesNotContain(loan, member.Loans); }
public void CanGetLoans() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var loan1 = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; var loan2 = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; var loan3 = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; var loan4 = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; member.AddLoan(loan1); member.AddLoan(loan2); member.AddLoan(loan3); Assert.Equal(3, member.Loans.Count()); Assert.Contains(loan1, member.Loans); Assert.DoesNotContain(loan4, member.Loans); }
public void BookCtorThrowsIllegalParameterException() { // Test to make sure that author is required. var ex = Assert.Throws<ArgumentException>(() => { var book = new Book("", "", "", 0); }); Assert.Equal("Author needs to be provided.", ex.Message); // Test to make sure that title is required. ex = Assert.Throws<ArgumentException>(() => { var book = new Book("author", "", "", 0); }); Assert.Equal("Title needs to be provided.", ex.Message); // Test to make sure that call number is required. ex = Assert.Throws<ArgumentException>(() => { var book = new Book("author", "title", "", 0); }); Assert.Equal("Call Number needs to be provided.", ex.Message); // Tests to make sure that id is not less than or equal to 0. ex = Assert.Throws<ArgumentException>(() => { var book = new Book("author", "title", "callNumber", 0); }); Assert.Equal("ID needs to be greater than 0.", ex.Message); ex = Assert.Throws<ArgumentException>(() => { var book = new Book("author", "title", "callNumber", -5); }); Assert.Equal("ID needs to be greater than 0.", ex.Message); }
public void ScanningABook_ThatCanBeBorrowed_ShouldBeAddedToPendingLoans( IEventAggregator eventAggregator , [Frozen] IBookDAO bookDao , ILoanDAO loanDao , IMemberDAO memberDao , ScanBookModel scanBookModel , ScanBookViewModel viewModel , Book book , IBorrowingModel borrowingModel , Member borrower , List<ILoan> loanList ) { var fixture = new Fixture(); var loan = fixture.Build<Loan>() .FromFactory(() => new Loan(book, borrower, DateTime.Today, DateTime.Today.AddDays(10))) .Create(); eventAggregator.GetEvent<ScanningRecievedEvent>().Returns(new ScanningRecievedEvent()); eventAggregator.GetEvent<BorrowingStateEvent>().Returns(new BorrowingStateEvent()); eventAggregator.GetEvent<ScanningEvent>().Returns(new ScanningEvent()); // Arrange - Setup book on loan. bookDao.GetBookByID(scanBookModel.Barcode).Returns(book); // 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(); loanDao.LoanList.Returns(loanList); var controller = new ScanBookController(eventAggregator) { BookDao = bookDao, LoanDao = loanDao, MemberDao = memberDao, ViewModel = viewModel }; loanDao.CreateLoan(borrower, book, Arg.Any<DateTime>(), Arg.Any<DateTime>()).Returns(loan); controller.ScanBook(borrowingModel); // Act -Scan a book. controller.Scanning(scanBookModel); // Assert - Results in an error message. viewModel.PendingLoans.Should().NotBeNullOrEmpty(); }
public void WhenBorrowingDisallowedAndLoanRemovedButHasOverdueLoanBorrowingDisallowed() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var overdue = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)) { State = LoanState.CURRENT }; member.AddLoan(overdue); // Set it to overdue overdue.CheckOverDue(DateTime.Today.AddMonths(1)); while (!member.HasReachedLoanLimit) { var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)) { State = LoanState.CURRENT }; member.AddLoan(loan); } // Borrowing state disallowed. Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); // Remove the first one that isn't the overdue mock. member.RemoveLoan(member.Loans.First(l => l != overdue)); Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); }
public void WhenBorrowingDisallowedAndLoanRemovedButHasFinesBorrowingDisallowed() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); while (!member.HasReachedLoanLimit) { var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)) { State = LoanState.CURRENT }; member.AddLoan(loan); } member.AddFine(BookConstants.FINE_LIMIT + 1.00f); // Borrowing state disallowed. Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); // Remove the first one that isn't the overdue mock. member.RemoveLoan(member.Loans[0]); Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); }
public void WhenBorrowingDisallowedAndFinePaidButLoanLimitStillReachedBorrowingDisallowed() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var fineAmount = BookConstants.FINE_LIMIT + 5.00f; while (!member.HasReachedLoanLimit) { var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)) { State = LoanState.CURRENT }; member.AddLoan(loan); } member.AddFine(fineAmount); // Borrowing state disallowed. Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); member.PayFine(fineAmount); Assert.True(member.HasReachedLoanLimit); Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); }
public void WhenBorrowingDisallowedAndLoanRemovedBorrowingAllowed() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); while (!member.HasReachedLoanLimit) { var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)) { State = LoanState.CURRENT }; member.AddLoan(loan); } // Borrowing state disallowed. Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); member.RemoveLoan(member.Loans[0]); Assert.Equal(MemberState.BORROWING_ALLOWED, member.State); }
public void WhenBorrowingAllowedAndRemovingLoanBorrowingAllowed() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; member.AddLoan(loan); Assert.False(member.HasReachedLoanLimit); Assert.Equal(MemberState.BORROWING_ALLOWED, member.State); member.RemoveLoan(loan); Assert.Equal(MemberState.BORROWING_ALLOWED, member.State); }
public void WhenBorrowingDisallowedAndFinePaidButHasOverdueLoansBorrowingDisallowed() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)) { State = LoanState.CURRENT }; var fineAmount = BookConstants.FINE_LIMIT + 5.00f; member.AddLoan(loan); member.AddFine(fineAmount); foreach (var l in member.Loans) l.CheckOverDue(DateTime.Today.AddMonths(1)); // Borrowing state disallowed. Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); member.PayFine(fineAmount); Assert.Equal(MemberState.BORROWING_DISALLOWED, member.State); }
public void ReturnBookReadable() { var author = "Author"; var title = "Title"; var callNumber = "Call Number"; var id = 1; var book = new Book(author, title, callNumber, id); var readable = $"ID:\t\t{book.ID}\nCall Number:\t{book.CallNumber}\nAuthor:\t\t{book.Author}\nTitle:\t\t{book.Title}"; Assert.Equal(readable, book.ToString()); }
public void WhenBorrowingAllowedAndNoOverdueLoansBorrowingAllowed() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; member.AddLoan(loan); Assert.Equal(MemberState.BORROWING_ALLOWED, member.State); foreach (var l in member.Loans) l.CheckOverDue(DateTime.Today); Assert.False(member.HasOverDueLoans); Assert.Equal(MemberState.BORROWING_ALLOWED, member.State); }
public void RemoveLoanThrowsArgumentExceptionIfLoanIsNotInCollection() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); var loan1 = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; var loan2 = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; member.AddLoan(loan1); var ex = Assert.Throws<ArgumentException>(() => member.RemoveLoan(loan2)); Assert.Equal("Loan was not found in member's loans", ex.Message); }
public void HasReachedLoanLimitReturnsTrueIfLoanCountEqualsLoanLimit() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); // Add a loan. var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; member.AddLoan(loan); // Test that Loan Limit is not reached. Assert.True(member.Loans.Count() < BookConstants.LOAN_LIMIT); Assert.False(member.HasReachedLoanLimit); // Add additional loans. while (member.Loans.Count() < BookConstants.LOAN_LIMIT) { member.AddLoan(new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7))); } // Test that Loan Limit has been reached. Assert.True(member.Loans.Count() == BookConstants.LOAN_LIMIT); Assert.True(member.HasReachedLoanLimit); }
public void ReturningBookSetsStateToDamaged() { var book = new Book("author", "title", "call number", 1); var loan = Substitute.For<ILoan>(); book.Borrow(loan); // Set book state to ON_LOAN - affected by GetLoanFromBookReturnsNullIfBookIsNotON_LOAN() book.State = BookState.ON_LOAN; Assert.Equal(loan, book.Loan); // Set damaged flag to true. book.ReturnBook(true); Assert.Null(book.Loan); Assert.Equal(BookState.DAMAGED, book.State); }
public void ReturningBookThrowsExceptionIfNotOnLoan() { var book = new Book("author", "title", "call number", 1); var loan = Substitute.For<ILoan>(); book.Borrow(loan); // Set book state to ON_LOAN - affected by GetLoanFromBookReturnsNullIfBookIsNotON_LOAN() book.State = BookState.ON_LOAN; Assert.Equal(loan, book.Loan); // Set book state to LOST so we can make sure it's not ON_LOAN already. book.State = BookState.LOST; var ex = Assert.Throws<InvalidOperationException>(() => book.ReturnBook(false)); Assert.Equal("Book is currently not on loan", ex.Message); }
public void CanBorrowBook() { var book = new Book("author", "title", "call number", 1); var loan = Substitute.For<ILoan>(); // Associate the book with the loan. book.Borrow(loan); // Set book state to ON_LOAN - affected by GetLoanFromBookReturnsNullIfBookIsNotON_LOAN() book.State = BookState.ON_LOAN; Assert.Equal(loan, book.Loan); }
public void HasOverdueLoansReturnsFalseIfNoLoanIsOverdue() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); // Add a single loan that is not overdue. var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)); member.Loans.Add(loan); Assert.False(member.HasOverDueLoans); }
public void HasOverdueLoansReturnsTrueIfAnyLoanIsOverdue() { var book = new Book("author", "title", "call number", 1); var member = new Member("first", "last", "phone", "email", 1); // Add a single loan that is not overdue. var loan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(14)) { State = LoanState.CURRENT }; member.AddLoan(loan); // Add a second loan that is overdue. var secondLoan = new Loan(book, member, DateTime.Today, DateTime.Today.AddDays(7)) { State = LoanState.CURRENT }; member.AddLoan(secondLoan); // Check if overdue foreach (var l in member.Loans) { l.CheckOverDue(DateTime.Today.AddDays(10)); } Assert.True(member.HasOverDueLoans); }