feat: gitea: queries
runner nix smoke / nix label and flake smoke (push) Failing after 1m16s

This commit is contained in:
2026-09-29 17:23:48 +00:00
parent 3f7856b4aa
commit c93dee27b3
10 changed files with 686 additions and 3 deletions
@@ -0,0 +1,48 @@
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');
});
});