class TestUser(unittest.TestCase):
    def get_user_collection(self):
        return self.collection

    def setUp(self):
        connection = pymongo.MongoClient('mongodb://localhost:27017/')
        self.database = connection.test
        self.collection = self.database.user
        self.collection.drop()
        self.user = UserDatabase()

        # monkey patch the mongodb handler to use the test database of user
        from mongodbhandler import MongoDatabaseHandler

        MongoDatabaseHandler.get_users_collection = self.get_user_collection

    def test_insert_user(self):
        """save a valid user to the database """
        user = '******'
        password = '******'

        result = self.user.save_user(user, password)

        self.assertEqual(result, True)
        # read the user from database
        doc = self.collection.find_one({'_id': user})
        self.assertEqual(doc['_id'], user)
        self.assertEqual(doc['password'], password)

        self.collection.delete_one({'_id': user})

    def test_insert_duplicateuser(self):
        """" save the user twice and that we return a false"""

        user = '******'
        password = '******'
        password2 = 'duplicatetestuserpassword2'
        self.user.save_user(user, password)

        result = self.user.save_user(user, password2)

        self.assertEqual(result, False)

        self.collection.delete_one({'_id': user})

    def test_remove_user(self):
        user = '******'
        password = '******'
        self.user.save_user(user, password)

        result = self.user.delete_user(user)

        self.assertEqual(result, True)
        doc = self.collection.find_one({'_id': user})
        self.assertEqual(doc, None)

    def test_remove_non_existing_user(self):
        user = '******'

        result = self.user.delete_user(user)

        self.assertEqual(result, False)

    def test_get_user(self):
        user = '******'
        password = '******'
        self.user.save_user(user, password)

        result = self.user.get_password(user)

        self.assertEqual(result, password)

        self.collection.delete_one({'_id': user})

    def test_get_user_non_existing(self):
        result = self.user.get_password('nonExistingUser')

        self.assertEqual(result, None)