Feature: comments
  Scenario: Creating a comment on a file belonging to myself
    Given user "user0" exists
    Given As an "user0"
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    When "user0" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "201"
    Then As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    And the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user0"
    And the response should contain only "1" comments

  Scenario: Creating a comment on a shared file belonging to another user
    Given user "user0" exists
    Given user "user1" exists
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Given As "user0" sending "POST" to "/apps/files_sharing/api/v1/shares" with
      | path | myFileToComment.txt |
      | shareWith | user1 |
      | shareType | 0 |
    When "user1" posts a comment with content "A comment from another user" on the file named "/myFileToComment.txt" it should return "201"
    Then As "user1" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    And the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "A comment from another user"
    And the response should contain a property "oc:actorDisplayName" with value "user1"
    And the response should contain only "1" comments

  Scenario: Creating a comment on a non-shared file belonging to another user
    Given user "user0" exists
    Given user "user1" exists
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Then "user1" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "404"

  Scenario: Reading comments on a non-shared file belonging to another user
    Given user "user0" exists
    Given user "user1" exists
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Then As "user1" load all the comments of the file named "/myFileToComment.txt" it should return "404"

  Scenario: Deleting my own comments on a file belonging to myself
    Given user "user0" exists
    Given As an "user0"
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Given "user0" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "201"
    When As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    Then the response should contain a property "oc:parentId" with value "0"
    Then the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user0"
    And the response should contain only "1" comments
    And As "user0" delete the created comment it should return "204"
    And As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    And the response should contain only "0" comments

  Scenario: Deleting my own comments on a file shared by somebody else
    Given user "user0" exists
    Given user "user1" exists
    Given As an "user0"
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Given As "user0" sending "POST" to "/apps/files_sharing/api/v1/shares" with
      | path | myFileToComment.txt |
      | shareWith | user1 |
      | shareType | 0 |
    Given "user1" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "201"
    When As "user1" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    Then the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user1"
    And the response should contain only "1" comments
    And As "user1" delete the created comment it should return "204"
    And As "user1" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    And the response should contain only "0" comments

  Scenario: Deleting my own comments on a file unshared by someone else
    Given user "user0" exists
    Given user "user1" exists
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Given As "user0" sending "POST" to "/apps/files_sharing/api/v1/shares" with
      | path | myFileToComment.txt |
      | shareWith | user1 |
      | shareType | 0 |
    Given "user1" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "201"
    When As "user1" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    Then the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user1"
    And the response should contain only "1" comments
    And As "user0" remove all shares from the file named "/myFileToComment.txt"
    And As "user1" delete the created comment it should return "404"
    And As "user1" load all the comments of the file named "/myFileToComment.txt" it should return "404"

  Scenario: Edit my own comments on a file belonging to myself
    Given user "user0" exists
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Given "user0" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "201"
    When As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    Then the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user0"
    And the response should contain only "1" comments
    When As "user0" edit the last created comment and set text to "My edited comment" it should return "207"
    Then As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    And the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My edited comment"
    And the response should contain a property "oc:actorDisplayName" with value "user0"

  Scenario: Edit my own comments on a file shared by someone with me
    Given user "user0" exists
    Given user "user1" exists
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Given As "user0" sending "POST" to "/apps/files_sharing/api/v1/shares" with
      | path | myFileToComment.txt |
      | shareWith | user1 |
      | shareType | 0 |
    Given "user1" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "201"
    When As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    Then the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user1"
    And the response should contain only "1" comments
    Given As "user1" edit the last created comment and set text to "My edited comment" it should return "207"
    Then As "user1" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    And the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My edited comment"
    And the response should contain a property "oc:actorDisplayName" with value "user1"

  Scenario: Edit my own comments on a file unshared by someone with me
    Given user "user0" exists
    Given user "user1" exists
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Given As "user0" sending "POST" to "/apps/files_sharing/api/v1/shares" with
      | path | myFileToComment.txt |
      | shareWith | user1 |
      | shareType | 0 |
    When "user1" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "201"
    Then As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    And the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user1"
    And the response should contain only "1" comments
    And As "user0" remove all shares from the file named "/myFileToComment.txt"
    When As "user1" edit the last created comment and set text to "My edited comment" it should return "404"
    Then As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    And the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user1"

  Scenario: Edit comments of other users should not be possible
    Given user "user0" exists
    Given user "user1" exists
    Given User "user0" uploads file "data/textfile.txt" to "/myFileToComment.txt"
    Given As "user0" sending "POST" to "/apps/files_sharing/api/v1/shares" with
      | path | myFileToComment.txt |
      | shareWith | user1 |
      | shareType | 0 |
    Given "user1" posts a comment with content "My first comment" on the file named "/myFileToComment.txt" it should return "201"
    When As "user0" load all the comments of the file named "/myFileToComment.txt" it should return "207"
    Then the response should contain a property "oc:parentId" with value "0"
    And the response should contain a property "oc:childrenCount" with value "0"
    And the response should contain a property "oc:verb" with value "comment"
    And the response should contain a property "oc:actorType" with value "users"
    And the response should contain a property "oc:objectType" with value "files"
    And the response should contain a property "oc:message" with value "My first comment"
    And the response should contain a property "oc:actorDisplayName" with value "user1"
    And the response should contain only "1" comments
    Then As "user0" edit the last created comment and set text to "My edited comment" it should return "403"