|
1 | 1 | "use strict"; |
2 | 2 |
|
| 3 | +import { |
| 4 | + cacheXrefData, |
| 5 | + clearXrefData, |
| 6 | + resolveXrefCache, |
| 7 | +} from "../../../src/core/xref-db.js"; |
3 | 8 | import { |
4 | 9 | errorFilters, |
5 | 10 | flushIframes, |
6 | 11 | makeDefaultBody, |
7 | 12 | makeRSDoc, |
8 | 13 | makeStandardOps, |
9 | 14 | } from "../SpecHelper.js"; |
10 | | -import { clearXrefData } from "../../../src/core/xref-db.js"; |
11 | 15 |
|
12 | 16 | describe("Core — xref", () => { |
13 | 17 | afterAll(flushIframes); |
@@ -1118,3 +1122,68 @@ describe("Core — xref", () => { |
1118 | 1122 | ); |
1119 | 1123 | }); |
1120 | 1124 | }); |
| 1125 | + |
| 1126 | +describe("Core — xref-db caching", () => { |
| 1127 | + beforeEach(async () => { |
| 1128 | + await clearXrefData(); |
| 1129 | + localStorage.setItem("XREF:LAST_VERSION_CHECK", Date.now().toString()); |
| 1130 | + }); |
| 1131 | + |
| 1132 | + afterEach(async () => { |
| 1133 | + await clearXrefData(); |
| 1134 | + }); |
| 1135 | + |
| 1136 | + it("does not cache queries with empty results", async () => { |
| 1137 | + const queries = [ |
| 1138 | + { id: "found-term", term: "found", types: ["dfn"] }, |
| 1139 | + { id: "missing-term", term: "missing", types: ["dfn"] }, |
| 1140 | + ]; |
| 1141 | + const results = new Map(); |
| 1142 | + results.set("found-term", [{ uri: "#found", shortname: "spec" }]); |
| 1143 | + |
| 1144 | + await cacheXrefData(queries, results); |
| 1145 | + const cached = await resolveXrefCache(queries); |
| 1146 | + |
| 1147 | + expect(cached.has("found-term")).toBeTrue(); |
| 1148 | + expect(cached.has("missing-term")).toBeFalse(); |
| 1149 | + }); |
| 1150 | + |
| 1151 | + it("cleans up pre-existing empty cache entries on read", async () => { |
| 1152 | + const queries = [{ id: "stale-term", term: "stale", types: ["dfn"] }]; |
| 1153 | + |
| 1154 | + const { promise: dbReady, resolve, reject } = Promise.withResolvers(); |
| 1155 | + const req = indexedDB.open("xref", 2); |
| 1156 | + req.onsuccess = () => resolve(req.result); |
| 1157 | + req.onerror = () => reject(req.error); |
| 1158 | + const db = await dbReady; |
| 1159 | + |
| 1160 | + const tx = db.transaction("xrefs", "readwrite"); |
| 1161 | + tx.objectStore("xrefs").add({ query: queries[0], result: [] }); |
| 1162 | + const { promise: txDone, resolve: txResolve } = Promise.withResolvers(); |
| 1163 | + tx.oncomplete = txResolve; |
| 1164 | + await txDone; |
| 1165 | + db.close(); |
| 1166 | + |
| 1167 | + const cached = await resolveXrefCache(queries); |
| 1168 | + expect(cached.has("stale-term")).toBeFalse(); |
| 1169 | + |
| 1170 | + const { |
| 1171 | + promise: verifyDbReady, |
| 1172 | + resolve: resolveVerifyDb, |
| 1173 | + reject: rejectVerifyDb, |
| 1174 | + } = Promise.withResolvers(); |
| 1175 | + const req2 = indexedDB.open("xref", 2); |
| 1176 | + req2.onsuccess = () => resolveVerifyDb(req2.result); |
| 1177 | + req2.onerror = () => rejectVerifyDb(req2.error); |
| 1178 | + const verifyDb = await verifyDbReady; |
| 1179 | + |
| 1180 | + const verifyTx = verifyDb.transaction("xrefs", "readonly"); |
| 1181 | + const getReq = verifyTx.objectStore("xrefs").get("stale-term"); |
| 1182 | + const { promise: getReady, resolve: resolveGet } = Promise.withResolvers(); |
| 1183 | + getReq.onsuccess = () => resolveGet(getReq.result); |
| 1184 | + const remaining = await getReady; |
| 1185 | + verifyDb.close(); |
| 1186 | + |
| 1187 | + expect(remaining).toBeUndefined(); |
| 1188 | + }); |
| 1189 | +}); |
0 commit comments