diff Library/LibrarySystem.Tests/Core/LibraryTests.cs @ 43:aef06698d9e2 Test

Added the library tests
author Steven Hollidge <stevenhollidge@hotmail.com>
date Wed, 04 Apr 2012 19:20:20 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Library/LibrarySystem.Tests/Core/LibraryTests.cs	Wed Apr 04 19:20:20 2012 +0100
@@ -0,0 +1,374 @@
+using System;
+using System.Collections.Generic;
+using LibrarySystem.Core;
+using LibrarySystem.Interfaces;
+using NUnit.Framework;
+
+namespace LibrarySystem.Tests.Core
+{
+    [TestFixture]
+    public class LibraryTests
+    {
+        #region Factory methods to setup fixed scenario for testing
+        
+        // Factory that creates:
+        //      A library object with 10 books (2 x Lord of the Flies, 3 x 1984, 5 x Brave New World)
+        private ILibrary CreateLibraryScenario()
+        {
+            #region Publisher
+
+            IPublisher penguin = Publisher.Create("Penguin");
+            
+            #endregion
+
+            #region Publications
+
+            IPublication lordOfTheFlies = Publication.Create("William Golding", "0140283331", penguin, "Lord of the Flies");
+
+            IPublication nineteenEightyFour = Publication.Create("George Orwell", "0452284236", penguin, "Nineteen Eighty-Four");
+
+            IPublication braveNewWorld = Publication.Create("Aldous Huxley", "0060850523", penguin, "Brave New World");
+
+            #endregion
+
+            #region Books
+
+            // Lord of the flies
+            IBook book1 = Book.Create("0000001", lordOfTheFlies);
+            IBook book2 = Book.Create("0000002", lordOfTheFlies);
+            IBook book3 = Book.Create("0000003", lordOfTheFlies);
+
+            // 1984
+            IBook book4 = Book.Create("0000004", nineteenEightyFour);
+            IBook book5 = Book.Create("0000005", nineteenEightyFour); 
+
+            // Brave new world
+            IBook book6 = Book.Create("0000006", braveNewWorld);
+            IBook book7 = Book.Create("0000007", braveNewWorld);
+            IBook book8 = Book.Create("0000008", braveNewWorld);
+            IBook book9 = Book.Create("0000009", braveNewWorld);
+            IBook book10 = Book.Create("0000010", braveNewWorld);
+
+            #endregion
+            
+            #region Library
+
+            ILibrary library = Library.Create("Leicester Square");
+            library.AddStock(book1, book2, book3, book4, book5, book6, book7, book8, book9, book10);
+
+            #endregion
+
+            return library;
+        }
+
+        public IBook CreateBook(string bookId = "dummy")
+        {
+            IPublisher publisher = Publisher.Create("dummy");
+            IPublication publication = Publication.Create("dummy", "dummy", publisher, "dummy");
+            IBook book = Book.Create(bookId, publication);
+            return book;
+        }
+
+        #endregion
+
+        #region Create
+
+        [Test]
+        public void Create_WithNullLocation_ThrowsArgumentNullException()
+        {
+            Assert.Throws<ArgumentNullException>(() => Library.Create(null));
+        }
+
+        #endregion
+
+        #region AddStock
+
+        [Test]
+        public void AddStock_WithNullBook_ShouldThrowArgumentNullException()
+        {
+            var library = CreateLibraryScenario();
+            Assert.Throws<ArgumentNullException>(() => library.AddStock(null));
+        }
+
+        [Test]
+        public void AddStock_WithOneValidBookAndOneNullBook_ShouldThrowArgumentNullException()
+        {
+            var library = CreateLibraryScenario();
+            var validBook = CreateBook();
+            Assert.Throws<ArgumentNullException>(() => library.AddStock(validBook, null));
+        }
+
+        [Test]
+        public void AddStock_WithValidBook_ShouldIncreaseStockListCountByOne()
+        {
+            //arrange
+            var library = CreateLibraryScenario();
+            var expected = library.StockList.Count + 1;
+            var dummyBook = CreateBook();
+
+            //act
+            library.AddStock(dummyBook);
+            var actual = library.StockList.Count;
+
+            //assert
+            Assert.AreEqual(expected, actual);
+        }
+
+        [Test]
+        public void AddStock_WithBookIdAlreadyInStock_ShouldThrowException()
+        {
+            //arrange
+            var library = CreateLibraryScenario();
+            var idThatIsAlreadyInStock = "0000001";
+            var dummyBook = CreateBook(idThatIsAlreadyInStock);
+
+            //act
+            Assert.Throws<Exception>(
+                () => library.AddStock(dummyBook), 
+                string.Format("Book with {0} is already in stock", idThatIsAlreadyInStock));
+        }
+
+        [Test]
+        public void AddStock_WithValidBook_ShouldMakeBookAvailable()
+        {
+            //arrange
+            var library = CreateLibraryScenario();
+            var id = "0000001";
+            var dummyBook = CreateBook();
+
+            //act
+            library.AddStock(dummyBook);
+            var lookupBook = ((List<IStock>) library.StockList).Find(s => s.Book.Id == id);
+            var actual = lookupBook.IsAvailable;
+
+            //assert
+            Assert.IsTrue(actual);
+        }
+
+        #endregion
+
+        #region IsBookAvailableByISBN
+
+        [Test]
+        public void IsBookAvailableByISBN_WithNullISBN_ShouldThrowArgumentNullExpection()
+        {
+            var library = CreateLibraryScenario();
+            Assert.Throws<ArgumentNullException>(() => library.IsBookAvailableByISBN(null));
+        }
+
+        [Test]
+        public void IsBookAvailableByISBN_WithValidISBN_ShouldReturnTrue()
+        {
+            var library = CreateLibraryScenario();
+
+            // Lord of the flies
+            var validISBN = "0140283331";
+
+            var actual = library.IsBookAvailableByISBN(validISBN);
+
+            Assert.IsTrue(actual);
+        }
+
+        [Test]
+        public void IsBookAvailableByISBN_WithUnknownISBN_ShouldReturnFalse()
+        {
+            var library = CreateLibraryScenario();
+
+            // rubbish data
+            var unknownISBN = "X";
+
+            var actual = library.IsBookAvailableByISBN(unknownISBN);
+
+            Assert.IsFalse(actual);
+        }
+
+        #endregion
+
+        #region FindBooks
+
+        [Test]
+        public void FindBooks_WhenNullSearchString_ShouldThrowArgumentNullExpection()
+        {
+            var library = CreateLibraryScenario();
+            Assert.Throws<ArgumentNullException>(() => library.FindBooks(null));
+        }
+
+
+        [Test]
+        public void FindBooks_WithValidSearchTitleString_ShouldReturnCorrectNumberOfBooks()
+        {
+            var library = CreateLibraryScenario();
+
+            // good search string
+            var searchString = "Flies";
+
+            // number of Lord of the Flies books expected
+            var expected = 3;
+            var actual = library.FindBooks(searchString).Count;
+
+            Assert.AreEqual(expected, actual);
+        }
+
+        [Test]
+        public void FindBooks_WithValidSearchTitleStringLowerCase_ShouldReturnCorrectNumberOfBooks()
+        {
+            var library = CreateLibraryScenario();
+
+            // good search string
+            var searchString = "flies";
+
+            // number of Lord of the Flies books expected
+            var expected = 3;
+            var actual = library.FindBooks(searchString).Count;
+
+            Assert.AreEqual(expected, actual);
+        }
+
+        [Test]
+        public void FindBooks_WithValidSearchStringMultiplePublications_ShouldReturnCorrectNumberOfBooks()
+        {
+            var library = CreateLibraryScenario();
+
+            // good search string
+            var searchString = "e";
+
+            // number of Lord of the Flies books expected
+            var expected = 10;
+            var actual = library.FindBooks(searchString).Count;
+
+            Assert.AreEqual(expected, actual);
+        }
+
+        [Test]
+        public void FindBooks_WithValidSearchAuthorString_ShouldReturnCorrectNumberOfBooks()
+        {
+            var library = CreateLibraryScenario();
+
+            // number of Brave New World books expected
+            var expected = 5;
+            var searchString = "ldous";
+
+            var actual = library.FindBooks(searchString).Count;
+
+            Assert.AreEqual(expected, actual);
+        }
+
+        [Test]
+        public void FindBooks_WithInvalidSearchString_ShouldBeEmpty()
+        {
+            var library = CreateLibraryScenario();
+
+            // rubbish data
+            var searchString = "XYZ";
+
+            var actual = library.FindBooks(searchString);
+
+            Assert.IsEmpty(actual);
+        }
+
+        #endregion
+
+        #region GetBookById
+
+        [Test]
+        public void GetBookById_WhenNullId_ShouldThrowArgumentNullExpection()
+        {
+            var library = CreateLibraryScenario();
+            Assert.Throws<ArgumentNullException>(() => library.GetBookById(null));
+        }
+
+        [Test]
+        public void GetBookById_WhenValidId_ShouldReturnBook()
+        {
+            var library = CreateLibraryScenario();
+            var validBookId = "0000001";
+            var book = library.GetBookById(validBookId);
+            Assert.IsNotNull(book);
+        }
+
+        [Test]
+        public void GetBookById_WhenValidId_ShouldReturnNull()
+        {
+            var library = CreateLibraryScenario();
+            var invalidBookId = "X";
+            var book = library.GetBookById(invalidBookId);
+            Assert.IsNull(book);
+        }
+
+        #endregion
+
+        #region LendBook
+
+        [Test]
+        public void LendBook_ShouldMakeBookInLibraryStockListUnavailable()
+        {
+            //arrange 
+            var library = CreateLibraryScenario();
+            var person = CreatePerson();
+            var bookId = "0000001";
+
+            // act
+            library.LendBook(person, bookId);
+            var lookupBook = ((List<IStock>) library.StockList).Find(s => s.Book.Id == bookId);
+            var actual = lookupBook.IsAvailable;
+
+            // assert
+            Assert.IsFalse(actual);
+        }
+
+        private IPerson CreatePerson()
+        {
+            var person = Person.Create("dummy", "dummy");
+            return person;
+        }
+
+        [Test]
+        public void LendBook_WithNullPerson_ShouldThrowArgumentNullException()
+        {
+            //arrange 
+            var library = CreateLibraryScenario();
+            var id = "dummy";
+
+            // act & assert
+            Assert.Throws<ArgumentNullException>(() => library.LendBook(null, id));
+        }
+
+        [Test]
+        public void LendBook_WithNullBook_ShouldThrowArgumentNullException()
+        {
+            //arrange 
+            var library = CreateLibraryScenario();
+            var person = CreatePerson();
+
+            // act & assert
+            Assert.Throws<ArgumentNullException>(() => library.LendBook(person, null));
+        }
+
+        [Test]
+        public void LendBook_WithNullBookAndNullPerson_ShouldThrowArgumentNullException()
+        {
+            //arrange 
+            var library = CreateLibraryScenario();
+
+            // act & assert
+            Assert.Throws<ArgumentNullException>(() => library.LendBook(null, null));
+        }
+
+        [Test]
+        public void LendBook_WithUnknownBook_ShouldThrowArgumentException()
+        {
+            //arrange 
+            var library = CreateLibraryScenario();
+            var person = CreatePerson();
+            var id = "dummy";
+
+            // act & assert
+            Assert.Throws<Exception>(
+                () => library.LendBook(person, id), 
+                string.Format("Book id {0} is not in stock", id));
+        }
+
+        #endregion
+        
+    }
+}