41 lines
1.1 KiB
JavaScript
41 lines
1.1 KiB
JavaScript
|
|
import { describe, expect, it } from 'vitest';
|
||
|
|
import { resolveVisualCandidates } from '../../lib/card-visual-match.js';
|
||
|
|
|
||
|
|
describe('resolveVisualCandidates', () => {
|
||
|
|
const baseCard = {
|
||
|
|
id: 1,
|
||
|
|
name: 'Lightning Bolt',
|
||
|
|
set_name: 'Alpha',
|
||
|
|
set_code: 'lea',
|
||
|
|
card_number: '161',
|
||
|
|
game: 'mtg',
|
||
|
|
rarity: 'common',
|
||
|
|
image_url: 'https://example.com/bolt.jpg',
|
||
|
|
card_type: 'Instant',
|
||
|
|
mana_cost: '{R}',
|
||
|
|
power: null,
|
||
|
|
};
|
||
|
|
|
||
|
|
it('escalates when no candidates remain', () => {
|
||
|
|
expect(resolveVisualCandidates([]).type).toBe('escalate');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('auto-matches a clear visual winner', () => {
|
||
|
|
const result = resolveVisualCandidates([
|
||
|
|
{ ...baseCard, sim: 0.9 },
|
||
|
|
{ ...baseCard, id: 2, sim: 0.7 },
|
||
|
|
]);
|
||
|
|
expect(result.type).toBe('matched');
|
||
|
|
expect(result.card.id).toBe(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('opens disambiguation when top matches are close', () => {
|
||
|
|
const result = resolveVisualCandidates([
|
||
|
|
{ ...baseCard, sim: 0.8 },
|
||
|
|
{ ...baseCard, id: 2, set_name: 'Beta', sim: 0.77 },
|
||
|
|
]);
|
||
|
|
expect(result.type).toBe('disambiguation');
|
||
|
|
expect(result.matches).toHaveLength(2);
|
||
|
|
});
|
||
|
|
});
|