예제 #1
0
    def test_create_group_sends_user_added_to_group_signal(self):

        url = reverse('django_airavata_api:group-list')
        data = {
            "id":
            None,
            "name":
            "test",
            "description":
            None,
            "members": [
                f"{self.user.username}@{GATEWAY_ID}",  # owner
                f"testuser1@{GATEWAY_ID}"
            ],
            "admins": []
        }
        request = self.factory.post(url, data)
        force_authenticate(request, self.user)

        # Mock api clients
        group_manager_mock = MagicMock(name='group_manager')
        user_profile_mock = MagicMock(name='user_profile')
        request.profile_service = {
            'group_manager': group_manager_mock,
            'user_profile': user_profile_mock,
        }
        request.airavata_client = MagicMock(name="airavata_client")
        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
            gatewayId=GATEWAY_ID,
            adminsGroupId="adminsGroupId",
            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId")
        request.authz_token = "dummy"
        request.session = {}
        group_manager_mock.createGroup.return_value = "abc123"
        user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        user_profile_mock.getUserProfileById.return_value = user_profile

        # Mock signal handler to verify 'user_added_to_group' signal is sent
        user_added_to_group_handler = MagicMock()
        signals.user_added_to_group.connect(user_added_to_group_handler,
                                            sender=views.GroupViewSet)
        group_create = views.GroupViewSet.as_view({'post': 'create'})
        response = group_create(request)
        self.assertEquals(201, response.status_code)
        self.assertEquals("abc123", response.data['id'])
        user_added_to_group_handler.assert_called_once()
        args, kwargs = user_added_to_group_handler.call_args
        self.assertEquals("abc123", kwargs["groups"][0].id)
        self.assertIs(user_profile, kwargs["user"])
예제 #2
0
    def test_update_group_sends_user_added_to_group_signal(self):
        url = reverse('django_airavata_api:group-detail',
                      kwargs={'group_id': 'abc123'})
        data = {
            "id":
            "abc123",
            "name":
            "test",
            "description":
            None,
            "members": [
                f"{self.user.username}@{GATEWAY_ID}",  # owner
                f"testuser1@{GATEWAY_ID}",  # existing member
                f"testuser3@{GATEWAY_ID}"
            ],  # new member
            "admins": []
        }
        request = self.factory.put(url, data)
        force_authenticate(request, self.user)

        # Mock api clients
        group_manager_mock = MagicMock(name='group_manager')
        user_profile_mock = MagicMock(name='user_profile')
        request.profile_service = {
            'group_manager': group_manager_mock,
            'user_profile': user_profile_mock,
        }
        request.airavata_client = MagicMock(name="airavata_client")
        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
            gatewayId=GATEWAY_ID,
            adminsGroupId="adminsGroupId",
            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId")
        request.authz_token = "dummy"
        request.session = {}

        # mock getGroup
        group = GroupModel(
            id="abc123",
            name="My Group",
            ownerId=f"{self.user.username}@{GATEWAY_ID}",
            members=[
                f"{self.user.username}@{GATEWAY_ID}",  # owner
                f"testuser1@{GATEWAY_ID}",  # existing member
                f"testuser2@{GATEWAY_ID}",  # new member
            ],
            admins=[])
        group_manager_mock.getGroup.return_value = group

        # Only user added is testuser3, so getUserProfileById will be called
        # for that user
        user_profile = UserProfile(
            airavataInternalUserId=f"testuser3@{GATEWAY_ID}",
            userId="testuser3",
            firstName="Test",
            lastName="User3",
            emails=["*****@*****.**"])
        user_profile_mock.getUserProfileById.return_value = user_profile

        # Mock signal handler to verify 'user_added_to_group' signal is sent
        user_added_to_group_handler = MagicMock()
        signals.user_added_to_group.connect(user_added_to_group_handler,
                                            sender=views.GroupViewSet)
        group_update = views.GroupViewSet.as_view({'put': 'update'})
        response = group_update(request, group_id="abc123")
        self.assertEquals(200, response.status_code)
        self.assertEquals("abc123", response.data['id'])

        # verify addUsersToGroup
        group_manager_mock.addUsersToGroup.assert_called_once()
        args, kwargs = group_manager_mock.addUsersToGroup.call_args
        self.assertEqual(args[1], [f"testuser3@{GATEWAY_ID}"])

        # verify removeUsersFromGroup
        group_manager_mock.removeUsersFromGroup.assert_called_once()
        args, kwargs = group_manager_mock.removeUsersFromGroup.call_args
        self.assertEqual(args[1], [f"testuser2@{GATEWAY_ID}"])

        # verify updateGroup
        group_manager_mock.updateGroup.assert_called_once()

        user_added_to_group_handler.assert_called_once()
        args, kwargs = user_added_to_group_handler.call_args
        self.assertEquals("abc123", kwargs["groups"][0].id)
        self.assertIs(user_profile, kwargs["user"])
예제 #3
0
    def test_update_that_does_not_add_user_to_groups(self, iam_admin_client):

        username = "******"
        url = reverse('django_airavata_api:iam-user-profile-detail',
                      kwargs={'user_id': username})
        data = {
            "airavataInternalUserId": f"{username}@{GATEWAY_ID}",
            "userId": username,
            "gatewayId": GATEWAY_ID,
            "email": "*****@*****.**",
            "firstName": "Test",
            "lastName": "User1",
            "airavataUserProfileExists": True,
            "enabled": True,
            "emailVerified": True,
            "groups": [
                {
                    "id": "group1",
                    "name": "Group 1"
                },
            ]
        }
        request = self.factory.put(url, data)
        force_authenticate(request, self.user)
        request.is_gateway_admin = True

        # Mock api clients
        iam_user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        iam_admin_client.get_user.return_value = iam_user_profile
        group_manager_mock = MagicMock(name='group_manager')
        user_profile_mock = MagicMock(name='user_profile')
        request.profile_service = {
            'group_manager': group_manager_mock,
            'user_profile': user_profile_mock,
        }
        request.authz_token = "dummy"
        user_profile_mock.doesUserExist.return_value = True
        user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        user_profile_mock.getUserProfileById.return_value = user_profile
        group_manager_mock.getAllGroupsUserBelongs.return_value = [
            GroupModel(id="group1")
        ]

        request.airavata_client = MagicMock(name="airavata_client")
        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
            gatewayId=GATEWAY_ID,
            adminsGroupId="adminsGroupId",
            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId")
        request.session = {}

        # Mock signal handler to verify 'user_added_to_group' signal is sent
        user_added_to_group_handler = MagicMock(
            name="user_added_to_group_handler")
        signals.user_added_to_group.connect(user_added_to_group_handler,
                                            sender=views.IAMUserViewSet)
        iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
        response = iam_user_update(request, user_id=username)
        self.assertEquals(200, response.status_code)

        user_profile_mock.doesUserExist.assert_called_once()
        group_manager_mock.getAllGroupsUserBelongs.assert_called_once()

        # Since user wasn't added to a group, these all should not have been
        # called
        user_profile_mock.getUserProfileById.assert_not_called()
        group_manager_mock.getGroup.assert_not_called()
        group_manager_mock.addUsersToGroup.assert_not_called()
        user_added_to_group_handler.assert_not_called()
예제 #4
0
    def test_update_that_adds_user_to_multiple_groups(self, iam_admin_client):

        username = "******"
        url = reverse('django_airavata_api:iam-user-profile-detail',
                      kwargs={'user_id': username})
        data = {
            "airavataInternalUserId":
            f"{username}@{GATEWAY_ID}",
            "userId":
            username,
            "gatewayId":
            GATEWAY_ID,
            "email":
            "*****@*****.**",
            "firstName":
            "Test",
            "lastName":
            "User1",
            "airavataUserProfileExists":
            True,
            "enabled":
            True,
            "emailVerified":
            True,
            "groups": [
                {
                    "id": "group1",
                    "name": "Group 1"
                },
                {
                    "id": "group2",
                    "name": "Group 2"
                },
                {
                    "id": "group3",
                    "name": "Group 3"
                },
            ]
        }
        request = self.factory.put(url, data)
        force_authenticate(request, self.user)
        request.is_gateway_admin = True

        # Mock api clients
        iam_user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        iam_admin_client.get_user.return_value = iam_user_profile
        group_manager_mock = MagicMock(name='group_manager')
        user_profile_mock = MagicMock(name='user_profile')
        request.profile_service = {
            'group_manager': group_manager_mock,
            'user_profile': user_profile_mock,
        }
        request.authz_token = "dummy"
        user_profile_mock.doesUserExist.return_value = True
        user_profile = UserProfile(
            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
            userId="testuser1",
            firstName="Test",
            lastName="User1",
            emails=["*****@*****.**"])
        user_profile_mock.getUserProfileById.return_value = user_profile
        group_manager_mock.getAllGroupsUserBelongs.return_value = [
            GroupModel(id="group1")
        ]

        def side_effect(authz_token, group_id):
            if group_id == "group2":
                return GroupModel(id="group2", name="Group 2")
            elif group_id == "group3":
                return GroupModel(id="group3", name="Group 3")
            else:
                raise Exception("Unexpected group id: " + group_id)

        group_manager_mock.getGroup.side_effect = side_effect
        request.airavata_client = MagicMock(name="airavata_client")
        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
            gatewayId=GATEWAY_ID,
            adminsGroupId="adminsGroupId",
            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId")
        request.session = {}

        # Mock signal handler to verify 'user_added_to_group' signal is sent
        user_added_to_group_handler = MagicMock(
            name="user_added_to_group_handler")
        signals.user_added_to_group.connect(user_added_to_group_handler,
                                            sender=views.IAMUserViewSet)
        iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
        response = iam_user_update(request, user_id=username)
        self.assertEquals(200, response.status_code)

        user_profile_mock.doesUserExist.assert_called_once()
        group_manager_mock.getAllGroupsUserBelongs.assert_called_once()

        user_profile_mock.getUserProfileById.assert_called_once()
        args, kwargs = user_profile_mock.getUserProfileById.call_args
        self.assertSequenceEqual(
            args, [request.authz_token, "testuser1", GATEWAY_ID])

        group_manager_mock.getGroup.assert_has_calls([
            call(request.authz_token, "group2"),
            call(request.authz_token, "group3")
        ],
                                                     any_order=True)

        group_manager_mock.addUsersToGroup.assert_has_calls([
            call(request.authz_token, [f"testuser1@{GATEWAY_ID}"], "group2"),
            call(request.authz_token, [f"testuser1@{GATEWAY_ID}"], "group3"),
        ],
                                                            any_order=True)

        # user_added_to_group signal should only be called once, with both
        # groups passed to it
        user_added_to_group_handler.assert_called_once()
        args, kwargs = user_added_to_group_handler.call_args
        self.assertEqual(kwargs["sender"], views.IAMUserViewSet)
        self.assertEqual(kwargs["user"], user_profile)
        self.assertSetEqual({"group2", "group3"},
                            {g.id
                             for g in kwargs["groups"]})