SPB Git forge

spb/cancerindex

Public
37commits 1branches 0releases
2.9 MBsize
maindefault branch
10 days agolast push
TypeScript 97.2% SQL 1.5% CSS 0.6% JavaScript 0.5%
2.4 KB · 51 lines typescript
Raw Blame History
1import { describe, it, expect } from 'vitest';2import { matchFromTier, compareHits, sortHits, type RankedHit } from '@/lib/search-util';34const hit = (title: string, tier: number, score: number, type: RankedHit['type'] = 'cancer'): RankedHit => ({ type, title, tier, score });56describe('matchFromTier', () => {7  it('maps tiers to match labels', () => {8    expect(matchFromTier(0, 'cancer')).toBe('exact');9    expect(matchFromTier(2, 'drug')).toBe('prefix');10    expect(matchFromTier(3, 'cancer')).toBe('trigram');11    expect(matchFromTier(7, 'cancer')).toBe('trigram');12  });13  it('calls tier 1 an identifier for code-like entities and an alias otherwise', () => {14    expect(matchFromTier(1, 'gene')).toBe('identifier');15    expect(matchFromTier(1, 'trial')).toBe('identifier');16    expect(matchFromTier(1, 'publication')).toBe('identifier');17    expect(matchFromTier(1, 'variant')).toBe('identifier');18    expect(matchFromTier(1, 'cancer')).toBe('alias');19    expect(matchFromTier(1, 'drug')).toBe('alias');20    expect(matchFromTier(1, 'source')).toBe('alias');21  });22});2324describe('compareHits / sortHits', () => {25  it('orders exact > alias/identifier > prefix > trigram regardless of score', () => {26    const sorted = sortHits([hit('Glioma', 3, 0.99), hit('Glioblastoma', 0, 0.2), hit('GBM', 1, 0.5), hit('Glioblastoma multiforme', 2, 0.9)]);27    expect(sorted.map((h) => h.title)).toEqual(['Glioblastoma', 'GBM', 'Glioblastoma multiforme', 'Glioma']);28  });29  it('breaks tier ties by similarity, descending', () => {30    const sorted = sortHits([hit('B', 3, 0.3), hit('A', 3, 0.9), hit('C', 3, 0.6)]);31    expect(sorted.map((h) => h.title)).toEqual(['A', 'C', 'B']);32  });33  it('breaks remaining ties alphabetically, case-insensitively', () => {34    const sorted = sortHits([hit('beta', 2, 0.5), hit('Alpha', 2, 0.5), hit('gamma', 2, 0.5)]);35    expect(sorted.map((h) => h.title)).toEqual(['Alpha', 'beta', 'gamma']);36  });37  it('is a proper comparator (antisymmetric, zero for equal keys)', () => {38    const a = hit('Same', 1, 0.5, 'gene');39    const b = hit('Same', 1, 0.5, 'drug');40    expect(compareHits(a, b)).toBe(0);41    const c = hit('Other', 0, 0.1);42    expect(Math.sign(compareHits(a, c))).toBe(-Math.sign(compareHits(c, a)));43  });44  it('does not mutate the input', () => {45    const input = [hit('b', 3, 0.1), hit('a', 0, 0.1)];46    const copy = [...input];47    sortHits(input);48    expect(input).toEqual(copy);49  });50});51