feat(tickets): contrôle « Trier par… » dans la barre de facettes (#21)

Ajoute le sélecteur de tri dans TicketFacetsBar et propage le critère
via useTicketSearch jusqu'à TicketsPanel et TicketPicker, sur le contrat
de tri backend (e523f44). Couvre le tri par les tests tickets et
TicketPicker.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 11:54:28 +02:00
parent e523f44425
commit bd73fd79bd
6 changed files with 179 additions and 5 deletions

View File

@ -137,6 +137,49 @@ describe("TicketPicker (#18)", () => {
expect(screen.getByText("Bravo task")).toBeTruthy();
});
it("sorts the results via the « Trier par… » control (#21)", async () => {
const listSpy = vi.spyOn(ticket, "list");
await seedTrio(ticket);
renderPicker(ticket);
await screen.findByText("Alpha bug");
// The sort control is present in the picker too (shared TicketFacetsBar).
const sortBy = screen.getByLabelText("sort tickets by");
fireEvent.change(sortBy, { target: { value: "title" } });
await waitFor(() =>
expect(listSpy.mock.calls.at(-1)?.[1]?.sort).toEqual({
field: "title",
direction: "asc",
}),
);
// Ascending by title ⇒ Alpha before Charlie in the DOM.
await waitFor(() => {
const rendered = screen
.getAllByText(/Alpha bug|Bravo task|Charlie chore/)
.map((n) => n.textContent);
expect(rendered.indexOf("Alpha bug")).toBeLessThan(
rendered.indexOf("Charlie chore"),
);
});
// Flip to descending ⇒ Charlie now precedes Alpha.
fireEvent.click(screen.getByLabelText("sort direction ascending"));
await waitFor(() =>
expect(listSpy.mock.calls.at(-1)?.[1]?.sort).toEqual({
field: "title",
direction: "desc",
}),
);
await waitFor(() => {
const rendered = screen
.getAllByText(/Alpha bug|Bravo task|Charlie chore/)
.map((n) => n.textContent);
expect(rendered.indexOf("Charlie chore")).toBeLessThan(
rendered.indexOf("Alpha bug"),
);
});
});
it("debounced text search narrows the list", async () => {
await seedTrio(ticket);
renderPicker(ticket);