The Appview for the kipclip.com atproto bookmarking service
at main 82 lines 2.9 kB view raw
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});