class Test_Book(unittest.TestCase):
    def setUp(self):
        unittest.TestCase.setUp(self)
        self.__id = 23
        self.__title = "FP"
        self.__description = "work on your assignments daily"
        self.__author = "Arthur Molnar"
        self.__book = Book(self.__id, self.__title, self.__author,
                           self.__description)

        self.__noid = -85
        self.__notitle = ""
        self.__noauthor = ""
        self.__nobook = Book(self.__noid, self.__notitle, self.__noauthor,
                             self.__description)

        self.__validator = BookValidator()
        self.__repo = BookRepository()

    def tearDown(self):
        unittest.TestCase.tearDown(self)

    def test_Model(self):

        self.assertEqual(self.__book.get_id(), self.__id)
        self.assertEqual(self.__book.get_author(), self.__author)
        self.assertEqual(self.__book.get_description(), self.__description)
        self.assertEqual(self.__book.get_title(), self.__title)
        self.__book.set_title("Work harder")
        self.assertEqual(self.__book.get_title(), "Work harder")
        self.__book.set_author("somebody")
        self.assertEqual(self.__book.get_author(), "somebody")
        self.__book.set_description("Can't do this anymore")
        self.assertEqual(self.__book.get_description(),
                         "Can't do this anymore")
        self.assertEqual(self.__book == self.__book, True)

    def test_Valid(self):
        self.assertRaises(ValidError, self.__validator.valid_book,
                          self.__nobook)

        with self.assertRaises(ValidError):
            self.__validator.valid_book(self.__nobook)

    def test_Repo(self):

        self.assertEqual(len(self.__repo), 0)
        self.__repo.add(self.__book)
        self.assertEqual(len(self.__repo), 1)

        with self.assertRaises(RepoError):
            self.__repo.add(self.__book)

        with self.assertRaises(RepoError):
            self.__repo.remove(self.__nobook)

        with self.assertRaises(RepoError):
            self.__repo.update(self.__nobook)

        self.__repo.update(self.__book)
        self.assertEqual( self.__repo.list(), \
                          "ID \t Title \t  Author \t\t\t\t Description \n {},  {} by {},  described as follows: {}\n".\
                          format(self.__id, self.__title,self.__author,self.__description))
        self.__repo.remove(self.__book)
        with self.assertRaises(RepoError):
            self.__repo.list()

        self.__repo.add(self.__book)
        book = Book(45, "ASC", "Vancea", "du-te la cursurile de ASC")
        self.__repo.add(book)
        self.assertEqual(self.__repo.find(45), book)
        self.assertEqual(self.__repo.find(9), None)

        self.assertEqual(self.__repo.exists_book(book), True)
        self.assertNotEqual(len(self.__repo.get_books()), 0)
        self.assertEqual(len(self.__repo.search_id(45)), 1)
        self.assertEqual(len(self.__repo.search_author("van")), 1)
        self.assertEqual(len(self.__repo.search_description("ursuri")), 1)
        self.assertEqual(len(self.__repo.search_title("asc")), 1)