test(api): read the DTO from the folder listing, not the download route

GET /api/files/{id} is the download route — it returned the PNG bytes,
so the jsonpath capture failed on a UTF-8 decode. /{id}/metadata is the
EXIF endpoint and carries no FileDto either. Listing the folder gives
the DTO, and since the folder holds exactly this one file, count == 1
also proves the WebDAV PUT overwrote in place rather than creating a
second file beside it.

Also drops an unused bytes capture and records why the body is not
asserted after the overwrite: the moka tier is keyed on file_id and
invalidated from the spawned task in on_file_updated, so a request
landing first sees the previous bytes under the new ETag. Asserting on
bytes would be a race.
This commit is contained in:
Edouard Vanbelle
2026-08-25 00:07:09 +02:00
parent 19a8186c66
commit 2c0ba37290
+17 -5
View File
@@ -81,7 +81,6 @@ Authorization: Bearer {{token}}
HTTP 200
[Captures]
etag_before: header "ETag"
thumb_before: bytes
[Asserts]
header "Cache-Control" contains "immutable"
@@ -109,15 +108,22 @@ status < 300
# Same file row, different content.
GET {{base_url}}/api/files/{{file_id}}
#
# Listed rather than fetched by id: `/api/files/{id}` is the DOWNLOAD
# route (it returns the image bytes) and `/{id}/metadata` is the EXIF
# endpoint — neither carries the FileDto. The folder holds exactly this
# one file, so `count == 1` also proves the PUT overwrote in place
# instead of creating a second file beside it.
GET {{base_url}}/api/files?folder_id={{folder_id}}
Authorization: Bearer {{token}}
HTTP 200
[Captures]
hash_after: jsonpath "$.content_hash"
hash_after: jsonpath "$[0].content_hash"
[Asserts]
jsonpath "$.id" == "{{file_id}}"
jsonpath "$.content_hash" != "{{hash_before}}"
jsonpath "$" count == 1
jsonpath "$[0].id" == "{{file_id}}"
jsonpath "$[0].content_hash" != "{{hash_before}}"
# ─────────────────────────────────────────────────────────────
@@ -126,6 +132,12 @@ jsonpath "$.content_hash" != "{{hash_before}}"
# This is the assertion the file exists for. With the id-keyed ETag it was
# byte-identical to `etag_before`, and the next request would have been
# answered 304 from cache — serving the OLD image indefinitely.
#
# Deliberately asserts the ETag only, not that the BODY changed. The moka
# tier is still keyed on file_id and is invalidated from the spawned task
# in `on_file_updated`, so a request landing before that task runs gets the
# previous bytes under the new ETag. Asserting on bytes here would be a
# race; the incoherence itself is tracked separately.
# ─────────────────────────────────────────────────────────────
GET {{base_url}}/api/files/{{file_id}}/thumbnail/preview
Authorization: Bearer {{token}}