def setUp(self):
     self.person_controller = PersonController()
     self.client = MongoClient()
     self.database = self.client.catalogo_personas
     self.person = Person("Diana", 32, "*****@*****.**")
class TestPersonController:

    def setUp(self):
        self.person_controller = PersonController()
        self.client = MongoClient()
        self.database = self.client.catalogo_personas
        self.person = Person("Diana", 32, "*****@*****.**")

    def tearDown(self):
        self.database['persons'].remove()

    def test_mongo_client_should_be_sucessfully_created(self):
        assert self.client != None

    def test_should_have_a_mongo_client_initialized(self):
        assert self.person_controller.mongo_client != None

    def test_should_have_a_database_initialized(self):
        database = self.person_controller.database
        assert database != None

    def test_should_have_an_insert_method(self):
        inserted_id = self.person_controller.insert(self.person)
        assert inserted_id != None

    def test_should_insert_a_person_and_return_inserted_id(self):
        inserted_id = self.person_controller.insert(self.person)
        expected_id = self.database['persons'].find_one(self.person.__dict__)['_id']
        assert_equal(inserted_id, expected_id)

    def test_should_have_an_list_all_method(self):
        person_list = self.person_controller.list_all()
        assert person_list != None

    def test_should_list_all_inserted_persons(self):
        self.person_controller.insert(self.person)
        person_list = self.person_controller.list_all()
        assert len(person_list) > 0
        # assert self.person in person_list

    def test_should_have_a_method_get_by_name(self):
        person = self._get_random_person()
        inserted_id = self.person_controller.insert(person)

        db_person = self.person_controller.get_by_name(person.name)

        assert_equal(db_person.name, person.name)
        assert_equal(db_person.age, person.age)
        assert_equal(db_person.email, person.email)

    def test_should_return_none_when_invoked_get_by_name_with_false_name(self):
        name = random_word(10)
        db_person = self.person_controller.get_by_name(name)
        assert_equal(db_person, None)


    def _get_random_person(self):
        name = random_word(10)
        age = random_number(65)
        email = random_email()

        return Person(name=name, age=age, email=email)