Files
Oxicloud/tests/api/batch_folder_copy.hurl
T

195 lines
8.1 KiB
Plaintext
Raw Normal View History

# =============================================================
# OxiCloud – Batch folder copy end-to-end scenario
# =============================================================
# Verifies that copying a folder (containing one file) into a
# target folder produces an independent copy: the copied folder
# appears inside the target, and its child file is present.
#
# Run standalone:
# hurl --variables-file tests/api/test.env --test \
# tests/api/batch_folder_copy.hurl
# =============================================================
# ─────────────────────────────────────────────────────────────
# Step 1 – Login
# ─────────────────────────────────────────────────────────────
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 – Create source folder
# ─────────────────────────────────────────────────────────────
POST {{base_url}}/api/folders
Authorization: Bearer {{token}}
Content-Type: application/json
{
"name": "hurl-copy-source"
}
HTTP 201
[Captures]
source_folder_id: jsonpath "$.id"
[Asserts]
jsonpath "$.name" == "hurl-copy-source"
# ─────────────────────────────────────────────────────────────
# Step 3 – Upload one file into the source folder
# ─────────────────────────────────────────────────────────────
POST {{base_url}}/api/files/upload
Authorization: Bearer {{token}}
[MultipartFormData]
folder_id: {{source_folder_id}}
file: file,fixtures/hello.txt; text/plain
HTTP 201
[Captures]
source_file_id: jsonpath "$.id"
source_file_name: jsonpath "$.name"
[Asserts]
jsonpath "$.folder_id" == "{{source_folder_id}}"
# ─────────────────────────────────────────────────────────────
# Step 4 – Create target folder (copy destination)
# ─────────────────────────────────────────────────────────────
POST {{base_url}}/api/folders
Authorization: Bearer {{token}}
Content-Type: application/json
{
"name": "hurl-copy-target"
}
HTTP 201
[Captures]
target_folder_id: jsonpath "$.id"
[Asserts]
jsonpath "$.name" == "hurl-copy-target"
# ─────────────────────────────────────────────────────────────
# Step 5 – Copy source folder into target folder
# ─────────────────────────────────────────────────────────────
POST {{base_url}}/api/batch/folders/copy
Authorization: Bearer {{token}}
Content-Type: application/json
{
"folder_ids": ["{{source_folder_id}}"],
"target_folder_id": "{{target_folder_id}}"
}
HTTP 200
[Captures]
new_root_folder_id: jsonpath "$.successful[0].new_root_folder_id"
[Asserts]
jsonpath "$.stats.successful" == 1
jsonpath "$.stats.failed" == 0
jsonpath "$.successful[0].new_root_folder_id" isString
jsonpath "$.successful[0].folders_copied" >= 1
jsonpath "$.successful[0].files_copied" == 1
# ─────────────────────────────────────────────────────────────
# Step 6 – Verify the copied folder is inside the target folder
# ─────────────────────────────────────────────────────────────
GET {{base_url}}/api/folders/{{target_folder_id}}/resources?resource_types=folder
Authorization: Bearer {{token}}
HTTP 200
[Asserts]
jsonpath "$.items" count == 1
jsonpath "$.items[0].resource.id" == "{{new_root_folder_id}}"
jsonpath "$.items[0].resource.name" == "hurl-copy-source"
GET {{base_url}}/api/folders/{{target_folder_id}}/resources?resource_types=file
Authorization: Bearer {{token}}
HTTP 200
[Asserts]
jsonpath "$.items" count == 0
# ─────────────────────────────────────────────────────────────
# Step 7 – Verify the copied file is inside the copied folder
# ─────────────────────────────────────────────────────────────
GET {{base_url}}/api/files?folder_id={{new_root_folder_id}}
Authorization: Bearer {{token}}
HTTP 200
[Asserts]
jsonpath "$" count == 1
jsonpath "$[0].name" == "{{source_file_name}}"
jsonpath "$[0].id" != "{{source_file_id}}"
# ─────────────────────────────────────────────────────────────
# Step 8 – Verify the original source folder is unchanged
# ─────────────────────────────────────────────────────────────
GET {{base_url}}/api/files?folder_id={{source_folder_id}}
Authorization: Bearer {{token}}
HTTP 200
[Asserts]
jsonpath "$" count == 1
jsonpath "$[0].id" == "{{source_file_id}}"
# ─────────────────────────────────────────────────────────────
# Step 9 – Cleanup: delete the copied folder tree
# ─────────────────────────────────────────────────────────────
DELETE {{base_url}}/api/folders/{{new_root_folder_id}}
Authorization: Bearer {{token}}
HTTP 204
# ─────────────────────────────────────────────────────────────
# Step 10 – Verify source folder and file are still intact
# ─────────────────────────────────────────────────────────────
GET {{base_url}}/api/folders/{{source_folder_id}}
Authorization: Bearer {{token}}
HTTP 200
[Asserts]
jsonpath "$.id" == "{{source_folder_id}}"
jsonpath "$.name" == "hurl-copy-source"
GET {{base_url}}/api/files?folder_id={{source_folder_id}}
Authorization: Bearer {{token}}
HTTP 200
[Asserts]
jsonpath "$" count == 1
jsonpath "$[0].id" == "{{source_file_id}}"
# ─────────────────────────────────────────────────────────────
# Step 11 – Cleanup: delete source file and folders
# ─────────────────────────────────────────────────────────────
DELETE {{base_url}}/api/files/{{source_file_id}}
Authorization: Bearer {{token}}
HTTP 204
DELETE {{base_url}}/api/folders/{{source_folder_id}}
Authorization: Bearer {{token}}
HTTP 204
DELETE {{base_url}}/api/folders/{{target_folder_id}}
Authorization: Bearer {{token}}
HTTP 204