103 lines
2.7 KiB
TypeScript
103 lines
2.7 KiB
TypeScript
import { Database } from "bun:sqlite";
|
|
import { beforeEach, describe, expect, test } from "bun:test";
|
|
import grabNextDocumentSequence, {
|
|
type DocumentNumberSqlRunner,
|
|
} from "./grab-next-document-sequence";
|
|
|
|
let db: Database;
|
|
let run_sql: DocumentNumberSqlRunner;
|
|
|
|
beforeEach(() => {
|
|
db = new Database(":memory:");
|
|
db.run("CREATE TABLE invoices (invoice_number TEXT UNIQUE)");
|
|
|
|
run_sql = async ({ sql, values }) => {
|
|
const row = db.query(sql).get(...values) as
|
|
| { max_seq: number | null }
|
|
| null;
|
|
|
|
return { singleRes: row };
|
|
};
|
|
});
|
|
|
|
function insertNumbers(numbers: string[]) {
|
|
const insert = db.prepare("INSERT INTO invoices (invoice_number) VALUES (?)");
|
|
|
|
for (const number of numbers) {
|
|
insert.run(number);
|
|
}
|
|
}
|
|
|
|
describe("grabNextDocumentSequence", () => {
|
|
test("starts at 1 for an empty table", async () => {
|
|
const next = await grabNextDocumentSequence({
|
|
table: "invoices",
|
|
column: "invoice_number",
|
|
prefix: "BSQLITE-202610",
|
|
run_sql,
|
|
});
|
|
|
|
expect(next).toBe(1);
|
|
});
|
|
|
|
test("returns max + 1 for existing numbers", async () => {
|
|
insertNumbers([
|
|
"BSQLITE-202610-001",
|
|
"BSQLITE-202610-002",
|
|
"BSQLITE-202610-003",
|
|
]);
|
|
|
|
const next = await grabNextDocumentSequence({
|
|
table: "invoices",
|
|
column: "invoice_number",
|
|
prefix: "BSQLITE-202610",
|
|
run_sql,
|
|
});
|
|
|
|
expect(next).toBe(4);
|
|
});
|
|
|
|
test("does not reuse a number after a deletion", async () => {
|
|
insertNumbers(["BSQLITE-202610-001", "BSQLITE-202610-003"]);
|
|
|
|
const next = await grabNextDocumentSequence({
|
|
table: "invoices",
|
|
column: "invoice_number",
|
|
prefix: "BSQLITE-202610",
|
|
run_sql,
|
|
});
|
|
|
|
expect(next).toBe(4);
|
|
});
|
|
|
|
test("ignores numbers from other prefixes", async () => {
|
|
insertNumbers([
|
|
"BSQLITE-202609-099",
|
|
"BSQLITEQ-202610-050",
|
|
"BSQLITE-202610-002",
|
|
]);
|
|
|
|
const next = await grabNextDocumentSequence({
|
|
table: "invoices",
|
|
column: "invoice_number",
|
|
prefix: "BSQLITE-202610",
|
|
run_sql,
|
|
});
|
|
|
|
expect(next).toBe(3);
|
|
});
|
|
|
|
test("handles sequences beyond three digits", async () => {
|
|
insertNumbers(["BSQLITE-202610-009", "BSQLITE-202610-010"]);
|
|
|
|
const next = await grabNextDocumentSequence({
|
|
table: "invoices",
|
|
column: "invoice_number",
|
|
prefix: "BSQLITE-202610",
|
|
run_sql,
|
|
});
|
|
|
|
expect(next).toBe(11);
|
|
});
|
|
});
|