lib/collection-filters.test.ts
Rama main · réplica de lectura del repositorio original.
import { feedbackNormalFiltersForDestination, feedbackQueryOptions } from "./feedback-query";
import { describe, expect, it } from "vitest";
import { collectionFilterParams, matchesCollectionFilters, matchesFeedbackFilters, readCollectionFilters } from "./collection-filters";
const feedback = { objective_id: "goal-a", category_ids: ["bug"], author_id: "visitor-a", is_public: false, source: "api", review_state: "published" };
describe("feedback property filters", () => {
it("combines existing feedback properties without reading linked issue properties", () => {
expect(matchesFeedbackFilters(feedback, { objective: ["goal-a"], category: ["feature", "bug"], author: ["visitor-a"], visibility: ["private"], source: ["api"], review: ["published"] })).toBe(true);
for (const filters of [{ objective: ["other"] }, { category: ["feature"] }, { author: [null] }, { visibility: ["public"] }, { source: ["internal"] }, { review: ["pending"] }]) {
expect(matchesFeedbackFilters(feedback, filters)).toBe(false);
}
expect(matchesFeedbackFilters({ ...feedback, objective_id: null, author_id: null }, { objective: [null], author: [null] })).toBe(true);
});
it("round-trips a filtered objective destination and preserves unrelated selections", () => {
const filters = { objective: ["goal-a", null], author: ["visitor-a", null], source: ["api"], category: ["bug"] };
const params = collectionFilterParams(filters, new URLSearchParams("post=request-a&objective=old"));
expect(params.get("post")).toBe("request-a");
expect(readCollectionFilters(params)).toEqual(filters);
expect(collectionFilterParams({}, params).toString()).toBe("post=request-a");
});
});
describe("triage property filters", () => {
const issue = { priority: "high", effort: "s", assignee_id: "member", category_ids: ["bug"], objective_id: "goal-a", integration_id: "api-a" };
it("round-trips the not-set effort through the URL", () => {
const params = collectionFilterParams({ effort: [null, "s"] }, new URLSearchParams());
expect(params.getAll("effort")).toEqual(["none", "s"]);
expect(readCollectionFilters(params)).toEqual({ effort: [null, "s"] });
});
it("matches board semantics for multiple values and the current assignee", () => {
expect(matchesCollectionFilters(issue, { priority: ["low", "high"], effort: ["s"], assignee: ["@me"], objective: ["goal-a"], category: ["bug"], integration: ["api-a"] }, "member")).toBe(true);
expect(matchesCollectionFilters(issue, { assignee: ["@me"] }, "other")).toBe(false);
expect(matchesCollectionFilters({ ...issue, effort: null }, { effort: ["s"] }, "member")).toBe(false);
expect(matchesCollectionFilters({ ...issue, effort: null }, { effort: [null] }, "member")).toBe(true);
expect(matchesCollectionFilters(issue, { effort: [null] }, "member")).toBe(false);
expect(matchesCollectionFilters({ category_ids: [] }, { assignee: [null], objective: [null], integration: [null] }, null)).toBe(true);
});
});
it("prepares objective feedback with all statuses and ordinary feedback with unresolved statuses", () => {
const goal = "11111111-1111-4111-8111-111111111111";
expect(feedbackNormalFiltersForDestination(`/projects/p/feedback?objective=${goal}`)).toEqual({ objective: [goal] });
expect(feedbackNormalFiltersForDestination("/projects/p/feedback")).toEqual({ statuses: ["open", "planned", "in_progress"] });
expect(feedbackNormalFiltersForDestination("/projects/p/feedback?post=selected")).toEqual({ statuses: ["open", "planned", "in_progress"] });
expect(feedbackQueryOptions("p").queryKey).toEqual(["feedback", "p", { statuses: ["open", "planned", "in_progress"] }]);
});