207 lines
9.5 KiB
Plaintext
207 lines
9.5 KiB
Plaintext
|
|
# =============================================================
|
|||
|
|
# OxiCloud – Trash API end-to-end scenario
|
|||
|
|
# =============================================================
|
|||
|
|
# Depends on files-folders.hurl having run first (home folder
|
|||
|
|
# with test1 and test2-renamed must exist).
|
|||
|
|
#
|
|||
|
|
# Run:
|
|||
|
|
# hurl --variables-file tests/api/test.env --test tests/api/trash.hurl
|
|||
|
|
# =============================================================
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 1 – Login and capture the JWT token
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
POST {{base_url}}/api/auth/login
|
|||
|
|
Content-Type: application/json
|
|||
|
|
{
|
|||
|
|
"username": "{{username}}",
|
|||
|
|
"password": "{{password}}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Captures]
|
|||
|
|
token: jsonpath "$.access_token"
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$.access_token" isString
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 2 – Trash is empty at the start
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/trash
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$" isCollection
|
|||
|
|
jsonpath "$" count == 0
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 3 – Capture the home folder ID
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/folders
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Captures]
|
|||
|
|
home_folder_id: jsonpath "$[0].id"
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 4 – Create "to-delete" folder inside the home folder
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
POST {{base_url}}/api/folders
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
Content-Type: application/json
|
|||
|
|
{
|
|||
|
|
"name": "to-delete",
|
|||
|
|
"parent_id": "{{home_folder_id}}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
HTTP 201
|
|||
|
|
[Captures]
|
|||
|
|
to_delete_id: jsonpath "$.id"
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$.name" == "to-delete"
|
|||
|
|
jsonpath "$.parent_id" == {{home_folder_id}}
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 5 – Upload hello.txt into "to-delete"
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
POST {{base_url}}/api/files/upload
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
[MultipartFormData]
|
|||
|
|
folder_id: {{to_delete_id}}
|
|||
|
|
file: file,fixtures/hello.txt; text/plain
|
|||
|
|
|
|||
|
|
HTTP 201
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$.name" == "hello.txt"
|
|||
|
|
jsonpath "$.folder_id" == {{to_delete_id}}
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 6 – Delete "to-delete" folder (moves it to trash)
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
DELETE {{base_url}}/api/folders/{{to_delete_id}}
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 204
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 7 – Trash contains exactly the "to-delete" folder
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/trash
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Captures]
|
|||
|
|
trash_id: jsonpath "$[0].id"
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$" count == 1
|
|||
|
|
jsonpath "$[0].item_type" == "folder"
|
|||
|
|
jsonpath "$[0].name" == "to-delete"
|
|||
|
|
jsonpath "$[0].original_id" == {{to_delete_id}}
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 8 – "to-delete" is no longer listed in the home folder
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/folders/{{home_folder_id}}/contents
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$[*].name" not contains "to-delete"
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 9 – Restore "to-delete" from trash
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
POST {{base_url}}/api/trash/{{trash_id}}/restore
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$.success" == true
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 10 – "to-delete" folder is back in the home folder
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/folders/{{home_folder_id}}/contents
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$[*].name" contains "to-delete"
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 11 – hello.txt is still inside the restored folder
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/files?folder_id={{to_delete_id}}
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$" count == 1
|
|||
|
|
jsonpath "$[0].name" == "hello.txt"
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 12 – Trash is empty after restore
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/trash
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$" count == 0
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 13 – Delete "to-delete" folder again (moves to trash)
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
DELETE {{base_url}}/api/folders/{{to_delete_id}}
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 204
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 14 – Empty the trash
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
DELETE {{base_url}}/api/trash/empty
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$.success" == true
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 15 – Trash is empty after purge
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/trash
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$" count == 0
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
# Step 16 – "to-delete" folder no longer exists in home folder
|
|||
|
|
# ─────────────────────────────────────────────────────────────
|
|||
|
|
GET {{base_url}}/api/folders/{{home_folder_id}}/contents
|
|||
|
|
Authorization: Bearer {{token}}
|
|||
|
|
|
|||
|
|
HTTP 200
|
|||
|
|
[Asserts]
|
|||
|
|
jsonpath "$[*].name" not contains "to-delete"
|