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"])
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"])
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()
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"]})