UNPKG

@quory/core

Version:

Quickly extract relationships from any database

218 lines (205 loc) 7.1 kB
import { ConditionOperator, DatabaseSchema } from "."; import FakeDatabaseDriver from "./FakeDatabaseDriver"; import { format as formatSql } from "@sqltools/formatter"; import { describe, expect, it } from "vitest"; import prepareQuery from "./prepareQuery"; describe("prepareQuery", () => { const fakeDatabaseDriver = new FakeDatabaseDriver(); fakeDatabaseDriver.mockExecResponse([ { foo: "bar", }, ]); const mockSchema: DatabaseSchema = { name: "public", tables: ["customer", "order", "order_fulfilment", "phone_number"].map( (name) => ({ name, columns: [ { name: "id", includedInPrimaryKey: true, dataType: "number", genericDataType: "number", isNullable: false, foreignKeys: [], foreignKeyReferences: [], }, ], }) ), }; const addRelation = (sourceTable: string, targetTable: string) => { mockSchema.tables .find((table) => table.name === sourceTable)! .columns.push({ name: "customer_id", includedInPrimaryKey: false, dataType: "number", genericDataType: "number", isNullable: false, foreignKeys: [ { foreignColumnName: "id", foreignSchemaName: "public", foreignTableName: targetTable, confidence: 1, hasForeignKeyConstraint: true, }, ], foreignKeyReferences: [], }); mockSchema.tables .find((table) => table.name === targetTable)! .columns.find((col) => col.name === "id")! .foreignKeyReferences.push({ localSchemaName: "public", localTableName: sourceTable, localColumnName: "customer_id", confidence: 1, hasForeignKeyConstraint: true, }); }; addRelation("order", "customer"); addRelation("order_fulfilment", "order"); addRelation("phone_number", "customer"); addRelation("phone_number", "order"); const mockSchemas: DatabaseSchema[] = [mockSchema]; it("finds related row from hasMany relations", async () => { const { sql } = await prepareQuery(mockSchemas, { base: { tableRef: "public.customer", select: "*", where: { column: "id", operator: ConditionOperator.EQUALS, value: "3", }, joins: [ { tableRef: "public.order", select: "*", }, { tableRef: "public.order_fulfilment", select: "*", }, ], }, }); expect(formatSql(sql)).toEqual( formatSql(` SELECT public__customer__1.id AS public__customer__id, public__order__1.id AS public__order__id, public__order__1.customer_id AS public__order__customer_id, public__order_fulfilment__1.id AS public__order_fulfilment__id, public__order_fulfilment__1.customer_id AS public__order_fulfilment__customer_id FROM public.customer AS public__customer__1 INNER JOIN public.order AS public__order__1 ON public__order__1.customer_id = public__customer__1.id INNER JOIN public.order_fulfilment AS public__order_fulfilment__1 ON public__order_fulfilment__1.customer_id = public__order__1.id WHERE public__customer__1.id = '3' GROUP BY public__customer__1.id, public__order__1.id, public__order_fulfilment__1.id `) ); }); it("finds related row from belongsTo relations", async () => { const { sql } = await prepareQuery(mockSchemas, { base: { tableRef: "public.order_fulfilment", select: "*", where: { operator: ConditionOperator.EQUALS, column: "id", value: "1", }, joins: [ { tableRef: "public.customer", select: "*", }, ], }, }); expect(formatSql(sql)).toEqual( formatSql(` SELECT public__order_fulfilment__1.id AS public__order_fulfilment__id, public__order_fulfilment__1.customer_id AS public__order_fulfilment__customer_id, public__customer__1.id AS public__customer__id FROM public.order_fulfilment AS public__order_fulfilment__1 INNER JOIN public.order AS public__order__1 ON public__order__1.id = public__order_fulfilment__1.customer_id INNER JOIN public.customer AS public__customer__1 ON public__customer__1.id = public__order__1.customer_id WHERE public__order_fulfilment__1.id = '1' GROUP BY public__order_fulfilment__1.id, public__order__1.id, public__customer__1.id `) ); }); it("supports same table in path twice", async () => { const { sql } = await prepareQuery(mockSchemas, { base: { tableRef: "public.customer", select: "*", where: { column: "id", operator: ConditionOperator.EQUALS, value: "3", }, joins: [ { tableRef: "public.phone_number", select: [], }, { tableRef: "public.order", select: [], where: { column: "id", operator: ConditionOperator.EQUALS, value: "1", }, joins: [ { tableRef: "public.phone_number", select: [], joins: [ { tableRef: "public.order_fulfilment", select: [], where: { column: "id", operator: ConditionOperator.GREATER_THAN, value: "2", }, }, ], }, ], }, ], }, }); expect(formatSql(sql)).toEqual( formatSql(` SELECT public__customer__1.id AS public__customer__id FROM public.customer AS public__customer__1 INNER JOIN public.phone_number AS public__phone_number__1 ON public__phone_number__1.customer_id = public__customer__1.id INNER JOIN public.order AS public__order__1 ON public__order__1.customer_id = public__customer__1.id INNER JOIN public.phone_number AS public__phone_number__2 ON public__phone_number__2.customer_id = public__order__1.id INNER JOIN public.order AS public__order__2 ON public__order__2.id = public__phone_number__2.customer_id INNER JOIN public.order_fulfilment AS public__order_fulfilment__1 ON public__order_fulfilment__1.customer_id = public__order__2.id WHERE public__customer__1.id = '3' AND public__order__1.id = '1' AND public__order_fulfilment__1.id > '2' GROUP BY public__customer__1.id, public__phone_number__1.id, public__order__1.id, public__phone_number__2.id, public__order__2.id, public__order_fulfilment__1.id `) ); }); });