The Appview for the kipclip.com atproto bookmarking service
1/**
2 * Tests for search query parsing with tag: syntax.
3 */
4
5import { assertEquals } from "@std/assert";
6import { parseSearchQuery, toggleTagInQuery } from "../shared/search-query.ts";
7
8// ============================================================================
9// parseSearchQuery
10// ============================================================================
11
12Deno.test("parseSearchQuery - empty string", () => {
13 const result = parseSearchQuery("");
14 assertEquals(result, { tags: [], text: "" });
15});
16
17Deno.test("parseSearchQuery - plain text only", () => {
18 const result = parseSearchQuery("hello world");
19 assertEquals(result, { tags: [], text: "hello world" });
20});
21
22Deno.test("parseSearchQuery - single tag", () => {
23 const result = parseSearchQuery("tag:swift");
24 assertEquals(result, { tags: ["swift"], text: "" });
25});
26
27Deno.test("parseSearchQuery - multiple tags", () => {
28 const result = parseSearchQuery("tag:swift tag:ios");
29 assertEquals(result, { tags: ["swift", "ios"], text: "" });
30});
31
32Deno.test("parseSearchQuery - mixed tags and text", () => {
33 const result = parseSearchQuery("tag:swift tutorials");
34 assertEquals(result, { tags: ["swift"], text: "tutorials" });
35});
36
37Deno.test("parseSearchQuery - case-insensitive prefix", () => {
38 const result = parseSearchQuery("TAG:Swift");
39 assertEquals(result, { tags: ["swift"], text: "" });
40});
41
42Deno.test("parseSearchQuery - deduplicates tags", () => {
43 const result = parseSearchQuery("tag:swift tag:SWIFT");
44 assertEquals(result, { tags: ["swift"], text: "" });
45});
46
47Deno.test("parseSearchQuery - tag: with no value is literal text", () => {
48 const result = parseSearchQuery("tag:");
49 assertEquals(result, { tags: [], text: "tag:" });
50});
51
52Deno.test("parseSearchQuery - tags interspersed with text", () => {
53 const result = parseSearchQuery("how to tag:swift learn tag:ios today");
54 assertEquals(result, { tags: ["swift", "ios"], text: "how to learn today" });
55});
56
57// ============================================================================
58// toggleTagInQuery
59// ============================================================================
60
61Deno.test("toggleTagInQuery - add to empty query", () => {
62 assertEquals(toggleTagInQuery("", "swift"), "tag:swift");
63});
64
65Deno.test("toggleTagInQuery - add to existing text (prepend)", () => {
66 assertEquals(toggleTagInQuery("tutorials", "swift"), "tag:swift tutorials");
67});
68
69Deno.test("toggleTagInQuery - remove existing tag", () => {
70 assertEquals(toggleTagInQuery("tag:swift tutorials", "swift"), "tutorials");
71});
72
73Deno.test("toggleTagInQuery - case-insensitive removal", () => {
74 assertEquals(toggleTagInQuery("tag:swift tutorials", "Swift"), "tutorials");
75});
76
77Deno.test("toggleTagInQuery - remove only matching tag, preserve others", () => {
78 assertEquals(
79 toggleTagInQuery("tag:swift tag:ios tutorials", "swift"),
80 "tag:ios tutorials",
81 );
82});