| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2026-04-29 05:05:47 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2026-04-29 05:05:47 UTC |
| parent | 77388b1d36a92cc96d84d61336f0e0a9f4374737 |
| Makefile | +12 | -1 |
| test/sqlite.spec.ts | +93 | -0 |
diff --git a/Makefile b/Makefile index 1e6a575..9bd1c35 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,18 @@ npm: npm/borogove-browser.js npm/borogove.js borogove/persistence/IDB.js borogov playwright/.cache/borogove.js: npm esbuild npm/index.js --bundle --format=esm "--alias:node:dns=@xmpp/resolve" "--footer:js=export { borogove_JID as JID, borogove_ReactionUpdate as ReactionUpdate }" --outfile=$@ -playwright: playwright/.cache/borogove.js +playwright/.cache/sqlite-wasm.js: npm + esbuild npm/sqlite-wasm.js --bundle --format=esm "--alias:node:dns=@xmpp/resolve" --outfile=$@ + sed -i 's/new URL("sqlite-worker1.mjs", import.meta.url)/window.sqliteWorker1Url/g' $@ + +playwright/.cache/sqlite-worker1.js: npm + esbuild npm/sqlite-worker1.mjs --bundle --format=esm --outfile=$@.mjs + sed -i '1iimport importedWasm from "@sqlite.org\\/sqlite-wasm/sqlite3.wasm";' $@.mjs + sed -i 's/new URL("sqlite3.wasm", import.meta.url).href/importedWasm/' $@.mjs + esbuild $@.mjs --bundle --format=esm --loader:.wasm=dataurl --outfile=$@ + $(RM) $@.mjs + +playwright: playwright/.cache/borogove.js playwright/.cache/sqlite-wasm.js npx playwright test cpp/libborogove.dso: diff --git a/test/sqlite.spec.ts b/test/sqlite.spec.ts new file mode 100644 index 0000000..f947bc6 --- /dev/null +++ b/test/sqlite.spec.ts @@ -0,0 +1,93 @@ +import { test, expect } from "@playwright/test"; +import fs from "fs"; + +test.describe("not webkit", () => { + test.skip( + ({ browserName }) => browserName === "webkit", + "Skip on webkit because the version in playwright lacks OPFS", + ); + + test("1:1 come back ordered by sortId", async ({ page }) => { + page.route("https://localhost/", (route) => + route.fulfill({ + headers: { + "Cross-Origin-Opener-Policy": "same-origin", + "Cross-Origin-Embedder-Policy": "same-origin", + "Cross-Origin-Resource-Policy": "same-origin", + }, + body: "<html></html>", + }), + ); + const code = fs.readFileSync("playwright/.cache/borogove.js", "utf8"); + const sqlite = fs.readFileSync("playwright/.cache/sqlite-wasm.js", "utf8"); + const worker1 = fs.readFileSync( + "playwright/.cache/sqlite-worker1.js", + "utf8", + ); + await page.goto("https://localhost/"); + const result = await page.evaluate( + async ([code, sqliteCode, worker1Code]) => { + const blob = new Blob([code], { type: "text/javascript" }); + const borogove = await import(URL.createObjectURL(blob)); + + const sqliteBlob = new Blob([sqliteCode], { type: "text/javascript" }); + const sqlite = await import(URL.createObjectURL(sqliteBlob)); + + const worker1Blob = new Blob([worker1Code], { + type: "text/javascript", + }); + window.sqliteWorker1Url = new URL(URL.createObjectURL(worker1Blob)); + + const mediaStore = + await borogove.persistence.MediaStoreCache("snikket"); + const persistence = new sqlite.borogove_persistence_Sqlite( + "snikket", + mediaStore, + ); + + console.log("made persistence"); + await new Promise((resolve) => setTimeout(resolve, 3000)); + + const builder = new borogove.ChatMessageBuilder({ + serverId: "1", + serverIdBy: "alice@example.com", + senderId: "hatter@example.com", + direction: 0, + }); + builder.sortId = "a0"; + builder.to = borogove.JID.parse("alice@example.com"); + builder.from = borogove.JID.parse("hatter@example.com"); + builder.replyTo = [builder.from]; + + const builder2 = new borogove.ChatMessageBuilder({ + serverId: "2", + serverIdBy: "alice@example.com", + senderId: "hatter@example.com", + direction: 0, + }); + builder2.sortId = "b0"; + builder2.to = borogove.JID.parse("alice@example.com"); + builder2.from = borogove.JID.parse("hatter@example.com"); + builder2.replyTo = [builder.from]; + + try { + await persistence.storeMessages("alice@example.com", [ + builder2.build(), + builder.build(), + ]); + return await persistence.getMessagesBefore( + "alice@example.com", + "hatter@example.com", + ); + } catch (e) { + throw "" + e.result; + } + }, + [code, sqlite, worker1], + ); + + expect(result.length).toBe(2); + expect(result[0].serverId).toBe("1"); + expect(result[1].serverId).toBe("2"); + }); +});