test(Lactose): cover asset restore flows in REST Client suite
This commit is contained in:
@@ -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
|
||||
# =============================================================================
|
||||
|
||||
Reference in New Issue
Block a user