48 lines
4.1 KiB
JavaScript
48 lines
4.1 KiB
JavaScript
const { apiSource, dashboardSource } = require('./source-helpers');
|
|
const { readFileSync } = require('fs');
|
|
const { dirname, resolve } = require('path');
|
|
|
|
const root = dirname(__dirname);
|
|
const source = readFileSync(resolve(root, 'js/image-manager.js'), 'utf8');
|
|
const styles = readFileSync(resolve(root, 'css/image-manager.css'), 'utf8');
|
|
const dashboard = dashboardSource();
|
|
|
|
function assertContains(haystack, needle, message) {
|
|
if (!haystack.includes(needle)) {
|
|
throw new Error(message);
|
|
}
|
|
}
|
|
|
|
assertContains(source, 'function mediaDownloadActionHtml(item)', 'Media manager should render a per-image download action.');
|
|
assertContains(source, 'data-action="download"', 'Media manager image actions should include a download link.');
|
|
assertContains(source, 'download="', 'Media manager download action should use the browser download attribute.');
|
|
assertContains(source, 'class="rj-imgmgr-upload-input" accept=".jpg,.jpeg,.png,.webp" multiple', 'Media manager upload input should allow selecting multiple files.');
|
|
assertContains(source, 'function uploadFiles(files)', 'Media manager should route selected and dropped files through multi-file upload handling.');
|
|
assertContains(source, 'uploadFile(file, {', 'Media manager should upload multiple files through the existing single-file API.');
|
|
assertContains(source, 'itemsPerPage: 25', 'Media manager should default pagination to 25 entries.');
|
|
assertContains(source, 'function renderPagination()', 'Media manager should render pagination controls.');
|
|
assertContains(source, 'rj-imgmgr-pagination--top', 'Media manager should render top pagination only when page controls are needed.');
|
|
assertContains(source, 'function canOpenImageGenerator()', 'Media manager should gate the image generator button through config.');
|
|
assertContains(source, 'rj-imgmgr-ai-generator-btn', 'Media manager dropzone should include the optional image generator button.');
|
|
assertContains(source, "config.openImageGenerator('', 'auto')", 'Media manager image generator button should open the dashboard generator.');
|
|
assertContains(source, 'refresh: function ()', 'Media manager should expose a refresh hook for async AI settings updates.');
|
|
assertContains(source, 'function detectTransparency(image)', 'Media manager should inspect rendered images for actual transparency.');
|
|
assertContains(source, "context.getImageData(0, 0, canvas.width, canvas.height)", 'Media manager transparency detection should inspect rendered alpha values.');
|
|
assertContains(source, "surface.classList.toggle('rj-imgmgr-has-transparency', hasTransparency)", 'Media manager should mark only images with transparent pixels.');
|
|
const mediaDataAssignment = source.indexOf('state.data = items.map');
|
|
const folderCountRefresh = source.indexOf('updateFolderUI();', mediaDataAssignment);
|
|
if (mediaDataAssignment < 0 || folderCountRefresh < mediaDataAssignment) {
|
|
throw new Error('Media manager folder counts should refresh after the current media data is assigned.');
|
|
}
|
|
assertContains(styles, '.rj-imgmgr-dropzone--with-ai', 'Media manager dropzone should adapt layout when the AI generator is visible.');
|
|
assertContains(styles, '.rj-imgmgr-ai-generator-btn', 'Media manager should style the image generator button.');
|
|
assertContains(styles, '.rj-imgmgr-pagination-btn', 'Media manager should style pagination buttons.');
|
|
assertContains(styles, '.rj-imgmgr-thumb.rj-imgmgr-has-transparency', 'Media manager should reserve the checkerboard for transparent image surfaces.');
|
|
assertContains(styles, 'background-color: var(--rj-bg-sunken, #f0f0f0);', 'Media manager should use a neutral default thumbnail background.');
|
|
assertContains(dashboard, 'canGenerateImages: function()', 'Dashboard should pass current AI image availability into the media manager.');
|
|
assertContains(dashboard, "openAiImageGenerator(prompt || '', aspectRatio || 'auto')", 'Dashboard should connect media manager to the existing image generator.');
|
|
assertContains(dashboard, 'settingsMediaItemsPerPage', 'Dashboard settings should expose a Media Library page-size field.');
|
|
assertContains(dashboard, 'NbImageManager.refresh();', 'Dashboard should refresh media manager controls when AI settings load.');
|
|
|
|
console.log(JSON.stringify({ ok: true }));
|