Emdash source with visual editor image upload fix
Fixes: 1. media.ts: wrap placeholder generation in try-catch 2. toolbar.ts: check r.ok, display error message in popover
This commit is contained in:
112
packages/cloudflare/tests/db/do-dialect.test.ts
Normal file
112
packages/cloudflare/tests/db/do-dialect.test.ts
Normal file
@@ -0,0 +1,112 @@
|
||||
import { CompiledQuery } from "kysely";
|
||||
import { describe, it, expect, vi } from "vitest";
|
||||
|
||||
import { PreviewDODialect } from "../../src/db/do-dialect.js";
|
||||
import type { PreviewDODialectConfig } from "../../src/db/do-dialect.js";
|
||||
|
||||
function createMockStub(queryFn = vi.fn()) {
|
||||
return { query: queryFn };
|
||||
}
|
||||
|
||||
function createConfig(queryFn = vi.fn()): PreviewDODialectConfig {
|
||||
const stub = createMockStub(queryFn);
|
||||
return { getStub: () => stub };
|
||||
}
|
||||
|
||||
describe("PreviewDODialect", () => {
|
||||
it("creates a SqliteAdapter", () => {
|
||||
const dialect = new PreviewDODialect(createConfig());
|
||||
const adapter = dialect.createAdapter();
|
||||
expect(adapter.constructor.name).toBe("SqliteAdapter");
|
||||
});
|
||||
|
||||
it("creates a SqliteQueryCompiler", () => {
|
||||
const dialect = new PreviewDODialect(createConfig());
|
||||
const compiler = dialect.createQueryCompiler();
|
||||
expect(compiler.constructor.name).toBe("SqliteQueryCompiler");
|
||||
});
|
||||
});
|
||||
|
||||
describe("PreviewDODriver", () => {
|
||||
it("acquires a connection", async () => {
|
||||
const dialect = new PreviewDODialect(createConfig());
|
||||
const driver = dialect.createDriver();
|
||||
const conn = await driver.acquireConnection();
|
||||
expect(conn).toBeDefined();
|
||||
expect(conn.executeQuery).toBeTypeOf("function");
|
||||
});
|
||||
|
||||
it("transaction methods are no-ops (preview is read-only)", async () => {
|
||||
const dialect = new PreviewDODialect(createConfig());
|
||||
const driver = dialect.createDriver();
|
||||
const conn = await driver.acquireConnection();
|
||||
|
||||
// These should not throw
|
||||
await driver.beginTransaction(conn, {});
|
||||
await driver.commitTransaction(conn);
|
||||
await driver.rollbackTransaction(conn);
|
||||
});
|
||||
});
|
||||
|
||||
describe("PreviewDOConnection", () => {
|
||||
it("passes sql and parameters to the stub", async () => {
|
||||
const queryFn = vi.fn().mockResolvedValue({ rows: [], changes: 0 });
|
||||
const dialect = new PreviewDODialect(createConfig(queryFn));
|
||||
const driver = dialect.createDriver();
|
||||
const conn = await driver.acquireConnection();
|
||||
|
||||
await conn.executeQuery(CompiledQuery.raw("SELECT * FROM users WHERE id = ?", ["abc"]));
|
||||
|
||||
expect(queryFn).toHaveBeenCalledWith("SELECT * FROM users WHERE id = ?", ["abc"]);
|
||||
});
|
||||
|
||||
it("returns rows from the stub result", async () => {
|
||||
const rows = [
|
||||
{ id: "1", name: "Alice" },
|
||||
{ id: "2", name: "Bob" },
|
||||
];
|
||||
const queryFn = vi.fn().mockResolvedValue({ rows, changes: 0 });
|
||||
const dialect = new PreviewDODialect(createConfig(queryFn));
|
||||
const driver = dialect.createDriver();
|
||||
const conn = await driver.acquireConnection();
|
||||
|
||||
const result = await conn.executeQuery(CompiledQuery.raw("SELECT * FROM users"));
|
||||
|
||||
expect(result.rows).toEqual(rows);
|
||||
});
|
||||
|
||||
it("converts changes to bigint numAffectedRows", async () => {
|
||||
const queryFn = vi.fn().mockResolvedValue({ rows: [], changes: 3 });
|
||||
const dialect = new PreviewDODialect(createConfig(queryFn));
|
||||
const driver = dialect.createDriver();
|
||||
const conn = await driver.acquireConnection();
|
||||
|
||||
const result = await conn.executeQuery(CompiledQuery.raw("UPDATE users SET name = ?", ["x"]));
|
||||
|
||||
expect(result.numAffectedRows).toBe(3n);
|
||||
});
|
||||
|
||||
it("sets numAffectedRows to undefined when changes is undefined", async () => {
|
||||
const queryFn = vi.fn().mockResolvedValue({ rows: [{ count: 5 }] });
|
||||
const dialect = new PreviewDODialect(createConfig(queryFn));
|
||||
const driver = dialect.createDriver();
|
||||
const conn = await driver.acquireConnection();
|
||||
|
||||
const result = await conn.executeQuery(
|
||||
CompiledQuery.raw("SELECT count(*) as count FROM users"),
|
||||
);
|
||||
|
||||
expect(result.numAffectedRows).toBeUndefined();
|
||||
});
|
||||
|
||||
it("handles zero changes correctly", async () => {
|
||||
const queryFn = vi.fn().mockResolvedValue({ rows: [], changes: 0 });
|
||||
const dialect = new PreviewDODialect(createConfig(queryFn));
|
||||
const driver = dialect.createDriver();
|
||||
const conn = await driver.acquireConnection();
|
||||
|
||||
const result = await conn.executeQuery(CompiledQuery.raw("DELETE FROM users WHERE 1=0"));
|
||||
|
||||
expect(result.numAffectedRows).toBe(0n);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user