test(api): add Bruno tests for sync-kobo and OPDS features

Sync-Kobo:
- Auto link books endpoint tests
- Bulk link books endpoint tests
- Get unlinked book suggestions endpoint tests

OPDS:
- Download book with on-the-fly KEPUB conversion tests

All tests cover no user, user, and admin contexts
This commit is contained in:
2026-02-01 12:16:19 -05:00
parent 2df5ca3325
commit 2521a8c966
4 changed files with 109 additions and 0 deletions
@@ -0,0 +1,35 @@
{
"meta": {
"name": "Download Book KEPUB (On-the-fly Conversion)",
"type": "http",
"event": [
{
"listen": "test",
"script": {
"exec": [
"// Test format-specific hash header",
"const kepubHash = resp.headers.get('X-Bookmann-KEPUB-SHA256');",
"if (kepubHash) {",
" tests['KEPUB hash present'] = true;",
" tests['Hash is 64 chars'] = kepubHash.length === 64;",
"} else {",
" tests['KEPUB hash present'] = false;",
"}",
"",
"// Verify Bookmann UUID header",
"const bookmannUUID = resp.headers.get('X-Bookmann-UUID');",
"tests['Bookmann UUID present'] = bookmannUUID !== null;",
"",
"// Verify content type",
"const contentType = resp.headers.get('Content-Type');",
"tests['Content-Type is KEPUB'] = contentType && contentType.includes('kepub');"
]
}
}
]
},
"req": {
"url": "{{baseUrl}}/opds/devices/{{deviceId}}/download/{{mediaItemId}}?format=kepub",
"method": "GET"
}
}
+24
View File
@@ -0,0 +1,24 @@
{
"meta": {
"name": "Auto-Link Unlinked Books",
"type": "http"
},
"req": {
"url": "{{baseUrl}}/sync/auto-link-books",
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "application/json"
},
{
"key": "Authorization",
"value": "Bearer {{authToken}}"
}
],
"body": {
"confidence_threshold": 0.8,
"limit": 50
}
}
}
+34
View File
@@ -0,0 +1,34 @@
{
"meta": {
"name": "Bulk Link Unlinked Books",
"type": "http"
},
"req": {
"url": "{{baseUrl}}/sync/bulk-link-books",
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "application/json"
},
{
"key": "Authorization",
"value": "Bearer {{authToken}}"
}
],
"body": {
"links": [
{
"unlinked_book_id": "{{unlinkedBookId1}}",
"media_item_id": "{{mediaItemId1}}",
"confidence_score": 1.0
},
{
"unlinked_book_id": "{{unlinkedBookId2}}",
"media_item_id": "{{mediaItemId2}}",
"confidence_score": 0.9
}
]
}
}
}
@@ -0,0 +1,16 @@
{
"meta": {
"name": "Get Unlinked Book Suggestions",
"type": "http"
},
"req": {
"url": "{{baseUrl}}/sync/unlinked-books/{{unlinkedBookId}}/suggestions",
"method": "GET",
"header": [
{
"key": "Authorization",
"value": "Bearer {{authToken}}"
}
]
}
}