예제 #1
0
class TestUserService(TransactionalTestCase):
    """
    This class contains tests for the tvb.core.services.user_service module.
    """
    NOT_EXISTENT_PROJECT_ID = 43

    def transactional_setup_method(self):
        """
        Reset the database before each test .
        """
        self.clean_database()
        self.user_service = UserService()
        self.user_service.create_user(username=TvbProfile.current.web.admin.ADMINISTRATOR_NAME,
                                      password=TvbProfile.current.web.admin.ADMINISTRATOR_PASSWORD,
                                      email=TvbProfile.current.web.admin.ADMINISTRATOR_EMAIL,
                                      role=model.ROLE_ADMINISTRATOR, skip_import=True)
        available_users = dao.get_all_users()
        if len(available_users) != 1:
            raise AssertionError("Something went wrong with database initialization!")

    def transactional_teardown_method(self):
        """
        Reset database at test finish.
        """
        self.delete_project_folders()

    def test_create_user_happy_flow(self):
        """
        Standard flow for creating a user.
        """
        initial_user_count = dao.get_all_users()
        data = dict(username="******", password=md5("test_password").hexdigest(),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        final_user_count = dao.get_all_users()
        assert len(initial_user_count) == len(final_user_count) - 1, "User count was not increased after create."
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == md5("test_password").hexdigest(), "Incorrect password"
        assert inserted_user.email == "*****@*****.**", "The email inserted is not correct."
        assert inserted_user.role == "user", "The role inserted is not correct."
        assert not inserted_user.validated, "User validation  is not correct."

    def test_create_user_empty_password(self):
        """
        Try to create a user with an empty password field.
        """
        data = dict(username="******", password="", email="*****@*****.**", role="user", comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_create_user_no_password(self):
        """
        Try to create a user with no password data.
        """
        data = dict(username="******", email="*****@*****.**", role="user", comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_create_user_empty_username(self):
        """
        Try to create a user with an empty username field.
        """
        data = dict(username="", password="******", email="*****@*****.**", role="user", comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_create_user_no_username(self):
        """
        Try to create a user with no username data.
        """
        data = dict(password="******", email="*****@*****.**", role="user", comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_create_user_no_email(self):
        """
        Try to create a user with an empty email field.
        """
        data = dict(username="******", password="******", email="", role="user", comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_reset_password_happy_flow(self):
        """
        Test method for the reset password method. Happy flow.
        """
        data = dict(username="******", password=md5("test_password").hexdigest(),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == md5("test_password").hexdigest(), "Incorrect password"
        reset_pass_data = dict(username="******", email="*****@*****.**")
        self.user_service.reset_password(**reset_pass_data)
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password != md5("test_password"), "Password not reset for some reason!"

    def test_reset_pass_wrong_email(self):
        """
        Test method for the reset password method. Email is not valid,
        should raise exception
        """
        data = dict(username="******", password=md5("test_password").hexdigest(),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == md5("test_password").hexdigest(), "Incorrect password"
        reset_pass_data = dict(username="******", email="*****@*****.**")
        with pytest.raises(UsernameException):
            self.user_service.reset_password(**reset_pass_data)

    def test_change_password_happy_flow(self):
        """
        Test method for the change password method. Happy flow.
        """
        inserted_user = self._prepare_user_for_change_pwd()
        self.user_service.edit_user(inserted_user, md5("test_password").hexdigest())
        changed_user = dao.get_user_by_name("test_user")
        assert changed_user.password == md5("new_test_password").hexdigest(), "The password did not change."

    def test_change_password_wrong_old(self):
        """
        Test method for the change password method. Old password is wrong, should return false.
        """
        inserted_user = self._prepare_user_for_change_pwd()
        params = dict(edited_user=inserted_user, old_password=md5("wrong_old_pwd").hexdigest())
        with pytest.raises(UsernameException):
            self.user_service.edit_user(**params)
        user = dao.get_user_by_name("test_user")
        assert user.password == md5("test_password").hexdigest(), "The password should have not been changed!"

    def _prepare_user_for_change_pwd(self):
        """Private method to prepare password change operation"""
        data = dict(username="******", password=md5("test_password").hexdigest(),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        self.user_service.validate_user("test_user")
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == md5("test_password").hexdigest(), "The password inserted is not correct."
        inserted_user.password = md5('new_test_password').hexdigest()
        return inserted_user

    def test_is_username_valid(self):
        """
        Test the method that checks if a userName is valid or not (if it already exists
        in the database the userName is not valid).
        """
        user = model.User("test_user", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user)
        assert not self.user_service.is_username_valid("test_user"), "Should be False but got True"
        assert self.user_service.is_username_valid("test_user2"), "Should be True but got False"

    def test_validate_user_happy_flow(self):
        """
        Standard flow for a validate user action.
        """
        user = model.User("test_user", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user)
        assert self.user_service.validate_user("test_user"), "Validation failed when it shouldn't have."

    def test_validate_user_validated(self):
        """
        Flow for trying to validate a user that was already validated.
        """
        user = model.User("test_user", "test_pass", "*****@*****.**", True, "user")
        dao.store_entity(user)
        assert not self.user_service.validate_user("test_user"), "Validation invalid."

    def test_validate_user_non_existent(self):
        """
        Flow for trying to validate a user that doesn't exist in the database.
        """
        user = model.User("test_user", "test_pass", "*****@*****.**", True, "user")
        dao.store_entity(user)
        assert not self.user_service.validate_user("test_user2"), "Validation done even tho user is non-existent"

    def test_check_login_happy_flow(self):
        """
        Standard login flow with a valid username and password.
        """
        user = model.User("test_user", md5("test_pass").hexdigest(), "*****@*****.**", True, "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        assert 2 == len(available_users)
        assert self.user_service.check_login("test_user", "test_pass") is not None, "Login failed when it shouldn't."

    def test_check_login_bad_pass(self):
        """
        Flow for entering a bad/invalid password.
        """
        user = model.User("test_user", md5("test_pass").hexdigest(), "*****@*****.**", True, "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        assert 2 == len(available_users)
        assert self.user_service.check_login("test_user", "bad_pass") is None, "Login succeeded with bad password."

    def test_check_login_bad_user(self):
        """
        Flow for entering a bad/invalid username.
        """
        user = model.User("test_user", md5("test_pass").hexdigest(), "*****@*****.**", True, "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        assert 2 == len(available_users)
        assert self.user_service.check_login("bad_user", "test_pass") is None, "Login succeeded with bad userName."

    def test_get_users_for_project(self):
        """
        Get all members of a project except the current user.
        """
        user_1 = model.User("test_user1", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_1)
        user_2 = model.User("test_user2", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_2)
        user_3 = model.User("test_user3", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_3)
        user_4 = model.User("test_user4", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_4)
        user_5 = model.User("test_user5", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_5)
        admin = dao.get_user_by_name("test_user1")
        member1 = dao.get_user_by_name("test_user2")
        member2 = dao.get_user_by_name("test_user5")
        data = dict(name="test_proj", description="test_desc", users=[member1.id, member2.id])
        project = ProjectService().store_project(admin, True, None, **data)
        all_users, members, pag = self.user_service.get_users_for_project(admin.username, project.id)
        assert len(members) == 2, "More members than there should be."
        assert len(all_users) == 5, "Admin should not be viewed as member. " \
                                    "Neither should users that were not part of the project's users list."
        assert pag == 1, "Invalid total pages number."
        for user in all_users:
            assert user.username != admin.username, "Admin is in members!"

    def test_get_users_second_page(self):
        """
        Try to get the second page of users for a given project
        """
        for i in range(USERS_PAGE_SIZE + 3):
            exec 'user_' + str(i) + '= model.User("test_user' + str(
                i) + '", "test_pass", "*****@*****.**", False, "user")'
            exec "dao.store_entity(user_" + str(i) + ")"
        for i in range(USERS_PAGE_SIZE + 3):
            exec 'member' + str(i) + '=dao.get_user_by_name("test_user' + str(i) + '")'
        admin = dao.get_user_by_name("test_user1")
        data = dict(name='test_proj', description='test_desc',
                    users=[eval('member' + str(i) + '.id') for i in range(USERS_PAGE_SIZE + 3)])
        project = ProjectService().store_project(admin, True, None, **data)
        page_users, all_users, pag = self.user_service.get_users_for_project(admin.username, project.id, 2)
        assert len(page_users) == (USERS_PAGE_SIZE + 3) % USERS_PAGE_SIZE
        assert len(all_users) == USERS_PAGE_SIZE + 3, 'Not all members returned'
        assert pag == 2, 'Invalid page number returned'

    def test_get_users_second_page_del(self):
        """
        Try to get the second page of users for a given project where only one user on last page.
        Then delete that user.
        """
        for i in range(USERS_PAGE_SIZE + 1):
            exec 'user_' + str(i) + '= model.User("test_user' + str(i) + \
                 '", "test_pass", "*****@*****.**", False, "user")'
            exec "dao.store_entity(user_" + str(i) + ")"
        for i in range(USERS_PAGE_SIZE + 1):
            exec 'member' + str(i) + '=dao.get_user_by_name("test_user' + str(i) + '")'

        admin = dao.get_user_by_name("test_user1")
        data = dict(name='test_proj', description='test_desc',
                    users=[eval('member' + str(i) + '.id') for i in range(USERS_PAGE_SIZE + 1)])
        project = ProjectService().store_project(admin, True, None, **data)
        page_users, all_users, pag = self.user_service.get_users_for_project(admin.username, project.id, 2)
        assert len(page_users) == 1, 'Paging not working properly'
        assert len(all_users) == USERS_PAGE_SIZE + 1, 'Not all members returned'
        assert pag == 2, 'Invalid page number returned'
        self.user_service.delete_user(member2.id)
        page_users, all_users, pag = self.user_service.get_users_for_project(admin.username, project.id, 2)
        assert len(page_users) == 0, 'Paging not working properly'
        assert len(all_users) == USERS_PAGE_SIZE, 'Not all members returned'
        assert pag == 1, 'Invalid page number returned'
        page_users, all_users, pag = self.user_service.get_users_for_project(admin.username, project.id, 1)
        assert len(page_users) == USERS_PAGE_SIZE, 'Paging not working properly'
        assert len(all_users) == USERS_PAGE_SIZE, 'Not all members returned'
        assert pag == 1, 'Invalid page number returned'

    def test_edit_user_happy_flow(self):
        """
        Test the method of editing a user.
        """
        data = dict(username="******", password=md5("test_password").hexdigest(),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == md5("test_password").hexdigest(), "Incorrect password"
        inserted_user.role = "new_role"
        inserted_user.validated = 1
        self.user_service.edit_user(inserted_user)
        changed_user = dao.get_user_by_name("test_user")
        assert changed_user.role == "new_role", "role unchanged"
        assert changed_user.validated == 1, "user not validated"

    def test_get_users_when_no_projects(self):
        """
        Assert exception is thrown when no project is found gor the given ID.
        """
        with pytest.raises(UsernameException):
            self.user_service.get_users_for_project(TvbProfile.current.web.admin.ADMINISTRATOR_NAME,
                                                    self.NOT_EXISTENT_PROJECT_ID)
예제 #2
0
class UserServiceTest(TransactionalTestCase):
    """
    This class contains tests for the tvb.core.services.user_service module.
    """
    def setUp(self):
        """
        Reset the database before each test .
        """
        self.clean_database()
        self.user_service = UserService()
        self.user_service.create_user(
            username=TvbProfile.current.web.admin.ADMINISTRATOR_NAME,
            password=TvbProfile.current.web.admin.ADMINISTRATOR_PASSWORD,
            email=TvbProfile.current.web.admin.ADMINISTRATOR_EMAIL,
            role=model.ROLE_ADMINISTRATOR)
        available_users = dao.get_all_users()
        if len(available_users) != 1:
            self.fail("Something went wrong with database initialization!")

    def tearDown(self):
        """
        Reset database at test finish.
        """
        self.delete_project_folders()

    def test_create_user_happy_flow(self):
        """
        Standard flow for creating a user.
        """
        initial_user_count = dao.get_all_users()
        data = dict(username="******",
                    password=md5("test_password").hexdigest(),
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.user_service.create_user(**data)
        final_user_count = dao.get_all_users()
        self.assertEqual(len(initial_user_count),
                         len(final_user_count) - 1,
                         "User count was not increased after create.")
        inserted_user = dao.get_user_by_name("test_user")
        self.assertEqual(inserted_user.password,
                         md5("test_password").hexdigest(),
                         "Incorrect password")
        self.assertEqual(inserted_user.email, "*****@*****.**",
                         "The email inserted is not correct.")
        self.assertEqual(inserted_user.role, "user",
                         "The role inserted is not correct.")
        self.assertFalse(inserted_user.validated,
                         "User validation  is not correct.")

    def test_create_user_empty_password(self):
        """
        Try to create a user with an empty password field.
        """
        data = dict(username="******",
                    password="",
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.assertRaises(UsernameException, self.user_service.create_user,
                          **data)

    def test_create_user_no_password(self):
        """
        Try to create a user with no password data.
        """
        data = dict(username="******",
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.assertRaises(UsernameException, self.user_service.create_user,
                          **data)

    def test_create_user_empty_username(self):
        """
        Try to create a user with an empty username field.
        """
        data = dict(username="",
                    password="******",
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.assertRaises(UsernameException, self.user_service.create_user,
                          **data)

    def test_create_user_no_username(self):
        """
        Try to create a user with no username data.
        """
        data = dict(password="******",
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.assertRaises(UsernameException, self.user_service.create_user,
                          **data)

    def test_create_user_no_email(self):
        """
        Try to create a user with an empty email field.
        """
        data = dict(username="******",
                    password="******",
                    email="",
                    role="user",
                    comment="")
        self.assertRaises(UsernameException, self.user_service.create_user,
                          **data)

    def test_reset_password_happy_flow(self):
        """
        Test method for the reset password method. Happy flow.
        """
        data = dict(username="******",
                    password=md5("test_password").hexdigest(),
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        self.assertEqual(inserted_user.password,
                         md5("test_password").hexdigest(),
                         "Incorrect password")
        reset_pass_data = dict(username="******", email="*****@*****.**")
        self.user_service.reset_password(**reset_pass_data)
        inserted_user = dao.get_user_by_name("test_user")
        self.assertNotEqual(inserted_user.password, md5("test_password"),
                            "Password not reset for some reason!")

    def test_reset_pass_wrong_email(self):
        """
        Test method for the reset password method. Email is not valid, 
        should raise exception
        """
        data = dict(username="******",
                    password=md5("test_password").hexdigest(),
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        self.assertEqual(inserted_user.password,
                         md5("test_password").hexdigest(),
                         "Incorrect password")
        reset_pass_data = dict(username="******",
                               email="*****@*****.**")
        self.assertRaises(UsernameException, self.user_service.reset_password,
                          **reset_pass_data)

    def test_change_password_happy_flow(self):
        """
        Test method for the change password method. Happy flow.
        """
        inserted_user = self._prepare_user_for_change_pwd()
        self.user_service.edit_user(inserted_user,
                                    md5("test_password").hexdigest())
        changed_user = dao.get_user_by_name("test_user")
        self.assertEqual(changed_user.password,
                         md5("new_test_password").hexdigest(),
                         "The password did not change.")

    def test_change_password_wrong_old(self):
        """
        Test method for the change password method. Old password is wrong, should return false.
        """
        inserted_user = self._prepare_user_for_change_pwd()
        params = dict(edited_user=inserted_user,
                      old_password=md5("wrong_old_pwd").hexdigest())
        self.assertRaises(UsernameException, self.user_service.edit_user,
                          **params)
        user = dao.get_user_by_name("test_user")
        self.assertEqual(user.password,
                         md5("test_password").hexdigest(),
                         "The password should have not been changed!")

    def _prepare_user_for_change_pwd(self):
        """Private method to prepare password change operation"""
        data = dict(username="******",
                    password=md5("test_password").hexdigest(),
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.user_service.create_user(**data)
        self.user_service.validate_user("test_user")
        inserted_user = dao.get_user_by_name("test_user")
        self.assertEqual(inserted_user.password,
                         md5("test_password").hexdigest(),
                         "The password inserted is not correct.")
        inserted_user.password = md5('new_test_password').hexdigest()
        return inserted_user

    def test_is_username_valid(self):
        """
        Test the method that checks if a userName is valid or not (if it already exists
        in the database the userName is not valid).
        """
        user = model.User("test_user", "test_pass", "*****@*****.**", False,
                          "user")
        dao.store_entity(user)
        self.assertFalse(self.user_service.is_username_valid("test_user"),
                         "Should be False but got True")
        self.assertTrue(self.user_service.is_username_valid("test_user2"),
                        "Should be True but got False")

    def test_validate_user_happy_flow(self):
        """
        Standard flow for a validate user action.
        """
        user = model.User("test_user", "test_pass", "*****@*****.**", False,
                          "user")
        dao.store_entity(user)
        self.assertTrue(self.user_service.validate_user("test_user"),
                        "Validation failed when it shouldn't have.")

    def test_validate_user_validated(self):
        """
        Flow for trying to validate a user that was already validated.
        """
        user = model.User("test_user", "test_pass", "*****@*****.**", True,
                          "user")
        dao.store_entity(user)
        self.assertFalse(self.user_service.validate_user("test_user"),
                         "Validation invalid.")

    def test_validate_user_non_existent(self):
        """
        Flow for trying to validate a user that doesn't exist in the database.
        """
        user = model.User("test_user", "test_pass", "*****@*****.**", True,
                          "user")
        dao.store_entity(user)
        self.assertFalse(self.user_service.validate_user("test_user2"),
                         "Validation done even tho user is non-existent")

    def test_check_login_happy_flow(self):
        """
        Standard login flow with a valid username and password.
        """
        user = model.User("test_user",
                          md5("test_pass").hexdigest(), "*****@*****.**",
                          True, "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        if len(available_users) != 2:
            self.fail("Something went wrong with database reset!")
        self.assertTrue(
            self.user_service.check_login("test_user", "test_pass")
            is not None, "Login failed when it shouldn't.")

    def test_check_login_bad_pass(self):
        """
        Flow for entering a bad/invalid password.
        """
        user = model.User("test_user",
                          md5("test_pass").hexdigest(), "*****@*****.**",
                          True, "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        if len(available_users) != 2:
            self.fail("Something went wrong with database reset!")
        self.assertTrue(
            self.user_service.check_login("test_user", "bad_pass") is None,
            "Login succeeded with bad password.")

    def test_check_login_bad_user(self):
        """
        Flow for entering a bad/invalid username.
        """
        user = model.User("test_user",
                          md5("test_pass").hexdigest(), "*****@*****.**",
                          True, "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        if len(available_users) != 2:
            self.fail("Something went wrong with database reset!")
        self.assertTrue(
            self.user_service.check_login("bad_user", "test_pass") is None,
            "Login succeeded with bad userName.")

    def test_get_users_for_project(self):
        """
        Get all members of a project except the current user.
        """
        user_1 = model.User("test_user1", "test_pass", "*****@*****.**",
                            False, "user")
        dao.store_entity(user_1)
        user_2 = model.User("test_user2", "test_pass", "*****@*****.**",
                            False, "user")
        dao.store_entity(user_2)
        user_3 = model.User("test_user3", "test_pass", "*****@*****.**",
                            False, "user")
        dao.store_entity(user_3)
        user_4 = model.User("test_user4", "test_pass", "*****@*****.**",
                            False, "user")
        dao.store_entity(user_4)
        user_5 = model.User("test_user5", "test_pass", "*****@*****.**",
                            False, "user")
        dao.store_entity(user_5)
        admin = dao.get_user_by_name("test_user1")
        member1 = dao.get_user_by_name("test_user2")
        member2 = dao.get_user_by_name("test_user5")
        data = dict(name="test_proj",
                    description="test_desc",
                    users=[member1.id, member2.id])
        project = ProjectService().store_project(admin, True, None, **data)
        all_users, members, pag = self.user_service.get_users_for_project(
            admin.username, project.id)
        self.assertEquals(len(members), 2,
                          "More members than there should be.")
        self.assertEquals(
            len(all_users), 5, "Admin should not be viewed as member. "
            "Neither should users that were not part of the project's users list."
        )
        self.assertEqual(pag, 1, "Invalid total pages number.")
        for user in all_users:
            self.assertNotEqual(user.username, admin.username,
                                "Admin is in members!")

    def test_get_users_second_page(self):
        """
        Try to get the second page of users for a given project
        """
        for i in range(USERS_PAGE_SIZE + 3):
            exec 'user_' + str(i) + '= model.User("test_user' + str(
                i) + '", "test_pass", "*****@*****.**", False, "user")'
            exec "dao.store_entity(user_" + str(i) + ")"
        for i in range(USERS_PAGE_SIZE + 3):
            exec 'member' + str(i) + '=dao.get_user_by_name("test_user' + str(
                i) + '")'
        admin = dao.get_user_by_name("test_user1")
        data = dict(name='test_proj',
                    description='test_desc',
                    users=[
                        eval('member' + str(i) + '.id')
                        for i in range(USERS_PAGE_SIZE + 3)
                    ])
        project = ProjectService().store_project(admin, True, None, **data)
        page_users, all_users, pag = self.user_service.get_users_for_project(
            admin.username, project.id, 2)
        self.assertEqual(len(page_users),
                         (USERS_PAGE_SIZE + 3) % USERS_PAGE_SIZE)
        self.assertEqual(len(all_users), USERS_PAGE_SIZE + 3,
                         'Not all members returned')
        self.assertEqual(pag, 2, 'Invalid page number returned')

    def test_get_users_second_page_del(self):
        """
        Try to get the second page of users for a given project where only one user on last page.
        Then delete that user.
        """
        for i in range(USERS_PAGE_SIZE + 1):
            exec 'user_' + str(i) + '= model.User("test_user' + str(i) + \
                 '", "test_pass", "*****@*****.**", False, "user")'
            exec "dao.store_entity(user_" + str(i) + ")"
        for i in range(USERS_PAGE_SIZE + 1):
            exec 'member' + str(i) + '=dao.get_user_by_name("test_user' + str(
                i) + '")'

        admin = dao.get_user_by_name("test_user1")
        data = dict(name='test_proj',
                    description='test_desc',
                    users=[
                        eval('member' + str(i) + '.id')
                        for i in range(USERS_PAGE_SIZE + 1)
                    ])
        project = ProjectService().store_project(admin, True, None, **data)
        page_users, all_users, pag = self.user_service.get_users_for_project(
            admin.username, project.id, 2)
        self.assertEqual(len(page_users), 1, 'Paging not working properly')
        self.assertEqual(len(all_users), USERS_PAGE_SIZE + 1,
                         'Not all members returned')
        self.assertEqual(pag, 2, 'Invalid page number returned')
        self.user_service.delete_user(member2.id)
        page_users, all_users, pag = self.user_service.get_users_for_project(
            admin.username, project.id, 2)
        self.assertEqual(len(page_users), 0, 'Paging not working properly')
        self.assertEqual(len(all_users), USERS_PAGE_SIZE,
                         'Not all members returned')
        self.assertEqual(pag, 1, 'Invalid page number returned')
        page_users, all_users, pag = self.user_service.get_users_for_project(
            admin.username, project.id, 1)
        self.assertEqual(len(page_users), USERS_PAGE_SIZE,
                         'Paging not working properly')
        self.assertEqual(len(all_users), USERS_PAGE_SIZE,
                         'Not all members returned')
        self.assertEqual(pag, 1, 'Invalid page number returned')

    def test_edit_user_happy_flow(self):
        """
        Test the method of editing a user.
        """
        data = dict(username="******",
                    password=md5("test_password").hexdigest(),
                    email="*****@*****.**",
                    role="user",
                    comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        self.assertEqual(inserted_user.password,
                         md5("test_password").hexdigest(),
                         "Incorrect password")
        inserted_user.role = "new_role"
        inserted_user.validated = 1
        self.user_service.edit_user(inserted_user)
        changed_user = dao.get_user_by_name("test_user")
        self.assertEqual(changed_user.role, "new_role", "role unchanged")
        self.assertEqual(changed_user.validated, 1, "user not validated")

    def test_create_project_no_projects(self):
        """
        Standard flow for creating a new project.
        """
        self.assertRaises(UsernameException,
                          self.user_service.get_users_for_project, "admin", 1)
예제 #3
0
class TestUserService(TransactionalTestCase):
    """
    This class contains tests for the tvb.core.services.user_service module.
    """
    NOT_EXISTENT_PROJECT_ID = 43

    def transactional_setup_method(self):
        """
        Reset the database before each test .
        """
        self.clean_database()
        self.user_service = UserService()
        self.user_service.create_user(username=TvbProfile.current.web.admin.ADMINISTRATOR_NAME,
                                      display_name=TvbProfile.current.web.admin.ADMINISTRATOR_DISPLAY_NAME,
                                      password=TvbProfile.current.web.admin.ADMINISTRATOR_PASSWORD,
                                      email=TvbProfile.current.web.admin.ADMINISTRATOR_EMAIL,
                                      role=model_project.ROLE_ADMINISTRATOR, skip_import=True)
        available_users = dao.get_all_users()
        if len(available_users) != 1:
            raise AssertionError("Something went wrong with database initialization!")

    def transactional_teardown_method(self):
        """
        Reset database at test finish.
        """
        self.delete_project_folders()

    def test_create_user_happy_flow(self):
        """
        Standard flow for creating a user.
        """
        initial_user_count = dao.get_all_users()
        data = dict(username="******", display_name="test_name", password=hash_password("test_password"),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        final_user_count = dao.get_all_users()
        assert len(initial_user_count) == len(final_user_count) - 1, "User count was not increased after create."
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == hash_password("test_password"), "Incorrect password"
        assert inserted_user.email == "*****@*****.**", "The email inserted is not correct."
        assert inserted_user.role == "user", "The role inserted is not correct."
        assert not inserted_user.validated, "User validation  is not correct."

    def test_create_user_empty_password(self):
        """
        Try to create a user with an empty password field.
        """
        data = dict(username="******", display_name="test_name", password="", email="*****@*****.**", role="user",
                    comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_create_user_no_password(self):
        """
        Try to create a user with no password data.
        """
        data = dict(username="******", display_name="test_name", email="*****@*****.**", role="user", comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_create_user_empty_username(self):
        """
        Try to create a user with an empty username field.
        """
        data = dict(username="", display_name="test_name", password="******", email="*****@*****.**", role="user",
                    comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_create_user_no_username(self):
        """
        Try to create a user with no username data.
        """
        data = dict(password="******", display_name="test_name", email="*****@*****.**", role="user", comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_create_user_no_email(self):
        """
        Try to create a user with an empty email field.
        """
        data = dict(username="******", display_name="test_name", password="******", email="", role="user",
                    comment="")
        with pytest.raises(UsernameException):
            self.user_service.create_user(**data)

    def test_reset_password_happy_flow(self):
        """
        Test method for the reset password method. Happy flow.
        """
        data = dict(username="******", display_name="test_name", password=hash_password("test_password"),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == hash_password("test_password"), "Incorrect password"
        reset_pass_data = dict(username="******", email="*****@*****.**")
        self.user_service.reset_password(**reset_pass_data)
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password != hash_password("test_password"), "Password not reset for some reason!"

    def test_reset_pass_wrong_email(self):
        """
        Test method for the reset password method. Email is not valid,
        should raise exception
        """
        data = dict(username="******", display_name="test_name", password=hash_password("test_password"),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == hash_password("test_password"), "Incorrect password"
        reset_pass_data = dict(username="******", email="*****@*****.**")
        with pytest.raises(UsernameException):
            self.user_service.reset_password(**reset_pass_data)

    def test_change_password_happy_flow(self):
        """
        Test method for the change password method. Happy flow.
        """
        inserted_user = self._prepare_user_for_change_pwd()
        self.user_service.edit_user(inserted_user, hash_password("test_password"))
        changed_user = dao.get_user_by_name("test_user")
        assert changed_user.password == hash_password("new_test_password"), "The password did not change."

    def test_change_password_wrong_old(self):
        """
        Test method for the change password method. Old password is wrong, should return false.
        """
        inserted_user = self._prepare_user_for_change_pwd()
        params = dict(edited_user=inserted_user, old_password=hash_password("wrong_old_pwd"))
        with pytest.raises(UsernameException):
            self.user_service.edit_user(**params)
        user = dao.get_user_by_name("test_user")
        assert user.password == hash_password("test_password"), "The password should have not been changed!"

    def _prepare_user_for_change_pwd(self):
        """Private method to prepare password change operation"""
        data = dict(username="******", display_name="test_name", password=hash_password("test_password"),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        self.user_service.validate_user("test_user")
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == hash_password("test_password"), "The password inserted is not correct."
        inserted_user.password = hash_password("new_test_password")
        return inserted_user

    def test_is_username_valid(self):
        """
        Test the method that checks if a userName is valid or not (if it already exists
        in the database the userName is not valid).
        """
        user = model_project.User("test_user", "test_name", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user)
        assert not self.user_service.is_username_valid("test_user"), "Should be False but got True"
        assert self.user_service.is_username_valid("test_user2"), "Should be True but got False"

    def test_validate_user_happy_flow(self):
        """
        Standard flow for a validate user action.
        """
        user = model_project.User("test_user", "test_name", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user)
        assert self.user_service.validate_user("test_user"), "Validation failed when it shouldn't have."

    def test_validate_user_validated(self):
        """
        Flow for trying to validate a user that was already validated.
        """
        user = model_project.User("test_user", "test_name", "test_pass", "*****@*****.**", True, "user")
        dao.store_entity(user)
        assert not self.user_service.validate_user("test_user"), "Validation invalid."

    def test_validate_user_non_existent(self):
        """
        Flow for trying to validate a user that doesn't exist in the database.
        """
        user = model_project.User("test_user", "test_name", "test_pass", "*****@*****.**", True, "user")
        dao.store_entity(user)
        assert not self.user_service.validate_user("test_user2"), "Validation done even tho user is non-existent"

    def test_check_login_happy_flow(self):
        """
        Standard login flow with a valid username and password.
        """
        user = model_project.User("test_user", 'test_name', hash_password("test_pass"), "*****@*****.**", True,
                                  "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        assert 2 == len(available_users)
        assert self.user_service.check_login("test_user", "test_pass") is not None, "Login failed when it shouldn't."

    def test_check_login_bad_pass(self):
        """
        Flow for entering a bad/invalid password.
        """
        user = model_project.User("test_user", 'test_user_name', hash_password("test_pass"), "*****@*****.**", True,
                                  "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        assert 2 == len(available_users)
        assert self.user_service.check_login("test_user", "bad_pass") is None, "Login succeeded with bad password."

    def test_check_login_bad_user(self):
        """
        Flow for entering a bad/invalid username.
        """
        user = model_project.User("test_user", 'test_name', hash_password("test_pass"), "*****@*****.**", True,
                                  "user")
        dao.store_entity(user)
        available_users = dao.get_all_users()
        assert 2 == len(available_users)
        assert self.user_service.check_login("bad_user", "test_pass") is None, "Login succeeded with bad userName."

    def test_get_users_for_project(self):
        """
        Get all members of a project except the current user.
        """
        user_1 = model_project.User("test_user1", "test_name1", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_1)
        user_2 = model_project.User("test_user2", "test_name2", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_2)
        user_3 = model_project.User("test_user3", "test_name3", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_3)
        user_4 = model_project.User("test_user4", "test_name4", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_4)
        user_5 = model_project.User("test_user5", "test_name5", "test_pass", "*****@*****.**", False, "user")
        dao.store_entity(user_5)
        admin = dao.get_user_by_name("test_user1")
        member1 = dao.get_user_by_name("test_user2")
        member2 = dao.get_user_by_name("test_user5")
        data = dict(name="test_proj", description="test_desc", users=[member1.id, member2.id])
        project = ProjectService().store_project(admin, True, None, **data)
        all_users, members, pag = self.user_service.get_users_for_project(admin.username, project.id)
        assert len(members) == 2, "More members than there should be."
        assert len(all_users) == 5, "Admin should not be viewed as member. " \
                                    "Neither should users that were not part of the project's users list."
        assert pag == 1, "Invalid total pages number."
        for user in all_users:
            assert user.username != admin.username, "Admin is in members!"

    def test_get_users_second_page(self):
        """
        Try to get the second page of users for a given project
        """
        for i in range(USERS_PAGE_SIZE + 3):
            exec('user_' + str(i) + '= model_project.User("test_user' + str(
                i) + '", "test_pass", "*****@*****.**", False, "user")')
            exec("dao.store_entity(user_" + str(i) + ")")
        for i in range(USERS_PAGE_SIZE + 3):
            exec('member' + str(i) + '=dao.get_user_by_name("test_user' + str(i) + '")')
        admin = dao.get_user_by_name("test_user1")
        scope = locals()
        data = dict(name='test_proj', description='test_desc',
                    users=[eval('member' + str(i) + '.id', scope) for i in range(USERS_PAGE_SIZE + 3)])
        project = ProjectService().store_project(admin, True, None, **data)
        page_users, all_users, pag = self.user_service.get_users_for_project(admin.username, project.id, 2)
        assert len(page_users) == (USERS_PAGE_SIZE + 3) % USERS_PAGE_SIZE
        assert len(all_users) == USERS_PAGE_SIZE + 3, 'Not all members returned'
        assert pag == 2, 'Invalid page number returned'

    def test_get_users_second_page_del(self):
        """
        Try to get the second page of users for a given project where only one user on last page.
        Then delete that user.
        """
        for i in range(USERS_PAGE_SIZE + 1):
            exec('user_' + str(i) + '= model_project.User("test_user' + str(i) + \
                 '", "test_pass", "*****@*****.**", False, "user")')
            exec("dao.store_entity(user_" + str(i) + ")")
        for i in range(USERS_PAGE_SIZE + 1):
            exec('member' + str(i) + '=dao.get_user_by_name("test_user' + str(i) + '")')

        admin = dao.get_user_by_name("test_user1")
        scope = locals()
        data = dict(name='test_proj', description='test_desc',
                    users=[eval('member' + str(i) + '.id', scope) for i in range(USERS_PAGE_SIZE + 1)])
        project = ProjectService().store_project(admin, True, None, **data)
        page_users, all_users, pag = self.user_service.get_users_for_project(admin.username, project.id, 2)
        assert len(page_users) == 1, 'Paging not working properly'
        assert len(all_users) == USERS_PAGE_SIZE + 1, 'Not all members returned'
        assert pag == 2, 'Invalid page number returned'
        self.user_service.delete_user(scope['member2'].id)
        page_users, all_users, pag = self.user_service.get_users_for_project(admin.username, project.id, 2)
        assert len(page_users) == 0, 'Paging not working properly'
        assert len(all_users) == USERS_PAGE_SIZE, 'Not all members returned'
        assert pag == 1, 'Invalid page number returned'
        page_users, all_users, pag = self.user_service.get_users_for_project(admin.username, project.id, 1)
        assert len(page_users) == USERS_PAGE_SIZE, 'Paging not working properly'
        assert len(all_users) == USERS_PAGE_SIZE, 'Not all members returned'
        assert pag == 1, 'Invalid page number returned'

    def test_edit_user_happy_flow(self):
        """
        Test the method of editing a user.
        """
        data = dict(username="******", display_name="test_name", password=hash_password("test_password"),
                    email="*****@*****.**", role="user", comment="")
        self.user_service.create_user(**data)
        inserted_user = dao.get_user_by_name("test_user")
        assert inserted_user.password == hash_password("test_password"), "Incorrect password"
        inserted_user.role = "new_role"
        inserted_user.validated = 1
        self.user_service.edit_user(inserted_user)
        changed_user = dao.get_user_by_name("test_user")
        assert changed_user.role == "new_role", "role unchanged"
        assert changed_user.validated == 1, "user not validated"

    def test_get_users_when_no_projects(self):
        """
        Assert exception is thrown when no project is found gor the given ID.
        """
        with pytest.raises(UsernameException):
            self.user_service.get_users_for_project(TvbProfile.current.web.admin.ADMINISTRATOR_NAME,
                                                    self.NOT_EXISTENT_PROJECT_ID)