49 lines
2.3 KiB
TypeScript
49 lines
2.3 KiB
TypeScript
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');
|
|
});
|
|
});
|