@barnabask/astro-minisearch
Version:
Utilities to add a static full text index to an Astro project
94 lines (73 loc) • 3.24 kB
text/typescript
import { test } from "uvu";
import * as assert from "uvu/assert";
import { generateIndex, loadIndex } from "../src/";
test("generateIndex", async () => {
const testDoc1 = { title: "Test1", url: "/test/1", text: "test one" };
const testDoc2 = { title: "Test2", url: "/test/2", text: "test two" };
const index1 = await generateIndex([testDoc1, testDoc2]);
assert.is(index1.documentCount, 2, "array of search documents");
const index2 = await generateIndex(Promise.resolve([testDoc1, testDoc2]));
assert.is(index2.documentCount, 2, "Single promise of search documents");
const index3 = await generateIndex([Promise.resolve([testDoc1]), Promise.resolve([testDoc2])]);
assert.is(index3.documentCount, 2, "Multiple promises of search documents");
});
test("search", async () => {
const title = "Test Title";
const index = await generateIndex([
{ title, url: "test1", text: "introduction paragraph here" },
{ title, url: "test1#first-a", heading: "First A", text: "Text one" },
{ title, url: "test1#second-b", heading: "Second B", text: "Text two" },
{ title, url: "test1#third-c", heading: "Third C", text: "Text three" },
{ title, url: "test2#first-a", heading: "First A", text: "Text one 111" },
{ title, url: "test2#second-b", heading: "Second B", text: "Text two 222" },
{ title, url: "test2#third-c", heading: "Third C", text: "Text three 333" },
]);
const result1 = index.search("one");
assert.is(result1.length, 2, "text should have results");
assert.is(result1[0].id, "test1#first-a");
assert.is(result1[1].id, "test2#first-a");
const result2 = index.search("first");
assert.is(result2.length, 2, "heading should have results");
assert.is(result2[0].id, "test1#first-a");
assert.is(result2[1].id, "test2#first-a");
const result3 = index.search("title");
assert.ok(result3.length > 1, "title should have results");
const result4 = index.search("aardvark");
assert.ok(result4.length === 0, "should have no results");
});
test("loadIndex from object/string", async () => {
const index = await generateIndex([
{ title: "Test 1", url: "test1", text: "abc 123" },
]);
const jsonObj = index.toJSON();
const jsonStr = JSON.stringify(jsonObj);
assert.match(jsonStr, "abc");
const index1 = loadIndex(jsonObj);
assert.is(
index.documentCount,
index1.documentCount,
"index from json object"
);
const index2 = loadIndex(jsonStr);
assert.is(
index.documentCount,
index2.documentCount,
"index from json string"
);
assert.throws(() => loadIndex("{}"), /cannot deserialize/);
assert.throws(() => loadIndex({}), /cannot deserialize/);
});
test("generateIndex with weird inputs", async () => {
const index = await generateIndex([
{ title: "home", url: "", text: "I am the good one" },
{ title: "no url", text: "I have no URL" },
{ title: "dupe", url: "", text: "I am a duplicate of the good one" },
]);
assert.is(index.documentCount, 1);
const result1 = index.search("one");
assert.is(result1.length, 1, "text should have results");
assert.is(result1[0].id, "");
const result2 = index.search("duplicate");
assert.is(result2.length, 0, "text should not have results");
});
test.run();