test(Lactose): cover asset restore flows in REST Client suite

This commit is contained in:
2026-08-22 00:47:30 +02:00
parent c95728b097
commit 453507a3ed
+144
View File
@@ -2178,6 +2178,150 @@ GET {{WepApiTest_HostAddress}}/api/asset/{{testAssetId}}
}
%}
# ---------------------------------------------------------------------------
# Restore soft-deleted assets (issue #198)
# ---------------------------------------------------------------------------
### 131.1 Admin soft-deletes the test asset (IsDeleted = true)
POST {{WepApiTest_HostAddress}}/api/asset
Authorization: Bearer {{admin_token}}
Content-Type: application/json
{
"ids": ["{{testAssetId}}"],
"data": { "isDeleted": true }
}
> {%
var hasAssets = client.global.get("hasAssets");
if (hasAssets === "true") {
client.test("Soft-delete asset via IsDeleted flag", function () {
client.assert(response.status === 200)
});
} else {
client.test("No assets — skipping soft-delete test", function () {
client.assert(true)
});
}
%}
### 131.2 Admin: deletedOnly search lists the soft-deleted asset
GET {{WepApiTest_HostAddress}}/api/asset?deletedOnly=true&page=0&pageSize=50&includeCount=true
Authorization: Bearer {{admin_token}}
> {%
var hasAssets = client.global.get("hasAssets");
if (hasAssets === "true") {
client.test("Admin sees deleted assets in deletedOnly search", function () {
client.assert(response.status === 200);
var total = parseInt(response.headers.valueOf("X-Total-Count"));
client.assert(total >= 1, "Expected at least one deleted asset but got total " + total);
});
} else {
client.test("No assets — skipping deletedOnly search test", function () {
client.assert(true)
});
}
%}
### 131.3 Regular user: deletedOnly search returns nothing (R7 ? users never see deleted)
GET {{WepApiTest_HostAddress}}/api/asset?deletedOnly=true&page=0&pageSize=50&includeCount=true
Authorization: Bearer {{user_token}}
> {%
client.test("Regular user gets empty deletedOnly results", function () {
client.assert(response.status === 200);
client.assert(response.body.length === 0, "Expected no deleted assets for regular user");
});
%}
### 131.4 Curator: deletedOnly search succeeds (scoped to own uploads by R7)
GET {{WepApiTest_HostAddress}}/api/asset?deletedOnly=true&page=0&pageSize=50&includeCount=true
Authorization: Bearer {{curator_token}}
> {%
client.test("Curator can query deletedOnly search", function () {
client.assert(response.status === 200)
});
%}
### 131.5 Anonymous: restore attempt should 401
POST {{WepApiTest_HostAddress}}/api/asset/{{testAssetId}}
Content-Type: application/json
{
"isDeleted": false
}
> {%
client.test("Anonymous restore attempt is rejected", function () {
client.assert([401, 403].indexOf(response.status) !== -1, "Expected 401/403 but got " + response.status);
});
%}
### 131.6 Regular user: restore attempt should 403
POST {{WepApiTest_HostAddress}}/api/asset/{{testAssetId}}
Authorization: Bearer {{user_token}}
Content-Type: application/json
{
"isDeleted": false
}
> {%
client.test("Regular user restore attempt is rejected", function () {
client.assert(response.status === 403, "Expected 403 but got " + response.status);
});
%}
### 131.7 Admin: bulk restore via update endpoint (IsDeleted = false)
# Assets whose source files are missing on disk are reported in skippedMissingFile
# instead of being restored; a bare 200 therefore always indicates a valid outcome.
POST {{WepApiTest_HostAddress}}/api/asset
Authorization: Bearer {{admin_token}}
Content-Type: application/json
{
"ids": ["{{testAssetId}}"],
"data": { "isDeleted": false }
}
> {%
var hasAssets = client.global.get("hasAssets");
if (hasAssets === "true") {
client.test("Bulk restore reports restored/skipped lists", function () {
client.assert(response.status === 200);
client.assert(jsonPath(response.body, "$.restored") != null, "Missing 'restored' list");
client.assert(jsonPath(response.body, "$.skippedMissingFile") != null, "Missing 'skippedMissingFile' list");
});
var restored = response.body.restored;
client.global.set("assetRestored", restored != null && restored.indexOf(client.global.get("testAssetId")) !== -1 ? "true" : "false");
} else {
client.global.set("assetRestored", "false");
client.test("No assets — skipping bulk restore test", function () {
client.assert(true)
});
}
%}
### 131.8 Verify restored asset is live again (skipped when its file was missing on disk)
GET {{WepApiTest_HostAddress}}/api/asset/{{testAssetId}}
Authorization: Bearer {{admin_token}}
> {%
var assetRestored = client.global.get("assetRestored");
if (assetRestored === "true") {
client.test("Restored asset no longer reports DeletedAt", function () {
client.assert(response.status === 200);
client.assert(response.body.deletedAt === null, "deletedAt should be cleared after restore");
});
} else {
client.test("Asset not restored (missing file) — skipping verification", function () {
client.assert(true)
});
}
%}
# =============================================================================
# CLEANUP
# =============================================================================