← Back to Kontasks
Konimage Test Suite Explained
Detailed explanation of konimage's 25 regression tests across 4 test files
Output
🖼️ Konimage Test Suite
25 tests across 4 test files ensure the image processing service works correctly.
📁 cache_test.ts (10 tests)
Tests the image caching system that stores original images from PropertyMe.
| Test | What It Checks |
|---|---|
| getCachePaths | Generates correct paths like ./pmeimages/test123-1.jpg |
| initCache | Creates pmeimages/ and metadata/ directories |
| getCachedOriginal | Returns miss for non-existent images, hit after caching |
| cacheOriginal | Stores image + metadata (etag, last-modified, source URL) |
| readCachedOriginal | Returns buffer with valid JPEG magic bytes (FF D8) |
| clearListingCache | Removes all images for a listing (returns count cleared) |
| getCacheStats | Returns counts and total size in bytes |
📁 transform_test.ts (5 tests)
Tests ImageMagick-based image resizing and cropping.
| Test | What It Checks |
|---|---|
| resizes to width | 500px target produces valid smaller JPEG |
| outputs JPEG | Checks FF D8 header and FF D9 trailer |
| handles crop mode | 400x400 crop produces valid JPEG |
| smaller output | Resized to 100px is smaller than original |
| no scale up | 10000px target doesn't upscale small images |
📁 params_test.ts (6 tests)
Tests URL parameter parsing and authentication.
| Test | What It Checks |
|---|---|
| resize mode | Parses imageurl, uniqueid, imagenumber, forces width=2000 |
| fetch mode | No key required for internal khost URLs |
| invalid key | Returns A12 error for bad keys |
| daily key | Accepts today's UTC date as key (e.g., "01") |
| ping mode | Health check endpoint with key=99 |
| arrayresize | Batch processing with JSON array of images |
📁 store_test.ts (3 tests)
Tests final image storage to disk.
| Test | What It Checks |
|---|---|
| stores valid JPEG | Writes file and returns URL like http://khost/images/id-1-2000.jpg |
| rejects invalid | Throws "corrupted - invalid JPEG header" for non-JPEG data |
| creates directory | Works even if images/ doesn't exist |
Test Fixtures
Tests use a minimal 1x1 pixel JPEG (hardcoded bytes) and test-fixtures/test-image.jpg for real resize testing. The minimal JPEG is just the bare minimum valid JPEG structure (SOI, APP0, DQT, SOF0, DHT, SOS, EOI markers).
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Created
1 Jan 2026, 11:39 pm
Updated
2 Jan 2026, 3:10 pm
Created By
claude
Raw Data
{
"id": "16d2287c-6476-4b05-b132-756a2a0054cd",
"type": "general",
"status": "completed",
"title": "Konimage Test Suite Explained",
"description": "Detailed explanation of konimage's 25 regression tests across 4 test files",
"context": {
"output": "<div style=\"background:#1e1e1e;color:#e0e0e0;padding:20px;border-radius:8px;font-family:'Segoe UI','Helvetica Neue',sans-serif;\">\n<h2 style=\"color:#fff;margin:0 0 16px 0;\">🖼️ Konimage Test Suite</h2>\n\n<p style=\"color:#b0b0b0;line-height:1.6;margin-bottom:20px;\"><strong style=\"color:#98c379;\">25 tests</strong> across 4 test files ensure the image processing service works correctly.</p>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#61afef;margin:0 0 12px 0;\">📁 cache_test.ts (10 tests)</h3>\n<p style=\"color:#7f848e;margin:0 0 8px 0;\">Tests the image caching system that stores original images from PropertyMe.</p>\n<table style=\"width:100%;border-collapse:collapse;\">\n<tr style=\"border-bottom:1px solid #444;\">\n<th style=\"text-align:left;padding:8px;color:#c678dd;\">Test</th>\n<th style=\"text-align:left;padding:8px;color:#c678dd;\">What It Checks</th>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">getCachePaths</td>\n<td style=\"padding:8px;\">Generates correct paths like <code style=\"background:#333;padding:2px 4px;border-radius:3px;\">./pmeimages/test123-1.jpg</code></td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">initCache</td>\n<td style=\"padding:8px;\">Creates <code style=\"background:#333;padding:2px 4px;border-radius:3px;\">pmeimages/</code> and <code style=\"background:#333;padding:2px 4px;border-radius:3px;\">metadata/</code> directories</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">getCachedOriginal</td>\n<td style=\"padding:8px;\">Returns miss for non-existent images, hit after caching</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">cacheOriginal</td>\n<td style=\"padding:8px;\">Stores image + metadata (etag, last-modified, source URL)</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">readCachedOriginal</td>\n<td style=\"padding:8px;\">Returns buffer with valid JPEG magic bytes (FF D8)</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">clearListingCache</td>\n<td style=\"padding:8px;\">Removes all images for a listing (returns count cleared)</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e5c07b;\">getCacheStats</td>\n<td style=\"padding:8px;\">Returns counts and total size in bytes</td>\n</tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#61afef;margin:0 0 12px 0;\">📁 transform_test.ts (5 tests)</h3>\n<p style=\"color:#7f848e;margin:0 0 8px 0;\">Tests ImageMagick-based image resizing and cropping.</p>\n<table style=\"width:100%;border-collapse:collapse;\">\n<tr style=\"border-bottom:1px solid #444;\">\n<th style=\"text-align:left;padding:8px;color:#c678dd;\">Test</th>\n<th style=\"text-align:left;padding:8px;color:#c678dd;\">What It Checks</th>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">resizes to width</td>\n<td style=\"padding:8px;\">500px target produces valid smaller JPEG</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">outputs JPEG</td>\n<td style=\"padding:8px;\">Checks FF D8 header and FF D9 trailer</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">handles crop mode</td>\n<td style=\"padding:8px;\">400x400 crop produces valid JPEG</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">smaller output</td>\n<td style=\"padding:8px;\">Resized to 100px is smaller than original</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e5c07b;\">no scale up</td>\n<td style=\"padding:8px;\">10000px target doesn't upscale small images</td>\n</tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#61afef;margin:0 0 12px 0;\">📁 params_test.ts (6 tests)</h3>\n<p style=\"color:#7f848e;margin:0 0 8px 0;\">Tests URL parameter parsing and authentication.</p>\n<table style=\"width:100%;border-collapse:collapse;\">\n<tr style=\"border-bottom:1px solid #444;\">\n<th style=\"text-align:left;padding:8px;color:#c678dd;\">Test</th>\n<th style=\"text-align:left;padding:8px;color:#c678dd;\">What It Checks</th>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">resize mode</td>\n<td style=\"padding:8px;\">Parses imageurl, uniqueid, imagenumber, forces width=2000</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">fetch mode</td>\n<td style=\"padding:8px;\">No key required for internal <code style=\"background:#333;padding:2px 4px;border-radius:3px;\">khost</code> URLs</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">invalid key</td>\n<td style=\"padding:8px;\">Returns A12 error for bad keys</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">daily key</td>\n<td style=\"padding:8px;\">Accepts today's UTC date as key (e.g., \"01\")</td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">ping mode</td>\n<td style=\"padding:8px;\">Health check endpoint with key=99</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e5c07b;\">arrayresize</td>\n<td style=\"padding:8px;\">Batch processing with JSON array of images</td>\n</tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#61afef;margin:0 0 12px 0;\">📁 store_test.ts (3 tests)</h3>\n<p style=\"color:#7f848e;margin:0 0 8px 0;\">Tests final image storage to disk.</p>\n<table style=\"width:100%;border-collapse:collapse;\">\n<tr style=\"border-bottom:1px solid #444;\">\n<th style=\"text-align:left;padding:8px;color:#c678dd;\">Test</th>\n<th style=\"text-align:left;padding:8px;color:#c678dd;\">What It Checks</th>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">stores valid JPEG</td>\n<td style=\"padding:8px;\">Writes file and returns URL like <code style=\"background:#333;padding:2px 4px;border-radius:3px;\">http://khost/images/id-1-2000.jpg</code></td>\n</tr>\n<tr style=\"border-bottom:1px solid #333;\">\n<td style=\"padding:8px;color:#e5c07b;\">rejects invalid</td>\n<td style=\"padding:8px;\">Throws \"corrupted - invalid JPEG header\" for non-JPEG data</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e5c07b;\">creates directory</td>\n<td style=\"padding:8px;\">Works even if <code style=\"background:#333;padding:2px 4px;border-radius:3px;\">images/</code> doesn't exist</td>\n</tr>\n</table>\n</div>\n\n<div style=\"background:#252525;border-left:4px solid #61afef;padding:12px 16px;border-radius:0 6px 6px 0;\">\n<h4 style=\"color:#61afef;margin:0 0 8px 0;\">Test Fixtures</h4>\n<p style=\"margin:0;color:#b0b0b0;\">Tests use a minimal 1x1 pixel JPEG (hardcoded bytes) and <code style=\"background:#333;padding:2px 4px;border-radius:3px;\">test-fixtures/test-image.jpg</code> for real resize testing. The minimal JPEG is just the bare minimum valid JPEG structure (SOI, APP0, DQT, SOF0, DHT, SOS, EOI markers).</p>\n</div>\n\n</div>",
"requestedAt": "2026-01-01T13:34:00.000Z",
"requestId": "753118c3-048b-41fe-944a-4fd0711a491c"
},
"createdBy": "claude",
"createdAt": "2026-01-01T13:39:37.926Z",
"updatedAt": "2026-01-02T05:10:54.072Z",
"requestId": "753118c3-048b-41fe-944a-4fd0711a491c"
}