From 2a015ba0a1e600f1a0e1ef531e754060ba2292a0 Mon Sep 17 00:00:00 2001 From: dswbx Date: Fri, 17 Jan 2025 05:02:26 +0100 Subject: [PATCH] extended dataapi tests --- app/__test__/api/DataApi.spec.ts | 56 ++++++++++++++++++++- app/__test__/data/specs/WithBuilder.spec.ts | 7 +-- app/__test__/helper.ts | 8 ++- app/src/data/api/DataController.ts | 2 +- 4 files changed, 64 insertions(+), 9 deletions(-) diff --git a/app/__test__/api/DataApi.spec.ts b/app/__test__/api/DataApi.spec.ts index 706a59d..dbbe35d 100644 --- a/app/__test__/api/DataApi.spec.ts +++ b/app/__test__/api/DataApi.spec.ts @@ -1,6 +1,16 @@ -import { describe, expect, it } from "bun:test"; +import { afterAll, beforeAll, describe, expect, it } from "bun:test"; +import { Guard } from "../../src/auth"; +import { parse } from "../../src/core/utils"; import { DataApi } from "../../src/data/api/DataApi"; +import { DataController } from "../../src/data/api/DataController"; +import { dataConfigSchema } from "../../src/data/data-schema"; +import * as proto from "../../src/data/prototype"; +import { disableConsoleLog, enableConsoleLog, schemaToEm } from "../helper"; +beforeAll(disableConsoleLog); +afterAll(enableConsoleLog); + +const dataConfig = parse(dataConfigSchema, {}); describe("DataApi", () => { it("should switch to post for long url reads", async () => { const api = new DataApi(); @@ -13,4 +23,48 @@ describe("DataApi", () => { expect(post.request.method).toBe("POST"); expect(new URL(post.request.url).pathname).toBe(`/api/data/${"a".repeat(1000)}/query`); }); + + it("returns result", async () => { + const schema = proto.em({ + posts: proto.entity("posts", { title: proto.text() }) + }); + const em = schemaToEm(schema); + await em.schema().sync({ force: true }); + + const payload = [{ title: "foo" }, { title: "bar" }, { title: "baz" }]; + await em.mutator("posts").insertMany(payload); + + const ctx: any = { em, guard: new Guard() }; + const controller = new DataController(ctx, dataConfig); + const app = controller.getController(); + + { + const res = (await app.request("/posts")) as Response; + const { data } = await res.json(); + expect(data.length).toEqual(3); + } + + // @ts-ignore tests + const api = new DataApi({ basepath: "/", queryLengthLimit: 50 }); + // @ts-ignore protected + api.fetcher = app.request as typeof fetch; + { + const req = api.readMany("posts", { select: ["title"] }); + expect(req.request.method).toBe("GET"); + const res = await req; + expect(res.data).toEqual(payload); + } + + { + const req = api.readMany("posts", { + select: ["title"], + limit: 100000, + offset: 0, + sort: "id" + }); + expect(req.request.method).toBe("POST"); + const res = await req; + expect(res.data).toEqual(payload); + } + }); }); diff --git a/app/__test__/data/specs/WithBuilder.spec.ts b/app/__test__/data/specs/WithBuilder.spec.ts index bed48a6..7b64198 100644 --- a/app/__test__/data/specs/WithBuilder.spec.ts +++ b/app/__test__/data/specs/WithBuilder.spec.ts @@ -10,16 +10,11 @@ import { WithBuilder } from "../../../src/data"; import * as proto from "../../../src/data/prototype"; -import { compileQb, prettyPrintQb } from "../../helper"; +import { compileQb, prettyPrintQb, schemaToEm } from "../../helper"; import { getDummyConnection } from "../helper"; const { dummyConnection } = getDummyConnection(); -function schemaToEm(s: ReturnType<(typeof proto)["em"]>): EntityManager { - const { dummyConnection } = getDummyConnection(); - return new EntityManager(Object.values(s.entities), dummyConnection, s.relations, s.indices); -} - describe("[data] WithBuilder", async () => { test("validate withs", async () => { const schema = proto.em( diff --git a/app/__test__/helper.ts b/app/__test__/helper.ts index de6993e..f07cd34 100644 --- a/app/__test__/helper.ts +++ b/app/__test__/helper.ts @@ -2,7 +2,8 @@ import { unlink } from "node:fs/promises"; import type { SelectQueryBuilder, SqliteDatabase } from "kysely"; import Database from "libsql"; import { format as sqlFormat } from "sql-formatter"; -import { SqliteLocalConnection } from "../src/data"; +import { type Connection, EntityManager, SqliteLocalConnection } from "../src/data"; +import type { em as protoEm } from "../src/data/prototype"; export function getDummyDatabase(memory: boolean = true): { dummyDb: SqliteDatabase; @@ -62,3 +63,8 @@ export function prettyPrintQb(qb: SelectQueryBuilder) { const { sql, parameters } = qb.compile(); console.log("$", sqlFormat(sql), "\n[params]", parameters); } + +export function schemaToEm(s: ReturnType, conn?: Connection): EntityManager { + const connection = conn ? conn : getDummyConnection().dummyConnection; + return new EntityManager(Object.values(s.entities), connection, s.relations, s.indices); +} diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index 6735c7a..131f3d6 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -281,7 +281,7 @@ export class DataController extends Controller { return c.notFound(); } const options = (await c.req.valid("json")) as RepoQuery; - console.log("options", options); + //console.log("options", options); const result = await this.em.repository(entity).findMany(options); return c.json(this.repoResult(result), { status: result.data ? 200 : 404 });