You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.3 KiB
65 lines
2.3 KiB
import { describe, expect, it } from 'vitest' |
|
import { |
|
eventMatchesGeneralSearchQuery, |
|
generalSearchHaystack, |
|
generalSearchQueryTerms, |
|
normalizeGeneralSearchQuery |
|
} from '@/lib/general-search-text-match' |
|
import type { Event } from 'nostr-tools' |
|
|
|
function ev(partial: Partial<Event> & Pick<Event, 'kind' | 'content'>): Event { |
|
return { |
|
id: 'a'.repeat(64), |
|
pubkey: 'b'.repeat(64), |
|
created_at: 1_700_000_000, |
|
sig: 'sig', |
|
tags: [], |
|
...partial |
|
} |
|
} |
|
|
|
describe('normalizeGeneralSearchQuery', () => { |
|
it('strips outer double quotes and collapses whitespace', () => { |
|
expect(normalizeGeneralSearchQuery('"Nostr is a thankless protocol."')).toBe( |
|
'Nostr is a thankless protocol.' |
|
) |
|
expect(normalizeGeneralSearchQuery(' foo bar ')).toBe('foo bar') |
|
}) |
|
|
|
it('extracts significant terms without punctuation', () => { |
|
expect(generalSearchQueryTerms('"thankless protocol"')).toEqual(['thankless', 'protocol']) |
|
}) |
|
}) |
|
|
|
describe('eventMatchesGeneralSearchQuery', () => { |
|
it('matches content and ignores pubkey/id substrings', () => { |
|
const note = ev({ kind: 1, content: 'Hello bitcoin world' }) |
|
expect(eventMatchesGeneralSearchQuery(note, 'bitcoin')).toBe(true) |
|
expect(eventMatchesGeneralSearchQuery(note, note.pubkey.slice(0, 8))).toBe(false) |
|
}) |
|
|
|
it('matches title and summary tags', () => { |
|
const article = ev({ |
|
kind: 30023, |
|
content: 'body', |
|
tags: [ |
|
['title', 'My Article Title'], |
|
['summary', 'A short summary here'] |
|
] |
|
}) |
|
expect(eventMatchesGeneralSearchQuery(article, 'article title')).toBe(true) |
|
expect(eventMatchesGeneralSearchQuery(article, 'short summary')).toBe(true) |
|
expect(generalSearchHaystack(article)).toContain('my article title') |
|
}) |
|
|
|
it('matches multi-word queries when all words appear in haystack', () => { |
|
const note = ev({ kind: 1, content: 'foo bar baz' }) |
|
expect(eventMatchesGeneralSearchQuery(note, 'foo baz')).toBe(true) |
|
expect(eventMatchesGeneralSearchQuery(note, 'foo missing')).toBe(false) |
|
}) |
|
|
|
it('matches quoted phrase against note content', () => { |
|
const note = ev({ kind: 1, content: 'Nostr is a thankless protocol.' }) |
|
expect(eventMatchesGeneralSearchQuery(note, '"Nostr is a thankless protocol."')).toBe(true) |
|
}) |
|
})
|
|
|