예제 #1
0
class TestBookstore(TestCase):
    def setUp(self):
        self.BS = BookStore()
        self.clear_bookstore()

    def add_test_data(self):
        self.bk1 = Book('An Interesting Book', 'Ann Author', True)
        self.bk2 = Book('Booky Book Book', 'B. Bookwriter', False)
        self.bk3 = Book('Collection of words', 'Creative Creator')

        self.clear_bookstore()

        self.BS.add_book(self.bk1)
        self.BS.add_book(self.bk2)
        self.BS.add_book(self.bk3)

    def clear_bookstore(self):
        self.BS.delete_all_books()

    def test_singleton(self):
        bs = BookStore()
        bs2 = BookStore()
        self.assertEqual(bs, bs2)

    def test_add_book_empty_store(self):
        self.BS.delete_all_books()
        bk = Book('aa', 'aaa')
        self.BS.add_book(bk)
        self.assertTrue(self.BS.get_book_by_id(bk.id))
        self.assertEqual(1, self.BS.book_count())

    def test_add_book(self):
        self.add_test_data()
        book_count = self.BS.book_count()
        bk = Book('aa', 'bbbbb')
        self.BS.add_book(bk)
        self.assertTrue(self.BS.get_book_by_id(bk.id))
        self.assertEqual(book_count + 1, self.BS.book_count())

    def test_add_book_duplicate_errors(self):
        bk = Book('aa', 'aaa')
        self.BS.add_book(bk)
        with self.assertRaises(BookError):
            bk_dupe = Book('aa', 'aaa')
            self.BS.add_book(bk_dupe)

    def test_delete_book(self):
        self.add_test_data()
        count = self.BS.book_count()
        delete_book(self.bk2)
        self.assertEqual(count - 1, self.BS.book_count())
        self.assertIsNone(self.BS.get_book_by_id(self.bk2.id))

    def test_delete_book_not_in_store_errors(self):
        self.add_test_data()
        bk = Book('Not in store', 'Not in store')
        with self.assertRaises(BookError):
            delete_book(bk)

    def test_delete_book_empty_list_errors(self):
        self.clear_bookstore()
        bk = Book('Not in store', 'Not in store')
        with self.assertRaises(BookError):
            delete_book(bk)

    def test_delete_all_books(self):
        self.clear_bookstore()
        bk1 = Book('Not in store', 'Not in store')
        bk2 = Book('Whatever', 'Whatever')
        self.BS.add_book(bk1)
        self.BS.add_book(bk2)
        self.BS.delete_all_books()
        self.assertEqual(0, self.BS.book_count())

    def test_delete_all_books_empty(self):
        self.clear_bookstore()
        self.BS.delete_all_books()
        self.assertEqual(0, self.BS.book_count())

    def test_set_read_book_read(self):
        self.add_test_data()
        self.BS.set_book_read(self.bk1.id, True)

    def test_set_unread_book_read(self):
        self.add_test_data()
        self.BS.set_book_read(self.bk2.id, True)

    def test_set_read_book_unread(self):
        self.add_test_data()
        self.BS.set_book_read(self.bk1.id, False)

    def test_set_unread_book_unread(self):
        self.add_test_data()
        self.BS.set_book_read(self.bk2.id, False)

    def test_set_book_read_not_found_errors(self):
        bk = Book('Not in store', 'Not in store')
        with self.assertRaises(BookError):
            self.BS.set_book_read(bk.id, True)

    def test_search_book_author_match(self):
        self.add_test_data()
        self.assertCountEqual([self.bk1], self.BS.book_search('Ann'))

    def test_search_book_title_match(self):
        self.add_test_data()
        self.assertCountEqual([self.bk1, self.bk2],
                              self.BS.book_search('Book'))

    def test_search_book_not_found(self):
        self.add_test_data()
        self.assertEqual([], self.BS.book_search('Not in list'))

    def test_search_book_empty_store(self):
        self.clear_bookstore()
        self.assertEqual([], self.BS.book_search('Not in list'))

    def test_search_book_case_insensitive_title_match(self):
        self.add_test_data()
        self.assertCountEqual([self.bk1, self.bk2],
                              self.BS.book_search('bOoK'))

    def test_search_book_case_insensitive_author_match(self):
        self.add_test_data()
        self.assertCountEqual([self.bk3], self.BS.book_search('cReAtOr'))

    def test_get_books_by_read_read(self):
        self.add_test_data()
        read_books = self.BS.get_books_by_read_value(True)
        self.assertCountEqual([self.bk1], read_books)

    def test_get_books_by_read_unread(self):
        self.add_test_data()
        read_books = self.BS.get_books_by_read_value(False)
        self.assertCountEqual([self.bk2, self.bk3], read_books)
예제 #2
0
class TestWishList(TestCase):

    """
    menu.add_option('1', 'Add Book', add_book)
    menu.add_option('2', 'Search For Book', search_book)
    menu.add_option('3', 'Show Unread Books', show_unread_books)
    menu.add_option('4', 'Show Read Books', show_read_books)
    menu.add_option('5', 'Show All Books', show_all_books)
    menu.add_option('6', 'Change Book Read Status', change_read)
    """

    def setUp(self):
        self.store = BookStore()
        self.store.delete_all_books()
        Counter.reset_counter()


    def add_test_data(self):
        self.bk1 = Book('the title', 'the author', False)
        self.bk2 = Book('what the book is called', 'the writer', True)
        self.bk3 = Book('fascinating', 'the author', True)
        self.bk4 = Book('brilliant', 'schrodinger', False)

        self.store.add_book(self.bk1)
        self.store.add_book(self.bk2)
        self.store.add_book(self.bk3)
        self.store.add_book(self.bk4)


    @patch('builtins.input', side_effect=['1', 'Title', 'Author', 'Q'])
    @patch('builtins.print')
    def test_add_book(self, mock_print, mock_input):
        main.main()
        # reset counter and make book that mimics the one expected to be created
        Counter.reset_counter()
        expected_book = Book('Title', 'Author', False)
        all_books = self.store.get_all_books()
        self.assertEqual(expected_book, all_books[0])


    @patch('builtins.input', side_effect=['1', 'Title', 'Author', '1', 'title', 'author', 'Q'])
    @patch('builtins.print')
    def test_add_book_prevent_duplicates(self, mock_print, mock_input):
        main.main()
        # reset counter and make book that mimics the first one expected to be created
        Counter.reset_counter()
        expected_book = Book('Title', 'Author', False)
        all_books = self.store.get_all_books()
        self.assertEqual(expected_book, all_books[0])
        self.assertEqual(1, self.store.book_count())


    @patch('builtins.input', side_effect=['2', 'call', 'Q'])  # match bk2
    @patch('builtins.print')
    def test_search_for_book_found(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        mock_print.assert_any_call(self.bk2)


    @patch('builtins.input', side_effect=['2', 'the author', 'Q'])  # Partial match bk1 and bk3
    @patch('builtins.print')
    def test_search_for_book_multiple_books_found(self, mock_print, mock_input):
        self.add_test_data()
        # assert bk1 and bk3 is printed
        main.main()
        mock_print.assert_any_call(self.bk1)
        mock_print.assert_any_call(self.bk3)


    @patch('builtins.input', side_effect=['2', 'jk rowling', 'Q'])  # No match
    @patch('builtins.print')
    def test_search_for_book_not_found(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        mock_print.assert_any_call('No books to display')


    @patch('builtins.input', side_effect=['3', 'Q'])
    @patch('builtins.print')
    def test_show_unread_books(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        mock_print.assert_any_call(self.bk1)
        mock_print.assert_any_call(self.bk4)


    @patch('builtins.input', side_effect=['4', 'Q'])
    @patch('builtins.print')
    def test_show_read_books(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        mock_print.assert_any_call(self.bk2)
        mock_print.assert_any_call(self.bk3)


    @patch('builtins.input', side_effect=['5', 'Q'])
    @patch('builtins.print')
    def test_show_all_books(self, mock_print, mock_input):
        self.add_test_data()

        main.main()
        mock_print.assert_any_call(self.bk1)
        mock_print.assert_any_call(self.bk2)
        mock_print.assert_any_call(self.bk3)
        mock_print.assert_any_call(self.bk4)


    @patch('builtins.input', side_effect=['6', '4', 'read', 'Q'])  # Change book Id 4 to read
    @patch('builtins.print')
    def test_change_book_read_status(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        self.assertTrue(self.bk4.read)


    @patch('builtins.input', side_effect=['6', '3', 'not read', 'Q'])  # Change book Id 3 to unread
    @patch('builtins.print')
    def test_change_book_read_status_unread(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        self.assertFalse(self.bk3.read)


    @patch('builtins.input', side_effect=['6', '42', 'not read', 'Q'])  # Change book Id 42 (not found) to unread,
    @patch('builtins.print')
    def test_change_book_read_status_book_not_found(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        # Not crash? All's well.


    @patch('builtins.input', side_effect=['7', '3', 'Q'])  # Delete book ID 3
    @patch('builtins.print')
    def test_delete_book_in_list(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        self.assertNotIn(self.bk3, self.store.get_all_books())


    @patch('builtins.input', side_effect=['7', '42', 'Q'])  # Delete book ID 42, not a book in list
    @patch('builtins.print')
    def test_delete_book_not_found_in_list(self, mock_print, mock_input):
        self.add_test_data()
        main.main()
        self.assertEqual(4, self.store.book_count())