Files
memind/mindspace-image-review.test.mjs
T
john 830f8a4011
Memind CI / Test, build, and release guards (push) Successful in 5m36s
feat(wechat): add service-account push subscriptions and news morning cover delivery
Ship the 10-item numeric subscription loop on WeChat MP, wire schedule delivery
for news/weather/quote/health/finance/tech/knowledge/night/surprise pushes, and
extend news morning draft cover generation plus a one-shot draft push script.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-20 16:15:15 +08:00

100 lines
4.0 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import {
createMindSpaceImageReviewService,
mindSpaceImageReviewInternals,
} from './mindspace-image-review.mjs';
test('image review parses a fenced Qwen JSON response', () => {
const result = mindSpaceImageReviewInternals.parseReviewJson(`\`\`\`json
{"verdict":"reject","relevance_score":0,"observed_subjects":["人物"],"missing_required_elements":["竹海"],"reason":"不符"}
\`\`\``);
assert.deepEqual(result, {
verdict: 'reject', relevanceScore: 0, observedSubjects: ['人物'],
missingRequiredElements: ['竹海'], reason: '不符',
});
});
test('image review sends image bytes and original requirements to Qwen vision', async () => {
let received = null;
const service = createMindSpaceImageReviewService({
llmProviderService: {
async analyzeImagesWithVision(items, prompt, options) {
received = { items, prompt, options };
return JSON.stringify({
verdict: 'pass', relevance_score: 91, observed_subjects: ['竹海'],
missing_required_elements: [], reason: '主体与场景一致',
});
},
},
env: { IMAGE_MAKE_SEMANTIC_REVIEW_MIN_SCORE: '70' },
});
const result = await service.review({
buffer: Buffer.from('webp-image'), mimeType: 'image/webp', purpose: 'hero', prompt: '安吉竹海',
});
assert.equal(result.pass, true);
assert.equal(result.relevanceScore, 91);
assert.equal(received.items[0].data, Buffer.from('webp-image').toString('base64'));
assert.match(received.prompt, /页面首图/);
assert.match(received.prompt, /安吉竹海/);
assert.match(received.prompt, /60/);
assert.equal(received.options.responseFormat, 'json_object');
assert.equal(received.options.disableThinking, true);
});
test('image review uses a lower pass threshold for hero images', async () => {
const service = createMindSpaceImageReviewService({
llmProviderService: {
async analyzeImagesWithVision() {
return '{"verdict":"pass","relevance_score":65,"observed_subjects":["阳光"],"missing_required_elements":[],"reason":"氛围一致"}';
},
},
env: { IMAGE_MAKE_SEMANTIC_REVIEW_MIN_SCORE: '70' },
});
const result = await service.review({
buffer: Buffer.from('image'), mimeType: 'image/webp', purpose: 'hero', prompt: '阳光落在窗台上',
});
assert.equal(result.ok, true);
assert.equal(result.pass, true);
assert.equal(result.minimumScore, 60);
});
test('image review parses Chinese verdict labels and camelCase score fields', () => {
const result = mindSpaceImageReviewInternals.parseReviewJson(
'{"verdict":"通过","relevanceScore":82,"observedSubjects":["窗台"],"missingRequiredElements":[],"reason":"一致"}',
);
assert.equal(result?.verdict, 'pass');
assert.equal(result?.relevanceScore, 82);
});
test('image review rejects a nominal pass below the configured score', async () => {
const service = createMindSpaceImageReviewService({
llmProviderService: {
async analyzeImagesWithVision() {
return '{"verdict":"pass","relevance_score":69,"reason":"仅颜色接近"}';
},
},
env: { IMAGE_MAKE_SEMANTIC_REVIEW_MIN_SCORE: '70' },
});
const result = await service.review({
buffer: Buffer.from('image'), mimeType: 'image/webp', purpose: 'inline_image', prompt: '安吉竹海',
});
assert.equal(result.ok, true);
assert.equal(result.pass, false);
assert.equal(result.minimumScore, 70);
});
test('image review fails closed on missing or malformed Qwen responses', async () => {
for (const response of [null, '不是 JSON']) {
const service = createMindSpaceImageReviewService({
llmProviderService: { async analyzeImagesWithVision() { return response; } },
logger: { warn() {} },
});
const result = await service.review({
buffer: Buffer.from('image'), mimeType: 'image/webp', purpose: 'hero', prompt: '安吉竹海',
});
assert.equal(result.ok, false);
assert.equal(result.code, 'IMAGE_REVIEW_INVALID_RESPONSE');
}
});