/* eslint-disable @typescript-eslint/no-unused-vars */ import { GenericId } from "../values/index.js"; import { test } from "vitest"; import { assert, Equals } from "../test/type_testing.js"; import { GenericDatabaseReader } from "./database.js"; import { SystemDataModel, SystemTableNames } from "./schema.js"; import { Id } from "../values/value.js"; import { TableNamesInDataModel } from "./data_model.js"; type Message = { body: string; _id: GenericId<"tableName">; }; type DataModel = { messages: { document: Message; fieldPaths: "body" | "_id"; indexes: {}; searchIndexes: {}; vectorIndexes: {}; }; }; type DB = GenericDatabaseReader; test("collect returns the correct types", () => { function collect(db: DB) { return db.query("messages").collect(); } type Result = ReturnType; type Expected = Promise; assert>(); }); test("take returns the correct types", () => { function take(db: DB) { return db.query("messages").take(5); } type Result = ReturnType; type Expected = Promise; assert>(); }); test("first returns the correct types", () => { function first(db: DB) { return db.query("messages").first(); } type Result = ReturnType; type Expected = Promise; assert>(); }); test("unique returns the correct types", () => { function unique(db: DB) { return db.query("messages").unique(); } type Result = ReturnType; type Expected = Promise; assert>(); }); test("fullTableScan returns the correct types", () => { function fullTableScan(db: DB) { return db.query("messages").fullTableScan().collect(); } type Result = ReturnType; type Expected = Promise; assert>(); }); test("order and filter don't change the return type", () => { function orderAndFilter(db: DB) { return db .query("messages") .order("desc") .filter((q) => q.eq(q.field("body"), "Hello")) .collect(); } type Result = ReturnType; type Expected = Promise; assert>(); }); test("can query() from system tables", () => { function collect(db: DB, tableName: SystemTableNames) { return db.system.query(tableName).collect(); } type Result = ReturnType; type Expected = Promise; assert>(); }); test("can get() from system tables", () => { function get(db: DB, tableId: Id) { return db.system.get(tableId); } type Result = ReturnType; type Expected = Promise; assert>(); }); test("system-level database reader can only get() from system tables", () => { function get(db: DB, tableId: Id>) { // @ts-expect-error We cannot query user tables from system GenericDatabaseReader return db.system.get(tableId); } }); test("system-level database reader can only query() from system tables", () => { function collect(db: DB, tableName: TableNamesInDataModel) { // @ts-expect-error We cannot query user tables from system GenericDatabaseReader return db.system.query(tableName).collect(); } });