コード例 #1
0
class TestLibrary(TestCase):
    def setUp(self) -> None:
        self.CuT = Library()
        self.CuT.db.close_db()
        self.patron = Mock()
        self.book_title_there = 'Adventures of Elvis'
        self.book_title_not_there = 'Adventures of Dino'
        self.book_title_language = 'Harry Potter'
        self.book_author = 'Dummy Name'
        self.first_name = 'Sam'
        self.last_name = 'Wheeler'
        self.age = 27
        self.member_id = 100001

    def test_library_db_created(self):
        # Assert
        self.assertIsInstance(self.CuT.db, Library_DB)

    def test_book_api_created(self):
        # Assert
        self.assertIsInstance(self.CuT.api, Books_API)

    def test_book_is_ebook(self):
        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_ebooks.return_value = dummy_book_list_json

        # Assert
        self.assertTrue(self.CuT.is_ebook(self.book_title_there))

    def test_book_is_not_ebook(self):
        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_ebooks.return_value = dummy_book_list_json

        # Assert
        self.assertFalse(self.CuT.is_ebook(self.book_title_not_there))

    def test_gets_book_count_for_more_than_zero(self):

        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_ebooks.return_value = dummy_similar_book_list_json

        # Assert
        self.assertEqual(self.CuT.get_ebooks_count(self.book_title_there), 10)

    def test_gets_book_count_for_zero_books(self):

        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_ebooks.return_value = []

        # Assert
        self.assertEqual(self.CuT.get_ebooks_count(self.book_title_not_there),
                         0)

    def test_gets_book_count_if_no_book_is_there(self):

        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_ebooks.return_value = [
            {
                'title': 'Adventures of Dino',
                'ebook_count': 0
            },
        ]

        # Assert
        self.assertEqual(self.CuT.get_ebooks_count(self.book_title_not_there),
                         0)

    def test_author_entered_for_book_is_true(self):

        # Action
        self.CuT.api = Mock()
        self.CuT.api.books_by_author.return_value = dummy_author_book_list_json

        # Assert
        self.assertTrue(
            self.CuT.is_book_by_author(self.book_author,
                                       self.book_title_there))

    def test_author_entered_for_book_is_false(self):

        # Action
        self.CuT.api = Mock()
        self.CuT.api.books_by_author.return_value = dummy_author_book_list_json

        # Assert
        self.assertFalse(
            self.CuT.is_book_by_author(self.book_author,
                                       self.book_title_not_there))

    def test_author_entered_for_book_has_no_book_in_library(self):

        # Action
        self.CuT.api = Mock()
        self.CuT.api.books_by_author.return_value = []

        # Assert
        self.assertFalse(
            self.CuT.is_book_by_author(self.book_author,
                                       self.book_title_not_there))

    def test_gets_languages_for_the_book(self):

        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_book_info.return_value = book_language_list
        languages = self.CuT.get_languages_for_book(self.book_title_language)

        # Assert
        self.assertEqual(len(languages), len(book_language_list))

    def test_gets_one_language_for_the_book(self):

        language_list = [{'language': ['eng']}]

        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_book_info.return_value = language_list
        languages = self.CuT.get_languages_for_book(self.book_title_language)

        # Assert
        self.assertEqual(len(languages), 1)

    def test_gets_zero_language_for_no_book(self):

        # Assume
        language_list = []

        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_book_info.return_value = language_list
        languages = self.CuT.get_languages_for_book(self.book_title_language)

        # Assert
        self.assertEqual(len(languages), 0)

    def test_gets_the_correct_languages_for_the_book(self):

        # Action
        self.CuT.api = Mock()
        self.CuT.api.get_book_info.return_value = book_language_list
        languages = self.CuT.get_languages_for_book(self.book_title_language)
        all_languages = list()
        for ebook in book_language_list:
            all_languages.append(ebook['language'][0])
        is_same = True
        for lang in languages:
            if lang not in all_languages:
                is_same = False
                break

        # Assert
        self.assertTrue(is_same)

    def test_patron_is_registered_in_db(self):

        # Assume
        self.CuT.db = Mock()
        self.CuT.db.insert_patron.return_value = 1
        self.CuT.db.retrieve_patron.return_value = True
        patron = Patron(self.first_name, self.last_name, self.age,
                        self.member_id)
        patron.get_memberID = Mock(return_value=1)

        # Action
        self.CuT.register_patron(self.first_name, self.last_name, self.age,
                                 self.member_id)
        is_patron_registered = self.CuT.is_patron_registered(patron)
        # Removes the instance of the db.json created
        if path.exists('db.json'):
            os.remove('db.json')

        # Assert
        self.assertTrue(is_patron_registered)

    def test_patron_is_not_registered_in_db(self):

        # Assume
        self.CuT.db = Mock()
        self.CuT.db.insert_patron.return_value = 1
        self.CuT.db.retrieve_patron.return_value = False
        patron = Patron(self.first_name, self.last_name, self.age,
                        self.member_id)
        patron.get_memberID = Mock(return_value=1)

        # Action
        self.CuT.register_patron(self.first_name, self.last_name, self.age,
                                 self.member_id)
        is_patron_registered = self.CuT.is_patron_registered(patron)
        # Removes the instance of the db.json created
        if path.exists('db.json'):
            os.remove('db.json')

        # Assert
        self.assertFalse(is_patron_registered)

    def test_has_patron_borrowed_book_true(self):

        # Assume
        self.CuT.db = Mock()

        self.patron.fname.return_value = self.first_name
        self.patron.lname.return_value = self.last_name
        self.patron.age.return_value = self.age
        self.patron.memberID.return_value = self.member_id
        self.patron.borrowed_books.return_value = []
        self.CuT.db.update_patron.return_value = True
        self.patron.add_borrowed_book.return_value = True
        self.patron.get_borrowed_books.return_value = [
            self.book_title_there.lower()
        ]

        # Action
        self.CuT.borrow_book(self.book_title_there, self.patron)
        is_book_borrowed = self.CuT.is_book_borrowed(self.book_title_there,
                                                     self.patron)

        # Removes the instance of the db.json created
        if path.exists('db.json'):
            os.remove('db.json')

        # Assert
        self.assertTrue(is_book_borrowed)

    def test_has_patron_borrowed_book_false(self):

        # Assume
        self.CuT.db = Mock()

        self.patron.fname.return_value = self.first_name
        self.patron.lname.return_value = self.last_name
        self.patron.age.return_value = self.age
        self.patron.memberID.return_value = self.member_id
        self.patron.borrowed_books.return_value = []
        self.CuT.db.update_patron.return_value = True
        self.patron.add_borrowed_book.return_value = True
        self.patron.get_borrowed_books.return_value = ['Some other book title']

        # Action
        self.CuT.borrow_book(self.book_title_there, self.patron)
        is_book_borrowed = self.CuT.is_book_borrowed(self.book_title_there,
                                                     self.patron)

        # Removes the instance of the db.json created
        if path.exists('db.json'):
            os.remove('db.json')

        # Assert
        self.assertFalse(is_book_borrowed)

    def test_patron_has_returned_book(self):

        # Assume
        self.CuT.db = Mock()

        self.patron.fname.return_value = self.first_name
        self.patron.lname.return_value = self.last_name
        self.patron.age.return_value = self.age
        self.patron.memberID.return_value = self.member_id
        self.patron.borrowed_books.return_value = [
            self.book_title_there.lower()
        ]
        self.CuT.db.update_patron.return_value = True
        self.patron.return_borrowed_book.return_value = True
        self.patron.get_borrowed_books.return_value = []

        # Action
        self.CuT.borrow_book(self.book_title_there, self.patron)
        self.CuT.return_borrowed_book(self.book_title_there, self.patron)
        is_book_borrowed = self.CuT.is_book_borrowed(self.book_title_there,
                                                     self.patron)

        # Removes the instance of the db.json created
        if path.exists('db.json'):
            os.remove('db.json')

        # Assert
        self.assertFalse(is_book_borrowed)