Create sql tests for sqs
This commit is contained in:
parent
5a9ed4ff52
commit
7cc03b1724
|
@ -0,0 +1,674 @@
|
||||||
|
import {
|
||||||
|
AIOperationEnum,
|
||||||
|
CalculationType,
|
||||||
|
FieldType,
|
||||||
|
RelationshipType,
|
||||||
|
SourceName,
|
||||||
|
Table,
|
||||||
|
ViewV2,
|
||||||
|
ViewV2Type,
|
||||||
|
} from "@budibase/types"
|
||||||
|
import { buildInternalFieldList } from "../sqs"
|
||||||
|
import { structures } from "../../../../../../api/routes/tests/utilities"
|
||||||
|
import { sql } from "@budibase/backend-core"
|
||||||
|
import { generator } from "@budibase/backend-core/tests"
|
||||||
|
import {
|
||||||
|
generateJunctionTableID,
|
||||||
|
generateViewID,
|
||||||
|
} from "../../../../../../db/utils"
|
||||||
|
|
||||||
|
import sdk from "../../../../../../sdk"
|
||||||
|
import { cloneDeep } from "lodash"
|
||||||
|
import { utils } from "@budibase/shared-core"
|
||||||
|
|
||||||
|
jest.mock("../../../../../../sdk/app/views", () => ({
|
||||||
|
...jest.requireActual("../../../../../../sdk/app/views"),
|
||||||
|
getTable: jest.fn(),
|
||||||
|
}))
|
||||||
|
const getTableMock = sdk.views.getTable as jest.MockedFunction<
|
||||||
|
typeof sdk.views.getTable
|
||||||
|
>
|
||||||
|
|
||||||
|
describe("buildInternalFieldList", () => {
|
||||||
|
let allTables: Table[]
|
||||||
|
|
||||||
|
class TableConfig {
|
||||||
|
private _table: Table & { _id: string }
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
const name = generator.word()
|
||||||
|
this._table = {
|
||||||
|
...structures.tableForDatasource({
|
||||||
|
type: "datasource",
|
||||||
|
source: SourceName.POSTGRES,
|
||||||
|
}),
|
||||||
|
name,
|
||||||
|
_id: sql.utils.buildExternalTableId("ds_id", name),
|
||||||
|
schema: {
|
||||||
|
name: {
|
||||||
|
name: "name",
|
||||||
|
type: FieldType.STRING,
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
name: "description",
|
||||||
|
type: FieldType.STRING,
|
||||||
|
},
|
||||||
|
amount: {
|
||||||
|
name: "amount",
|
||||||
|
type: FieldType.NUMBER,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
allTables.push(this._table)
|
||||||
|
}
|
||||||
|
|
||||||
|
withHiddenField(field: string) {
|
||||||
|
this._table.schema[field].visible = false
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
withField(
|
||||||
|
name: string,
|
||||||
|
type:
|
||||||
|
| FieldType.STRING
|
||||||
|
| FieldType.NUMBER
|
||||||
|
| FieldType.FORMULA
|
||||||
|
| FieldType.AI,
|
||||||
|
options?: { visible: boolean }
|
||||||
|
) {
|
||||||
|
switch (type) {
|
||||||
|
case FieldType.NUMBER:
|
||||||
|
case FieldType.STRING:
|
||||||
|
this._table.schema[name] = {
|
||||||
|
name,
|
||||||
|
type,
|
||||||
|
...options,
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case FieldType.FORMULA:
|
||||||
|
this._table.schema[name] = {
|
||||||
|
name,
|
||||||
|
type,
|
||||||
|
formula: "any",
|
||||||
|
...options,
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case FieldType.AI:
|
||||||
|
this._table.schema[name] = {
|
||||||
|
name,
|
||||||
|
type,
|
||||||
|
operation: AIOperationEnum.PROMPT,
|
||||||
|
...options,
|
||||||
|
}
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
utils.unreachable(type)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
withRelation(name: string, toTableId: string) {
|
||||||
|
this._table.schema[name] = {
|
||||||
|
name,
|
||||||
|
type: FieldType.LINK,
|
||||||
|
relationshipType: RelationshipType.ONE_TO_MANY,
|
||||||
|
fieldName: "link",
|
||||||
|
tableId: toTableId,
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
withEmptySchema() {
|
||||||
|
this._table.schema = {}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
create() {
|
||||||
|
return cloneDeep(this._table)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ViewConfig {
|
||||||
|
private _table: Table
|
||||||
|
private _view: ViewV2
|
||||||
|
|
||||||
|
constructor(table: Table) {
|
||||||
|
this._table = table
|
||||||
|
this._view = {
|
||||||
|
version: 2,
|
||||||
|
id: generateViewID(table._id!),
|
||||||
|
name: generator.word(),
|
||||||
|
tableId: table._id!,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
withVisible(field: string) {
|
||||||
|
this._view.schema ??= {}
|
||||||
|
this._view.schema[field] ??= {}
|
||||||
|
this._view.schema[field].visible = true
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
withHidden(field: string) {
|
||||||
|
this._view.schema ??= {}
|
||||||
|
this._view.schema[field] ??= {}
|
||||||
|
this._view.schema[field].visible = false
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
withRelationshipColumns(
|
||||||
|
field: string,
|
||||||
|
columns: Record<string, { visible: boolean }>
|
||||||
|
) {
|
||||||
|
this._view.schema ??= {}
|
||||||
|
this._view.schema[field] ??= {}
|
||||||
|
this._view.schema[field].columns = columns
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
withCalculation(
|
||||||
|
name: string,
|
||||||
|
field: string,
|
||||||
|
calculationType: CalculationType
|
||||||
|
) {
|
||||||
|
this._view.type = ViewV2Type.CALCULATION
|
||||||
|
this._view.schema ??= {}
|
||||||
|
this._view.schema[name] = {
|
||||||
|
field,
|
||||||
|
calculationType,
|
||||||
|
visible: true,
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
create() {
|
||||||
|
getTableMock.mockResolvedValueOnce(this._table)
|
||||||
|
return cloneDeep(this._view)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
allTables = []
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("table", () => {
|
||||||
|
it("includes internal columns by default", async () => {
|
||||||
|
const table = new TableConfig().withEmptySchema().create()
|
||||||
|
const result = await buildInternalFieldList(table, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("extracts fields from table schema", async () => {
|
||||||
|
const table = new TableConfig().create()
|
||||||
|
const result = await buildInternalFieldList(table, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}.data_description`,
|
||||||
|
`${table._id}.data_amount`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("excludes hidden fields", async () => {
|
||||||
|
const table = new TableConfig().withHiddenField("description").create()
|
||||||
|
const result = await buildInternalFieldList(table, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}.data_amount`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("excludes non-sql fields fields", async () => {
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.withField("ai", FieldType.AI)
|
||||||
|
.withRelation("link", "otherTableId")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const result = await buildInternalFieldList(table, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}.data_description`,
|
||||||
|
`${table._id}.data_amount`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("includes hidden fields if there is a formula column", async () => {
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withHiddenField("description")
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const result = await buildInternalFieldList(table, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}.data_description`,
|
||||||
|
`${table._id}.data_amount`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("includes relationships fields when flagged", async () => {
|
||||||
|
const otherTable = new TableConfig()
|
||||||
|
.withHiddenField("description")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withHiddenField("amount")
|
||||||
|
.withRelation("link", otherTable._id)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const relationships = [{ tableName: otherTable.name, column: "link" }]
|
||||||
|
|
||||||
|
const result = await buildInternalFieldList(table, allTables, {
|
||||||
|
relationships,
|
||||||
|
})
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}.data_description`,
|
||||||
|
`${otherTable._id}.data_name`,
|
||||||
|
`${otherTable._id}.data_amount`,
|
||||||
|
`${otherTable._id}._id`,
|
||||||
|
`${otherTable._id}._rev`,
|
||||||
|
`${otherTable._id}.type`,
|
||||||
|
`${otherTable._id}.createdAt`,
|
||||||
|
`${otherTable._id}.updatedAt`,
|
||||||
|
`${otherTable._id}.tableId`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc1.fieldName`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc2.fieldName`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("includes all relationship fields if there is a formula column", async () => {
|
||||||
|
const otherTable = new TableConfig()
|
||||||
|
.withField("hidden", FieldType.STRING, { visible: false })
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withRelation("link", otherTable._id)
|
||||||
|
.withHiddenField("description")
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const relationships = [{ tableName: otherTable.name, column: "link" }]
|
||||||
|
const result = await buildInternalFieldList(table, allTables, {
|
||||||
|
relationships,
|
||||||
|
})
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}.data_description`,
|
||||||
|
`${table._id}.data_amount`,
|
||||||
|
`${otherTable._id}.data_name`,
|
||||||
|
`${otherTable._id}.data_description`,
|
||||||
|
`${otherTable._id}.data_amount`,
|
||||||
|
`${otherTable._id}.data_hidden`,
|
||||||
|
`${otherTable._id}._id`,
|
||||||
|
`${otherTable._id}._rev`,
|
||||||
|
`${otherTable._id}.type`,
|
||||||
|
`${otherTable._id}.createdAt`,
|
||||||
|
`${otherTable._id}.updatedAt`,
|
||||||
|
`${otherTable._id}.tableId`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc1.fieldName`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc2.fieldName`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("never includes non-sql columns from relationships", async () => {
|
||||||
|
const otherTable = new TableConfig()
|
||||||
|
.withField("hidden", FieldType.STRING, { visible: false })
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.withField("ai", FieldType.AI)
|
||||||
|
.withRelation("link", "otherTableId")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withRelation("link", otherTable._id)
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const relationships = [{ tableName: otherTable.name, column: "link" }]
|
||||||
|
const result = await buildInternalFieldList(table, allTables, {
|
||||||
|
relationships,
|
||||||
|
})
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}.data_description`,
|
||||||
|
`${table._id}.data_amount`,
|
||||||
|
`${otherTable._id}.data_name`,
|
||||||
|
`${otherTable._id}.data_description`,
|
||||||
|
`${otherTable._id}.data_amount`,
|
||||||
|
`${otherTable._id}.data_hidden`,
|
||||||
|
`${otherTable._id}._id`,
|
||||||
|
`${otherTable._id}._rev`,
|
||||||
|
`${otherTable._id}.type`,
|
||||||
|
`${otherTable._id}.createdAt`,
|
||||||
|
`${otherTable._id}.updatedAt`,
|
||||||
|
`${otherTable._id}.tableId`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc1.fieldName`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc2.fieldName`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("view", () => {
|
||||||
|
it("includes internal columns by default", async () => {
|
||||||
|
const view = new ViewConfig(new TableConfig().create()).create()
|
||||||
|
const result = await buildInternalFieldList(view, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${view.tableId}._id`,
|
||||||
|
`${view.tableId}._rev`,
|
||||||
|
`${view.tableId}.type`,
|
||||||
|
`${view.tableId}.createdAt`,
|
||||||
|
`${view.tableId}.updatedAt`,
|
||||||
|
`${view.tableId}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("extracts fields from table schema", async () => {
|
||||||
|
const view = new ViewConfig(new TableConfig().create())
|
||||||
|
.withVisible("amount")
|
||||||
|
.withHidden("name")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const result = await buildInternalFieldList(view, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${view.tableId}.data_amount`,
|
||||||
|
`${view.tableId}._id`,
|
||||||
|
`${view.tableId}._rev`,
|
||||||
|
`${view.tableId}.type`,
|
||||||
|
`${view.tableId}.createdAt`,
|
||||||
|
`${view.tableId}.updatedAt`,
|
||||||
|
`${view.tableId}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("includes all fields if there is a formula column", async () => {
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
const view = new ViewConfig(table)
|
||||||
|
.withHidden("name")
|
||||||
|
.withVisible("amount")
|
||||||
|
.withVisible("formula")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const result = await buildInternalFieldList(view, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${view.tableId}.data_name`,
|
||||||
|
`${view.tableId}.data_description`,
|
||||||
|
`${view.tableId}.data_amount`,
|
||||||
|
`${view.tableId}._id`,
|
||||||
|
`${view.tableId}._rev`,
|
||||||
|
`${view.tableId}.type`,
|
||||||
|
`${view.tableId}.createdAt`,
|
||||||
|
`${view.tableId}.updatedAt`,
|
||||||
|
`${view.tableId}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("does not includes all fields if the formula column is not included", async () => {
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
const view = new ViewConfig(table)
|
||||||
|
.withHidden("name")
|
||||||
|
.withVisible("amount")
|
||||||
|
.withHidden("formula")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const result = await buildInternalFieldList(view, [])
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${view.tableId}.data_amount`,
|
||||||
|
`${view.tableId}._id`,
|
||||||
|
`${view.tableId}._rev`,
|
||||||
|
`${view.tableId}.type`,
|
||||||
|
`${view.tableId}.createdAt`,
|
||||||
|
`${view.tableId}.updatedAt`,
|
||||||
|
`${view.tableId}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("includes relationships fields", async () => {
|
||||||
|
const otherTable = new TableConfig().create()
|
||||||
|
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withRelation("link", otherTable._id)
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const view = new ViewConfig(table)
|
||||||
|
.withVisible("name")
|
||||||
|
.withVisible("link")
|
||||||
|
.withHidden("amount")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const relationships = [{ tableName: otherTable.name, column: "link" }]
|
||||||
|
const result = await buildInternalFieldList(view, allTables, {
|
||||||
|
relationships,
|
||||||
|
})
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${otherTable._id}.data_name`,
|
||||||
|
`${otherTable._id}.data_description`,
|
||||||
|
`${otherTable._id}.data_amount`,
|
||||||
|
`${otherTable._id}._id`,
|
||||||
|
`${otherTable._id}._rev`,
|
||||||
|
`${otherTable._id}.type`,
|
||||||
|
`${otherTable._id}.createdAt`,
|
||||||
|
`${otherTable._id}.updatedAt`,
|
||||||
|
`${otherTable._id}.tableId`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc1.fieldName`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc2.fieldName`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("includes relationships columns", async () => {
|
||||||
|
const otherTable = new TableConfig()
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withRelation("link", otherTable._id)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const view = new ViewConfig(table)
|
||||||
|
.withVisible("name")
|
||||||
|
.withVisible("link")
|
||||||
|
.withRelationshipColumns("link", {
|
||||||
|
name: { visible: false },
|
||||||
|
amount: { visible: true },
|
||||||
|
formula: { visible: false },
|
||||||
|
})
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const relationships = [{ tableName: otherTable.name, column: "link" }]
|
||||||
|
const result = await buildInternalFieldList(view, allTables, {
|
||||||
|
relationships,
|
||||||
|
})
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${otherTable._id}.data_name`,
|
||||||
|
`${otherTable._id}.data_description`,
|
||||||
|
`${otherTable._id}.data_amount`,
|
||||||
|
`${otherTable._id}._id`,
|
||||||
|
`${otherTable._id}._rev`,
|
||||||
|
`${otherTable._id}.type`,
|
||||||
|
`${otherTable._id}.createdAt`,
|
||||||
|
`${otherTable._id}.updatedAt`,
|
||||||
|
`${otherTable._id}.tableId`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc1.fieldName`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc2.fieldName`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("does not include relationships columns for hidden links", async () => {
|
||||||
|
const otherTable = new TableConfig()
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withRelation("link", otherTable._id)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const view = new ViewConfig(table)
|
||||||
|
.withVisible("name")
|
||||||
|
.withHidden("link")
|
||||||
|
.withRelationshipColumns("link", {
|
||||||
|
name: { visible: false },
|
||||||
|
amount: { visible: true },
|
||||||
|
formula: { visible: false },
|
||||||
|
})
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const relationships = [{ tableName: otherTable.name, column: "link" }]
|
||||||
|
const result = await buildInternalFieldList(view, allTables, {
|
||||||
|
relationships,
|
||||||
|
})
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("includes all relationship fields if there is a formula column", async () => {
|
||||||
|
const otherTable = new TableConfig()
|
||||||
|
.withField("hidden", FieldType.STRING, { visible: false })
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.withField("ai", FieldType.AI)
|
||||||
|
.withRelation("link", "otherTableId")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const table = new TableConfig()
|
||||||
|
.withRelation("link", otherTable._id)
|
||||||
|
.withField("formula", FieldType.FORMULA)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const view = new ViewConfig(table)
|
||||||
|
.withVisible("name")
|
||||||
|
.withVisible("formula")
|
||||||
|
.withHidden("link")
|
||||||
|
.withRelationshipColumns("link", {
|
||||||
|
name: { visible: false },
|
||||||
|
amount: { visible: true },
|
||||||
|
formula: { visible: false },
|
||||||
|
})
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const relationships = [{ tableName: otherTable.name, column: "link" }]
|
||||||
|
const result = await buildInternalFieldList(view, allTables, {
|
||||||
|
relationships,
|
||||||
|
})
|
||||||
|
expect(result).toEqual([
|
||||||
|
`${table._id}.data_name`,
|
||||||
|
`${table._id}.data_description`,
|
||||||
|
`${table._id}.data_amount`,
|
||||||
|
`${otherTable._id}.data_name`,
|
||||||
|
`${otherTable._id}.data_description`,
|
||||||
|
`${otherTable._id}.data_amount`,
|
||||||
|
`${otherTable._id}.data_hidden`,
|
||||||
|
`${otherTable._id}._id`,
|
||||||
|
`${otherTable._id}._rev`,
|
||||||
|
`${otherTable._id}.type`,
|
||||||
|
`${otherTable._id}.createdAt`,
|
||||||
|
`${otherTable._id}.updatedAt`,
|
||||||
|
`${otherTable._id}.tableId`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc1.fieldName`,
|
||||||
|
`${generateJunctionTableID(table._id, otherTable._id)}.doc2.fieldName`,
|
||||||
|
`${table._id}._id`,
|
||||||
|
`${table._id}._rev`,
|
||||||
|
`${table._id}.type`,
|
||||||
|
`${table._id}.createdAt`,
|
||||||
|
`${table._id}.updatedAt`,
|
||||||
|
`${table._id}.tableId`,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("calculation view", () => {
|
||||||
|
it("does not include calculation fields", async () => {
|
||||||
|
const view = new ViewConfig(new TableConfig().create())
|
||||||
|
.withCalculation("average", "amount", CalculationType.AVG)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const result = await buildInternalFieldList(view, [])
|
||||||
|
expect(result).toEqual([])
|
||||||
|
})
|
||||||
|
|
||||||
|
it("includes visible fields calculation fields", async () => {
|
||||||
|
const view = new ViewConfig(new TableConfig().create())
|
||||||
|
.withCalculation("average", "amount", CalculationType.AVG)
|
||||||
|
.withHidden("name")
|
||||||
|
.withVisible("amount")
|
||||||
|
.create()
|
||||||
|
|
||||||
|
const result = await buildInternalFieldList(view, [])
|
||||||
|
expect(result).toEqual([`${view.tableId}.data_amount`])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue