Feature: check share activity As a user I want to check who shared which file to whom So that I can track activities of a file Background: Given these users have been created with default attributes and without skeleton files: | username | | Alice | | Brian | And user "Alice" has uploaded file with content "ownCloud test text file" to "textfile.txt" Scenario: check activities after adding share to a file Given user "Alice" has sent the following resource share invitation: | resource | textfile.txt | | space | Personal | | sharee | Brian | | shareType | user | | permissionsRole | Viewer | When user "Alice" lists the activities of file "textfile.txt" from space "Personal" using the Graph API Then the HTTP status code should be "200" And the JSON data of the response should match """ { "type": "object", "required": ["value"], "properties": { "value": { "type": "array", "minItems": 2, "maxItems": 2, "uniqueItems": true, "items": { "oneOf": [ { "type": "object", "required": ["id","template","times"], "properties": { "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} added {resource} to {folder}" } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} shared {resource} with {sharee}" }, "variables": { "type": "object", "required": ["resource","sharee","user"], "properties": { "resource": { "type": "object", "required": ["id","name"], "properties": { "id": { "type": "string", "pattern": "^%file_id_pattern%$" }, "name": { "const": "textfile.txt" } } }, "sharee": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "displayName": { "const": "Brian" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Alice Hansen" } } } } } } }, "times": { "type": "object", "required": ["recordedTime"], "properties": { "recordedTime": { "type": "string", "format": "date-time" } } } } } ] } } } } """ Scenario: check activities after removing share from a file Given user "Alice" has sent the following resource share invitation: | resource | textfile.txt | | space | Personal | | sharee | Brian | | shareType | user | | permissionsRole | Viewer | And user "Alice" has removed the access of user "Brian" from resource "textfile.txt" of space "Personal" When user "Alice" lists the activities of file "textfile.txt" from space "Personal" using the Graph API Then the HTTP status code should be "200" And the JSON data of the response should match """ { "type": "object", "required": ["value"], "properties": { "value": { "type": "array", "minItems": 3, "maxItems": 3, "uniqueItems": true, "items": { "oneOf": [ { "type": "object", "required": ["id","template","times"], "properties": { "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} added {resource} to {folder}" } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} shared {resource} with {sharee}" } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} removed {sharee} from {resource}" }, "variables": { "type": "object", "required": ["resource","sharee","user"], "properties": { "resource": { "type": "object", "required": ["id","name"], "properties": { "id": { "type": "string", "pattern": "%file_id_pattern%" }, "name": { "const": "textfile.txt" } } }, "sharee": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Brian" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Alice Hansen" } } } } } } }, "times": { "type": "object", "required": ["recordedTime"], "properties": { "recordedTime": { "type": "string", "format": "date-time" } } } } } ] } } } } """ Scenario: check link creation activity for a file Given user "Alice" has created the following resource link share: | resource | textfile.txt | | space | Personal | | permissionsRole | view | | password | %public% | When user "Alice" lists the activities of file "textfile.txt" from space "Personal" using the Graph API Then the HTTP status code should be "200" And the JSON data of the response should match """ { "type": "object", "required": ["value"], "properties": { "value": { "type": "array", "minItems": 2, "maxItems": 2, "uniqueItems": true, "items": { "oneOf": [ { "type": "object", "required": ["id","template","times"], "properties": { "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} added {resource} to {folder}" } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} shared {resource} via link" }, "variables": { "type": "object", "required": ["resource","user"], "properties": { "resource": { "type": "object", "required": ["id","name"], "properties": { "id": { "type": "string", "pattern": "%file_id_pattern%" }, "name": { "const": "textfile.txt" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Alice Hansen" } } } } } } }, "times": { "type": "object", "required": ["recordedTime"], "properties": { "recordedTime": { "type": "string", "format": "date-time" } } } } } ] } } } } """ Scenario: check link deletion activity for a file Given user "Alice" has created the following resource link share: | resource | textfile.txt | | space | Personal | | permissionsRole | view | | password | %public% | And user "Alice" has removed the last link share of file "textfile.txt" from space "Personal" When user "Alice" lists the activities of file "textfile.txt" from space "Personal" using the Graph API Then the HTTP status code should be "200" And the JSON data of the response should match """ { "type": "object", "required": ["value"], "properties": { "value": { "type": "array", "minItems": 3, "maxItems": 3, "uniqueItems": true, "items": { "oneOf": [ { "type": "object", "required": ["id","template","times"], "properties": { "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} added {resource} to {folder}" } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} shared {resource} via link" } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} removed link to {resource}" }, "variables": { "type": "object", "required": ["resource","user"], "properties": { "resource": { "type": "object", "required": ["id","name"], "properties": { "id": { "type": "string", "pattern": "%file_id_pattern%" }, "name": { "const": "textfile.txt" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Alice Hansen" } } } } } } }, "times": { "type": "object", "required": ["recordedTime"], "properties": { "recordedTime": { "type": "string", "format": "date-time" } } } } } ] } } } } """ @issue-9712 Scenario: sharer checks sharee's activities Given user "Alice" has created folder "FOLDER" And user "Alice" has sent the following resource share invitation: | resource | FOLDER | | space | Personal | | sharee | Brian | | shareType | user | | permissionsRole | Editor | And user "Brian" has a share "FOLDER" synced And user "Brian" has uploaded file with content "some data" to "Shares/FOLDER/newfile.txt" And user "Brian" has uploaded file with content "edited data" to "Shares/FOLDER/newfile.txt" And user "Brian" has deleted file "Shares/FOLDER/newfile.txt" When user "Alice" lists the activities of file "FOLDER" from space "Personal" using the Graph API Then the HTTP status code should be "200" And the JSON data of the response should match """ { "type": "object", "required": ["value"], "properties": { "value": { "type": "array", "minItems": 5, "maxItems": 5, "uniqueItems": true, "items": { "oneOf": [ { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} added {resource} to {folder}" }, "variables": { "type": "object", "required": ["folder","resource","user"], "properties": { "folder": { "type": "object", "required": ["id","name"], "properties": { "name": { "const": "Alice Hansen" } } }, "resource": { "type": "object", "required": ["id","name"], "properties": { "name": { "const": "FOLDER" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Alice Hansen" } } } } } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} shared {resource} with {sharee}" } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} added {resource} to {folder}" }, "variables": { "type": "object", "required": ["folder","resource","user"], "properties": { "folder": { "type": "object", "required": ["id","name"], "properties": { "name": { "const": "FOLDER" } } }, "resource": { "type": "object", "required": ["id","name"], "properties": { "name": { "const": "newfile.txt" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Brian Murphy" } } } } } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} updated {resource} in {folder}" }, "variables": { "type": "object", "required": ["folder","resource","user"], "properties": { "folder": { "type": "object", "required": ["id","name"], "properties": { "name": { "const": "FOLDER" } } }, "resource": { "type": "object", "required": ["id","name"], "properties": { "name": { "const": "newfile.txt" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Brian Murphy" } } } } } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} deleted {resource} from {folder}" }, "variables": { "type": "object", "required": ["folder","resource","user"], "properties": { "folder": { "type": "object", "required": ["id","name"], "properties": { "name": { "const": "Alice Hansen" } } }, "resource": { "type": "object", "required": ["id","name"], "properties": { "name": { "const": "newfile.txt" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Brian Murphy" } } } } } } }, "times": { "type": "object", "required": ["recordedTime"], "properties": { "recordedTime": { "type": "string", "format": "date-time" } } } } } ] } } } } """ Scenario: check add member to space activity Given 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 sent the following space share invitation: | space | new-space | | sharee | Brian | | shareType | user | | permissionsRole | Space Editor | When user "Alice" lists the activities of space "new-space" using the Graph API Then the HTTP status code should be "200" And the JSON data of the response should match """ { "type": "object", "required": ["value"], "properties": { "value": { "type": "array", "minItems": 1, "maxItems": 1, "uniqueItems": true, "items": { "oneOf": [ { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} added {sharee} as member of {space}" }, "variables": { "type": "object", "required": ["sharee","space","user"], "properties": { "sharee": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Brian" } } }, "space": { "type": "object", "required": ["id","name"], "properties": { "id": { "type": "string", "pattern": "^%file_id_pattern%$" }, "name": { "const": "new-space" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Alice Hansen" } } } } } } }, "times": { "type": "object", "required": ["recordedTime"], "properties": { "recordedTime": { "type": "string", "format": "date-time" } } } } } ] } } } } """ Scenario: check remove member from space activity Given 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 sent the following space share invitation: | space | new-space | | sharee | Brian | | shareType | user | | permissionsRole | Space Editor | And user "Alice" has removed the access of user "Brian" from space "new-space" When user "Alice" lists the activities of space "new-space" using the Graph API Then the HTTP status code should be "200" And the JSON data of the response should match """ { "type": "object", "required": ["value"], "properties": { "value": { "type": "array", "minItems": 2, "maxItems": 2, "uniqueItems": true, "items": { "oneOf": [ { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} added {sharee} as member of {space}" }, "variables": { "type": "object", "required": ["sharee","space","user"], "properties": { "sharee": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Brian" } } }, "space": { "type": "object", "required": ["id","name"], "properties": { "id": { "type": "string", "pattern": "^%file_id_pattern%$" }, "name": { "const": "new-space" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Alice Hansen" } } } } } } } } }, { "type": "object", "required": ["id","template","times"], "properties": { "id": { "type": "string", "pattern": "^%user_id_pattern%$" }, "template": { "type": "object", "required": ["message","variables"], "properties": { "message": { "const": "{user} removed {sharee} from {space}" }, "variables": { "type": "object", "required": ["sharee","space","user"], "properties": { "sharee": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Brian" } } }, "space": { "type": "object", "required": ["id","name"], "properties": { "id": { "type": "string", "pattern": "^%file_id_pattern%$" }, "name": { "const": "new-space" } } }, "user": { "type": "object", "required": ["id","displayName"], "properties": { "id": { "type": "string", "pattern": "%user_id_pattern%" }, "displayName": { "const": "Alice Hansen" } } } } } } }, "times": { "type": "object", "required": ["recordedTime"], "properties": { "recordedTime": { "type": "string", "format": "date-time" } } } } } ] } } } } """ Scenario: sharee tries to check the activities of a shared folder using share mount-point id Given user "Alice" has created folder "/FOLDER" And user "Alice" has sent the following resource share invitation: | resource | /FOLDER | | space | Personal | | sharee | Brian | | shareType | user | | permissionsRole | Editor | And user "Brian" has a share "/FOLDER" synced And user "Brian" has uploaded file with content "some data" to "Shares/FOLDER/newfile.txt" And user "Brian" has uploaded file with content "edited data" to "Shares/FOLDER/newfile.txt" And user "Brian" has deleted file "Shares/FOLDER/newfile.txt" When user "Brian" tries to list the activities of folder "FOLDER" with share mount-point id using the Graph API Then the HTTP status code should be "403" @issue-9849 Scenario: sharee tries to check the activities of a shared folder using file-id Given user "Alice" has created folder "/FOLDER" And user "Alice" has uploaded file with content "some data" to "FOLDER/newfile.txt" And user "ALice" has uploaded file with content "edited data" to "FOLDER/newfile.txt" And user "ALice" has deleted file "FOLDER/newfile.txt" And user "Alice" has sent the following resource share invitation: | resource | /FOLDER | | space | Personal | | sharee | Brian | | shareType | user | | permissionsRole | Editor | And user "Brian" has a share "/FOLDER" synced When user "Brian" lists the activities of folder "FOLDER" from space "Shares" using the Graph API Then the HTTP status code should be "403" @issue-9860 Scenario: sharee tries to check the activities of unshared file Given user "Alice" has uploaded file with content "another ownCloud test text file" to "anotherTextfile.txt" And user "Alice" has sent the following resource share invitation: | resource | textfile.txt | | space | Personal | | sharee | Brian | | shareType | user | | permissionsRole | Viewer | When user "Brian" tries to list the activities of file "anotherTextfile.txt" from space "Personal" owned by user "Alice" using the Graph API Then the HTTP status code should be "403"