import {matchesProjectFilter, parseProjectFilter, projectCardGroupValue} from './repo-projects.ts'; const projectCard = { assignees: ['alice', 'bob'], author: 'carol', labels: ['bug', 'needs review'], milestone: 'Release 1', repository: 'gitea/gitea', state: 'open', status: 'In Progress', title: 'Fix project board', type: 'pull', }; describe('project card filters', () => { test('parses quoted OR values, aliases, repeated terms, and negation', () => { const parsed = parseProjectFilter('label:bug,"needs review" assignee:alice -author:dave is:pr'); expect(parsed.error).toBeUndefined(); expect(parsed.terms).toEqual([ {field: 'label', negated: false, values: ['bug', 'needs review']}, {field: 'assignee', negated: false, values: ['alice']}, {field: 'author', negated: true, values: ['dave']}, {field: 'type', negated: false, values: ['pull']}, ]); expect(matchesProjectFilter(projectCard, parsed.terms)).toBe(true); expect(matchesProjectFilter(projectCard, parseProjectFilter('assignee:alice assignee:bob').terms)).toBe(true); }); test('reports malformed and unknown qualifiers without filtering cards', () => { expect(parseProjectFilter('unknown:value').error).toEqual({kind: 'unknown', value: 'unknown'}); expect(parseProjectFilter('label:"unfinished').error).toEqual({kind: 'unclosed'}); expect(parseProjectFilter('label:').error).toEqual({kind: 'malformed', value: ''}); expect(parseProjectFilter('label:bug,').error).toEqual({kind: 'malformed', value: 'bug,'}); expect(parseProjectFilter('state:pending').error).toEqual({kind: 'malformed', value: 'pending'}); }); test('matches repository aliases, status, state, type, and unqualified titles', () => { expect(matchesProjectFilter(projectCard, parseProjectFilter('repository:gitea/gitea status:"In Progress" state:open type:pull board').terms)).toBe(true); expect(matchesProjectFilter(projectCard, parseProjectFilter('-label:bug').terms)).toBe(false); }); test('uses first multi-valued attribute for a non-duplicated group', () => { expect(projectCardGroupValue(projectCard, 'assignee', 'No value')).toBe('alice'); expect(projectCardGroupValue(projectCard, 'label', 'No value')).toBe('bug'); expect(projectCardGroupValue({...projectCard, labels: []}, 'label', 'No value')).toBe('No value'); }); });