Repository: owncloud/ocis
Pull request #11039: [tests-only][full-ci] added test to share resources concurrently to federated user
Author: login: PrajwolAmatya
Labels: name: QA:team
Created: 2025-02-20T09:07:07Z | Merged: 2025-03-18T10:57:55Z

<!--
Thanks for submitting a change to ownCloud!

This is the bug tracker for the oCIS component. Find other components at https://github.com/owncloud/core/blob/master/.github/CONTRIBUTING.md#guidelines

For fixing potential security issues please see https://owncloud.org/security/

To make it possible for us to get your change reviewed and merged please carefully fill out the requested information below.

Please note that any kind of change needs first be submitted to the master branch which holds the next version of oCIS.

Please set the following labels:

- Set label "Status:Needs-Review" for review or "Status:In-Progress" if the PR still has open tasks.
- Assignment: assign to self
- Reviewers: pick at least one
-->

## Description
This PR adds the tests for sharing resources concurrently to federated users.
- sharing multiple resources to a single federated user
- sharing multiple resources to multiple federated users

## Related Issue
<!--- This project only accepts pull requests related to open issues -->
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
<!--- Please link to the issue here: -->
- https://github.com/owncloud/ocis/issues/11035

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [ ] Technical debt
- [x] Tests only (no source changes)

## Checklist:
<!-- Tick the checkboxes when done. -->
<!-- Raise documentation ticket in owncloud.github.io/ -->
- [ ] Code changes
- [ ] Unit tests added
- [x] Acceptance tests added
- [ ] Documentation ticket raised: <link> 



Diff:
diff --git a/tests/acceptance/bootstrap/OcmContext.php b/tests/acceptance/bootstrap/OcmContext.php
index 11db1054608..09a56b6f230 100644
--- a/tests/acceptance/bootstrap/OcmContext.php
+++ b/tests/acceptance/bootstrap/OcmContext.php
@@ -28,6 +28,9 @@
 use TestHelpers\WebDavHelper;
 use TestHelpers\BehatHelper;
 use TestHelpers\HttpRequestHelper;
+use Behat\Gherkin\Node\TableNode;
+use TestHelpers\GraphHelper;
+use PHPUnit\Framework\Assert;
 
 /**
  * Acceptance test steps related to testing federation share(ocm) features
@@ -403,4 +406,50 @@ public function userSendsPropfindRequestToFederatedShareWithDepthUsingTheWebdavA
 		$response = $this->spacesContext->sendPropfindRequestToSpace($user, "", $share, null, $folderDepth, true);
 		$this->featureContext->setResponse($response);
 	}
+
+	/**
+	 * @Then user :sharee should have the following federated shares:
+	 *
+	 * @param string $sharee
+	 * @param TableNode $table
+	 *
+	 * @return void
+	 * @throws GuzzleException
+	 * @throws Exception
+	 */
+	public function userShouldHaveTheFollowingFederatedShares(string $sharee, TableNode $table): void {
+		$shares = $table->getColumnsHash();
+		$response = GraphHelper::getSharesSharedWithMe(
+			$this->featureContext->getBaseUrl(),
+			$this->featureContext->getStepLineRef(),
+			$sharee,
+			$this->featureContext->getPasswordForUser($sharee)
+		);
+		$sharedWithMeList = HttpRequestHelper::getJsonDecodedResponseBodyContent($response)->value;
+		foreach ($shares as $share) {
+			$foundShareInSharedWithMe = false;
+			foreach ($sharedWithMeList as $item) {
+				if ($item->name === $share["resource"]) {
+					foreach ($item->remoteItem->permissions as $permission) {
+						$shareCreator = $permission->invitation->invitedBy->user->displayName;
+						if ($shareCreator === $this->featureContext->getDisplayNameForUser($share["sharer"])) {
+							$foundShareInSharedWithMe = true;
+							$permissionsRole = $permission->roles[0];
+						}
+					}
+				}
+			}
+			Assert::assertSame(
+				true,
+				$foundShareInSharedWithMe,
+				"Share " . $share["resource"] . " was not found in the shared-with-me list"
+			);
+			Assert::assertSame(
+				$share["permissionsRole"],
+				GraphHelper::getPermissionNameByPermissionRoleId($permissionsRole),
+				"Expected permissions role " . $share["permissionsRole"] .
+				" was not set for resource " . $share["resource"]
+			);
+		}
+	}
 }
diff --git a/tests/acceptance/bootstrap/SharingNgContext.php b/tests/acceptance/bootstrap/SharingNgContext.php
index 746b74d6106..725e1af24de 100644
--- a/tests/acceptance/bootstrap/SharingNgContext.php
+++ b/tests/acceptance/bootstrap/SharingNgContext.php
@@ -524,6 +524,82 @@ public function userSendsTheFollowingResourceShareInvitationToFederatedUserUsing
 		);
 	}
 
+	/**
+	 * @When user :user sends the following concurrent resource share invitations to federated user using the Graph API:
+	 *
+	 * @param string $user
+	 * @param TableNode $table
+	 *
+	 * @return void
+	 */
+	public function userSendsTheFollowingResourcesShareInvitationConcurrentlyToFederatedUserUsingTheGraphApi(
+		string $user,
+		TableNode $table
+	): void {
+		$results = $this->sendConcurrentShareInvitation($user, $table);
+		foreach ($results as $result) {
+			$this->featureContext->pushToLastHttpStatusCodesArray((string)$result->getStatusCode());
+		}
+	}
+
+	/**
+	 * @param string $user
+	 * @param TableNode $table
+	 *
+	 * @return array
+	 * @throws GuzzleException
+	 * @throws JsonException
+	 */
+	public function sendConcurrentShareInvitation(string $user, TableNode $table): array {
+		$table = $table->getColumnsHash();
+		foreach ($table as $shareInfo) {
+			$space = $this->spacesContext->getSpaceByName($user, $shareInfo['space']);
+			$spaceId = $space['id'];
+
+			$resource = $shareInfo['resource'] ?? '';
+			$itemId = $this->spacesContext->getResourceId($user, $shareInfo['space'], $resource);
+
+			$shareeId = (
+				$this->featureContext->ocmContext->getAcceptedUserByName(
+					$user,
+					$shareInfo["sharee"]
+				)
+			)['user_id'];
+
+			$shareType = $shareInfo['shareType'];
+			$permissionsRole = $shareInfo['permissionsRole'] ?? null;
+			$roleId = GraphHelper::getPermissionsRoleIdByName($permissionsRole);
+
+			$body = [];
+			$body['recipients'][] = [
+				"@libre.graph.recipient.type" => $shareType,
+				"objectId" => $shareeId
+			];
+			$body['roles'] = [$roleId];
+
+			$fullUrl = GraphHelper::getBetaFullUrl(
+				$this->featureContext->getBaseUrl(),
+				"drives/$spaceId/items/$itemId/invite"
+			);
+
+			$request = HttpRequestHelper::createRequest(
+				$fullUrl,
+				$this->featureContext->getStepLineRef(),
+				"POST",
+				['Content-Type' => 'application/json'],
+				\json_encode($body)
+			);
+			$requests[] = $request;
+		}
+
+		$client = HttpRequestHelper::createClient(
+			$this->featureContext->getActualUsername($user),
+			$this->featureContext->getPasswordForUser($user)
+		);
+
+		return HttpRequestHelper::sendBatchRequest($requests, $client);
+	}
+
 	/**
 	 * @When /^user "([^"]*)" sends the following space share invitation using permissions endpoint of the Graph API:$/
 	 *
diff --git a/tests/acceptance/features/apiOcm/share.feature b/tests/acceptance/features/apiOcm/share.feature
index 0d4018f8aaf..ec5effa8f7b 100755
--- a/tests/acceptance/features/apiOcm/share.feature
+++ b/tests/acceptance/features/apiOcm/share.feature
@@ -1390,3 +1390,103 @@ Feature: an user shares resources using ScienceMesh application
         }
       }
       """
+
+
+  Scenario: local user shares multiple resources concurrently to a single federated user (Personal Space)
+    Given using server "LOCAL"
+    And user "Alice" has created the following folders
+      | path           |
+      | folderToShare1 |
+      | folderToShare2 |
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded file with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following concurrent resource share invitations to federated user using the Graph API:
+      | resource       | space    | sharee | shareType | permissionsRole |
+      | folderToShare1 | Personal | Brian  | user      | Viewer          |
+      | folderToShare2 | Personal | Brian  | user      | Editor          |
+      | textfile1.txt  | Personal | Brian  | user      | Viewer          |
+      | textfile2.txt  | Personal | Brian  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated shares:
+      | resource       | permissionsRole | sharer |
+      | folderToShare1 | Viewer          | Alice  |
+      | folderToShare2 | Editor          | Alice  |
+      | textfile1.txt  | Viewer          | Alice  |
+      | textfile2.txt  | File Editor     | Alice  |
+
+
+  Scenario: local user shares multiple resources concurrently to a single federated user (Project Space)
+    Given using server "LOCAL"
+    And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
+    And user "Alice" has created a space "new-space" with the default quota using the Graph API
+    And user "Alice" has created a folder "folderToShare1" in space "new-space"
+    And user "Alice" has created a folder "folderToShare2" in space "new-space"
+    And user "Alice" has uploaded a file inside space "new-space" with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded a file inside space "new-space" with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following concurrent resource share invitations to federated user using the Graph API:
+      | resource       | space     | sharee | shareType | permissionsRole |
+      | folderToShare1 | new-space | Brian  | user      | Viewer          |
+      | folderToShare2 | new-space | Brian  | user      | Editor          |
+      | textfile1.txt  | new-space | Brian  | user      | Viewer          |
+      | textfile2.txt  | new-space | Brian  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated shares:
+      | resource       | permissionsRole | sharer |
+      | folderToShare1 | Viewer          | Alice  |
+      | folderToShare2 | Editor          | Alice  |
+      | textfile1.txt  | Viewer          | Alice  |
+      | textfile2.txt  | File Editor     | Alice  |
+
+
+  Scenario: local user shares multiple resources form different spaces concurrently to a single federated user
+    Given using server "LOCAL"
+    And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API
+    And user "Alice" has created a space "new-space" with the default quota using the Graph API
+    And user "Alice" has created folder "folderToShare1"
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has created a folder "folderToShare2" in space "new-space"
+    And user "Alice" has uploaded a file inside space "new-space" with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following concurrent resource share invitations to federated user using the Graph API:
+      | resource       | space     | sharee | shareType | permissionsRole |
+      | folderToShare1 | Personal  | Brian  | user      | Viewer          |
+      | folderToShare2 | new-space | Brian  | user      | Editor          |
+      | textfile1.txt  | Personal  | Brian  | user      | Viewer          |
+      | textfile2.txt  | new-space | Brian  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated shares:
+      | resource       | permissionsRole | sharer |
+      | folderToShare1 | Viewer          | Alice  |
+      | folderToShare2 | Editor          | Alice  |
+      | textfile1.txt  | Viewer          | Alice  |
+      | textfile2.txt  | File Editor     | Alice  |
+
+
+  Scenario: local user shares multiple resources concurrently to multiple federated users
+    Given user "Carol" has been created with default attributes
+    And "Carol" has accepted invitation
+    And using server "LOCAL"
+    And user "Alice" has created the following folders
+      | path           |
+      | folderToShare1 |
+      | folderToShare2 |
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded file with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following concurrent resource share invitations to federated user using the Graph API:
+      | resource       | space    | sharee | shareType | permissionsRole |
+      | folderToShare1 | Personal | Brian  | user      | Viewer          |
+      | folderToShare2 | Personal | Carol  | user      | Editor          |
+      | textfile1.txt  | Personal | Brian  | user      | Viewer          |
+      | textfile2.txt  | Personal | Carol  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated shares:
+      | resource       | permissionsRole | sharer |
+      | folderToShare1 | Viewer          | Alice  |
+      | textfile1.txt  | Viewer          | Alice  |
+    And user "Carol" should have the following federated shares:
+      | resource       | permissionsRole | sharer |
+      | folderToShare2 | Editor          | Alice  |
+      | textfile2.txt  | File Editor     | Alice  |


Reviews:
user: login: prashant-gurung899
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T08:23:44Z
user: login: prashant-gurung899
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T08:24:15Z
user: login: prashant-gurung899
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-10T04:55:09Z
user: login: PrajwolAmatya
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T03:22:11Z
user: login: nirajacharya2
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T05:58:50Z
user: login: amrita-shrestha
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T10:15:16Z
user: login: saw-jan
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-12T08:33:52Z
user: login: saw-jan
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-17T05:48:01Z
user: login: amrita-shrestha
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-18T10:41:48Z

Review comments:
diff_hunk: @@ -1297,3 +1297,117 @@ Feature: an user shares resources using ScienceMesh application
     And as user "Alice" the PROPFIND response should contain a resource "newFolder" with these key and value pairs:
       | key     | value     |
       | oc:name | newFolder |
+
+
+  Scenario: user shares multiple resources concurrently to a single federated user (Personal Space)
path: tests/acceptance/features/apiOcm/share.feature
user: login: prashant-gurung899
body: ```suggestion
  Scenario: local user shares multiple resources concurrently to a single federated user (Personal Space)
```
created_at: 2025-03-04T08:23:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1297,3 +1297,117 @@ Feature: an user shares resources using ScienceMesh application
     And as user "Alice" the PROPFIND response should contain a resource "newFolder" with these key and value pairs:
       | key     | value     |
       | oc:name | newFolder |
+
+
+  Scenario: user shares multiple resources concurrently to a single federated user (Personal Space)
+    Given using server "LOCAL"
+    And user "Alice" has created the following folders
+      | path           |
+      | folderToShare1 |
+      | folderToShare2 |
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded file with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following resources share invitation concurrently to federated user using the Graph API:
+      | resource       | space    | sharee | shareType | permissionsRole |
+      | folderToShare1 | Personal | Brian  | user      | Viewer          |
+      | folderToShare2 | Personal | Brian  | user      | Editor          |
+      | textfile1.txt  | Personal | Brian  | user      | Viewer          |
+      | textfile2.txt  | Personal | Brian  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated share shared by user "Alice"
+      | resource        | folderToShare1 |
+      | permissionsRole | Viewer         |
+    And user "Brian" should have the following federated share shared by user "Alice"
+      | resource        | folderToShare2 |
+      | permissionsRole | Editor         |
+    And user "Brian" should have the following federated share shared by user "Alice"
+      | resource        | textfile1.txt |
+      | permissionsRole | Viewer        |
+    And user "Brian" should have a federated share "textfile2.txt" shared by user "Alice" from space "Personal"
+
+
+  Scenario: user shares multiple resources concurrently to a single federated user (Project Space)
path: tests/acceptance/features/apiOcm/share.feature
user: login: prashant-gurung899
body: In other places as well.
```suggestion
  Scenario: local user shares multiple resources concurrently to a single federated user (Project Space)
```
created_at: 2025-03-04T08:24:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1390,3 +1390,125 @@ Feature: an user shares resources using ScienceMesh application
         }
       }
       """
+
+
+  Scenario: local user shares multiple resources concurrently to a single federated user (Personal Space)
+    Given using server "LOCAL"
+    And user "Alice" has created the following folders
+      | path           |
+      | folderToShare1 |
+      | folderToShare2 |
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded file with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following resources share invitation concurrently to federated user using the Graph API:
+      | resource       | space    | sharee | shareType | permissionsRole |
+      | folderToShare1 | Personal | Brian  | user      | Viewer          |
+      | folderToShare2 | Personal | Brian  | user      | Editor          |
+      | textfile1.txt  | Personal | Brian  | user      | Viewer          |
+      | textfile2.txt  | Personal | Brian  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated share shared by user "Alice"
path: tests/acceptance/features/apiOcm/share.feature
user: login: prashant-gurung899
body: May be we can use this existing step :question: 
``` feature
And user "Brian" should have a federated share "textfile.txt" shared by user "Alice" from space "Personal"
```
created_at: 2025-03-10T04:55:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1390,3 +1390,125 @@ Feature: an user shares resources using ScienceMesh application
         }
       }
       """
+
+
+  Scenario: local user shares multiple resources concurrently to a single federated user (Personal Space)
+    Given using server "LOCAL"
+    And user "Alice" has created the following folders
+      | path           |
+      | folderToShare1 |
+      | folderToShare2 |
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded file with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following resources share invitation concurrently to federated user using the Graph API:
+      | resource       | space    | sharee | shareType | permissionsRole |
+      | folderToShare1 | Personal | Brian  | user      | Viewer          |
+      | folderToShare2 | Personal | Brian  | user      | Editor          |
+      | textfile1.txt  | Personal | Brian  | user      | Viewer          |
+      | textfile2.txt  | Personal | Brian  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated share shared by user "Alice"
path: tests/acceptance/features/apiOcm/share.feature
user: login: PrajwolAmatya
body: This step was added to check whether the share receiver has received share with expected permissions role. 
created_at: 2025-03-11T03:22:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1390,3 +1390,125 @@ Feature: an user shares resources using ScienceMesh application
         }
       }
       """
+
+
+  Scenario: local user shares multiple resources concurrently to a single federated user (Personal Space)
+    Given using server "LOCAL"
+    And user "Alice" has created the following folders
+      | path           |
+      | folderToShare1 |
+      | folderToShare2 |
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded file with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following resources share invitation concurrently to federated user using the Graph API:
+      | resource       | space    | sharee | shareType | permissionsRole |
+      | folderToShare1 | Personal | Brian  | user      | Viewer          |
+      | folderToShare2 | Personal | Brian  | user      | Editor          |
+      | textfile1.txt  | Personal | Brian  | user      | Viewer          |
+      | textfile2.txt  | Personal | Brian  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated share shared by user "Alice"
+      | resource        | folderToShare1 |
+      | permissionsRole | Viewer         |
path: tests/acceptance/features/apiOcm/share.feature
user: login: nirajacharya2
body: can we do something like this
```suggestion
      | resource        | permissionsRole |
      | folderToShare1 | Viewer         |
      | folderToShare2 | Editor         |
      | folderToShare1 | Viewer         |
      ...
```
created_at: 2025-03-11T05:57:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1390,3 +1390,125 @@ Feature: an user shares resources using ScienceMesh application
         }
       }
       """
+
+
+  Scenario: local user shares multiple resources concurrently to a single federated user (Personal Space)
+    Given using server "LOCAL"
+    And user "Alice" has created the following folders
+      | path           |
+      | folderToShare1 |
+      | folderToShare2 |
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded file with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following resources share invitation concurrently to federated user using the Graph API:
+      | resource       | space    | sharee | shareType | permissionsRole |
+      | folderToShare1 | Personal | Brian  | user      | Viewer          |
+      | folderToShare2 | Personal | Brian  | user      | Editor          |
+      | textfile1.txt  | Personal | Brian  | user      | Viewer          |
+      | textfile2.txt  | Personal | Brian  | user      | File Editor     |
+    Then the HTTP status code of responses on each endpoint should be "200, 200, 200, 200" respectively
+    And using server "REMOTE"
+    And user "Brian" should have the following federated share shared by user "Alice"
+      | resource        | folderToShare1 |
+      | permissionsRole | Viewer         |
path: tests/acceptance/features/apiOcm/share.feature
user: login: amrita-shrestha
body: ```suggestion
    And user "Brian" should have the following federated shares:
      | resource       | permissionsRole | sharer |
      | folderToShare1 | Viewer          | Alice  |
      | folderToShare2 | Editor          | Alice  |
      | folderToShare1 | Viewer          | Alice  | 
```
created_at: 2025-03-11T10:13:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1390,3 +1390,125 @@ Feature: an user shares resources using ScienceMesh application
         }
       }
       """
+
+
+  Scenario: local user shares multiple resources concurrently to a single federated user (Personal Space)
+    Given using server "LOCAL"
+    And user "Alice" has created the following folders
+      | path           |
+      | folderToShare1 |
+      | folderToShare2 |
+    And user "Alice" has uploaded file with content "some content" to "textfile1.txt"
+    And user "Alice" has uploaded file with content "hello world" to "textfile2.txt"
+    When user "Alice" sends the following resources share invitation concurrently to federated user using the Graph API:
path: tests/acceptance/features/apiOcm/share.feature
user: login: saw-jan
body: ```suggestion
    When user "Alice" sends the following concurrent resource share invitations to federated user using the Graph API:
```
created_at: 2025-03-12T08:33:52Z
author_association: MEMBER

PR comments:
user: login: sonarqubecloud[bot]
created_at: 2025-03-17T04:27:13Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=11039) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=11039&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=owncloud_ocis&pullRequest=11039&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=owncloud_ocis&pullRequest=11039&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=11039&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=owncloud_ocis&pullRequest=11039&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=owncloud_ocis&pullRequest=11039)


author_association: NONE