From 95f5844a44aead711a4725cadc33120db909ce6f Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 12 Jun 2024 15:02:16 +0100 Subject: [PATCH] Get in-memory searching into the search tests. --- .../src/api/routes/tests/search.spec.ts | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts index aac43874a0..51349e7647 100644 --- a/packages/server/src/api/routes/tests/search.spec.ts +++ b/packages/server/src/api/routes/tests/search.spec.ts @@ -22,30 +22,27 @@ import { import _ from "lodash" import tk from "timekeeper" import { encodeJSBinding } from "@budibase/string-templates" +import { dataFilters } from "@budibase/shared-core" describe.each([ - ["lucene", undefined], - ["sqs", undefined], - [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)], - [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)], - [DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)], - [DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)], -])("/api/:sourceId/search (%s)", (name, dsProvider) => { + ["in-memory", undefined], + // ["lucene", undefined], + // ["sqs", undefined], + // [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)], + // [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)], + // [DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)], + // [DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)], +])("search (%s)", (name, dsProvider) => { const isSqs = name === "sqs" const isLucene = name === "lucene" + const isInMemory = name === "in-memory" const isInternal = isSqs || isLucene const config = setup.getConfig() let envCleanup: (() => void) | undefined let datasource: Datasource | undefined let table: Table - - const snippets = [ - { - name: "WeeksAgo", - code: `return function (weeks) {\n const currentTime = new Date(${Date.now()});\n currentTime.setDate(currentTime.getDate()-(7 * (weeks || 1)));\n return currentTime.toISOString();\n}`, - }, - ] + let rows: Row[] beforeAll(async () => { if (isSqs) { @@ -55,7 +52,12 @@ describe.each([ if (config.app?.appId) { config.app = await config.api.application.update(config.app?.appId, { - snippets, + snippets: [ + { + name: "WeeksAgo", + code: `return function (weeks) {\n const currentTime = new Date(${Date.now()});\n currentTime.setDate(currentTime.getDate()-(7 * (weeks || 1)));\n return currentTime.toISOString();\n}`, + }, + ], }) } @@ -79,14 +81,30 @@ describe.each([ ) } - async function createRows(rows: Record[]) { + async function createRows(arr: Record[]) { // Shuffling to avoid false positives given a fixed order - await config.api.row.bulkImport(table._id!, { rows: _.shuffle(rows) }) + await config.api.row.bulkImport(table._id!, { + rows: _.shuffle(arr), + }) + rows = await config.api.row.fetch(table._id!) } class SearchAssertion { constructor(private readonly query: RowSearchParams) {} + private async performSearch(): Promise { + if (isInMemory) { + return dataFilters.runQuery(rows, this.query.query) + } else { + return ( + await config.api.row.search(table._id!, { + ...this.query, + tableId: table._id!, + }) + ).rows + } + } + // We originally used _.isMatch to compare rows, but found that when // comparing arrays it would return true if the source array was a subset of // the target array. This would sometimes create false matches. This @@ -157,10 +175,7 @@ describe.each([ // different to the one passed in will cause the assertion to fail. Extra // rows returned by the query will also cause the assertion to fail. async toMatchExactly(expectedRows: any[]) { - const { rows: foundRows } = await config.api.row.search(table._id!, { - ...this.query, - tableId: table._id!, - }) + const foundRows = await this.performSearch() // eslint-disable-next-line jest/no-standalone-expect expect(foundRows).toHaveLength(expectedRows.length) @@ -176,10 +191,7 @@ describe.each([ // passed in. The order of the rows is not important, but extra rows will // cause the assertion to fail. async toContainExactly(expectedRows: any[]) { - const { rows: foundRows } = await config.api.row.search(table._id!, { - ...this.query, - tableId: table._id!, - }) + const foundRows = await this.performSearch() // eslint-disable-next-line jest/no-standalone-expect expect(foundRows).toHaveLength(expectedRows.length) @@ -197,10 +209,7 @@ describe.each([ // The order of the rows is not important. Extra rows will not cause the // assertion to fail. async toContain(expectedRows: any[]) { - const { rows: foundRows } = await config.api.row.search(table._id!, { - ...this.query, - tableId: table._id!, - }) + const foundRows = await this.performSearch() // eslint-disable-next-line jest/no-standalone-expect expect([...foundRows]).toEqual( @@ -217,10 +226,7 @@ describe.each([ } async toHaveLength(length: number) { - const { rows: foundRows } = await config.api.row.search(table._id!, { - ...this.query, - tableId: table._id!, - }) + const foundRows = await this.performSearch() // eslint-disable-next-line jest/no-standalone-expect expect(foundRows).toHaveLength(length)