1
0
Fork 0
mirror of synced 2024-09-21 20:01:32 +12:00
budibase/packages/server/src/integration-test/row.spec.ts

268 lines
6.9 KiB
TypeScript
Raw Normal View History

2023-01-18 06:22:31 +13:00
import { faker } from "@faker-js/faker"
import {
generateMakeRequest,
MakeRequestResponse,
} from "../api/routes/public/tests/utils"
import * as setup from "../api/routes/tests/utilities"
2023-01-19 05:46:40 +13:00
import { Datasource, FieldType, SourceName, Table } from "@budibase/types"
2023-01-19 06:07:09 +13:00
import _ from "lodash"
2023-01-18 06:22:31 +13:00
const config = setup.getConfig()
2023-01-19 02:55:24 +13:00
2023-01-20 00:00:51 +13:00
jest.unmock("node-fetch")
2023-01-19 06:07:09 +13:00
describe("row api - postgres", () => {
let apiKey,
makeRequest: MakeRequestResponse,
postgresDatasource: Datasource,
postgresTable: Table
beforeEach(async () => {
await config.init()
apiKey = await config.generateApiKey()
postgresDatasource = await config.createDatasource({
type: "datasource",
source: SourceName.POSTGRES,
plus: true,
config: {
host: "192.168.1.98",
port: 54321,
database: "postgres",
user: "root",
password: "root",
schema: "public",
ssl: false,
rejectUnauthorized: false,
ca: false,
},
})
2023-01-19 05:46:40 +13:00
2023-01-19 06:07:09 +13:00
makeRequest = generateMakeRequest(apiKey)
postgresTable = await config.createTable({
name: faker.lorem.word(),
schema: {
name: {
name: "name",
type: FieldType.STRING,
constraints: {
presence: true,
},
},
description: {
name: "description",
type: FieldType.STRING,
},
value: {
name: "value",
type: FieldType.NUMBER,
2023-01-19 05:46:40 +13:00
},
},
2023-01-19 06:07:09 +13:00
sourceId: postgresDatasource._id,
})
2023-01-19 05:46:40 +13:00
})
2023-01-18 06:22:31 +13:00
2023-01-19 06:07:09 +13:00
afterAll(async () => {
await config.end()
})
function createRandomRow() {
return {
name: faker.name.fullName(),
description: faker.lorem.paragraphs(),
value: +faker.random.numeric(),
}
}
2023-01-18 06:22:31 +13:00
2023-01-20 00:06:41 +13:00
async function populateRows(count: number, tableId?: string) {
2023-01-19 06:07:09 +13:00
return await Promise.all(
Array(count)
.fill({})
.map(async () => {
const rowData = createRandomRow()
return {
rowData,
2023-01-20 00:00:51 +13:00
row: await config.createRow({
2023-01-20 00:06:41 +13:00
tableId: tableId || postgresTable._id,
2023-01-20 00:00:51 +13:00
...rowData,
}),
2023-01-19 06:07:09 +13:00
}
})
)
2023-01-19 05:46:40 +13:00
}
2023-01-18 06:22:31 +13:00
describe("create a row", () => {
2023-01-19 06:07:09 +13:00
test("Given than no row exists, adding a new row persists it", async () => {
2023-01-19 05:46:40 +13:00
const newRow = createRandomRow()
2023-01-18 06:22:31 +13:00
2023-01-19 05:46:40 +13:00
const res = await makeRequest(
"post",
`/tables/${postgresTable._id}/rows`,
newRow
)
2023-01-18 06:22:31 +13:00
expect(res.status).toBe(200)
2023-01-18 06:39:59 +13:00
2023-01-19 05:46:40 +13:00
const persistedRows = await config.getRows(postgresTable._id!)
2023-01-18 06:39:59 +13:00
expect(persistedRows).toHaveLength(1)
expect(persistedRows).toEqual([
expect.objectContaining({
...res.body.data,
...newRow,
}),
])
2023-01-18 06:22:31 +13:00
})
2023-01-19 01:26:26 +13:00
test("Given than no row exists, multiple rows can be persisted", async () => {
const numberOfRows = 10
2023-01-19 05:46:40 +13:00
const newRows = Array(numberOfRows).fill(createRandomRow())
2023-01-19 01:26:26 +13:00
for (const newRow of newRows) {
const res = await makeRequest(
"post",
2023-01-19 05:46:40 +13:00
`/tables/${postgresTable._id}/rows`,
2023-01-19 01:26:26 +13:00
newRow
)
expect(res.status).toBe(200)
}
2023-01-19 05:46:40 +13:00
const persistedRows = await config.getRows(postgresTable._id!)
2023-01-19 01:26:26 +13:00
expect(persistedRows).toHaveLength(numberOfRows)
2023-01-19 05:06:45 +13:00
expect(persistedRows).toEqual(
expect.arrayContaining(newRows.map(expect.objectContaining))
)
2023-01-19 01:26:26 +13:00
})
2023-01-18 06:22:31 +13:00
})
2023-01-19 05:46:40 +13:00
2023-01-19 06:11:52 +13:00
describe("update a row", () => {
test("Given than a row exists, updating it persists it", async () => {
let { rowData, row } = _.sample(await populateRows(10))!
const newName = faker.random.words(3)
const newValue = +faker.random.numeric()
const updateRow = {
name: newName,
value: newValue,
}
const res = await makeRequest(
"put",
`/tables/${postgresTable._id}/rows/${row._id}`,
updateRow
)
expect(res.status).toBe(200)
2023-01-19 06:21:17 +13:00
const persistedRow = await config.getRow(postgresTable._id!, row._id!)
2023-01-19 06:11:52 +13:00
2023-01-19 06:21:17 +13:00
expect(persistedRow).toEqual(
2023-01-19 06:11:52 +13:00
expect.objectContaining({
...res.body.data,
...rowData,
...updateRow,
})
)
})
})
2023-01-19 06:21:17 +13:00
describe("delete a row", () => {
test("Given than a row exists, delete request removes it", async () => {
const numberOfInitialRows = 5
let { row } = _.sample(await populateRows(numberOfInitialRows))!
const res = await makeRequest(
"delete",
`/tables/${postgresTable._id}/rows/${row._id}`
)
expect(res.status).toBe(200)
const persistedRows = await config.getRows(postgresTable._id!)
expect(persistedRows).toHaveLength(numberOfInitialRows - 1)
expect(row._id).toBeDefined()
expect(persistedRows).not.toContain(
expect.objectContaining({ _id: row._id })
)
})
})
2023-01-19 06:07:09 +13:00
describe("retrieve a row", () => {
2023-01-19 05:46:40 +13:00
test("Given than a table have a single row, the row can be retrieved successfully", async () => {
2023-01-19 06:07:09 +13:00
const [{ rowData, row }] = await populateRows(1)
2023-01-19 05:46:40 +13:00
const res = await makeRequest(
"get",
`/tables/${postgresTable._id}/rows/${row._id}`
)
expect(res.status).toBe(200)
expect(res.body.data).toEqual(expect.objectContaining(rowData))
})
2023-01-19 05:48:18 +13:00
test("Given than a table have a multiple rows, a single row can be retrieved successfully", async () => {
2023-01-19 06:07:09 +13:00
const rows = await populateRows(10)
const { rowData, row } = _.sample(rows)!
2023-01-19 05:48:18 +13:00
const res = await makeRequest(
"get",
`/tables/${postgresTable._id}/rows/${row._id}`
)
expect(res.status).toBe(200)
expect(res.body.data).toEqual(expect.objectContaining(rowData))
})
2023-01-19 05:46:40 +13:00
})
2023-01-20 00:00:51 +13:00
describe("search for rows", () => {
2023-01-20 00:06:41 +13:00
test("Given than a table has no rows, search without query returns empty", async () => {
const res = await makeRequest(
"post",
`/tables/${postgresTable._id}/rows/search`
)
expect(res.status).toBe(200)
expect(res.body.data).toHaveLength(0)
})
test("Given than a table has multiple rows, search without query returns all of them", async () => {
2023-01-20 00:00:51 +13:00
const rowsCount = 6
const rows = await populateRows(rowsCount)
const res = await makeRequest(
"post",
`/tables/${postgresTable._id}/rows/search`
)
expect(res.status).toBe(200)
expect(res.body.data).toHaveLength(rowsCount)
expect(res.body.data).toEqual(
expect.arrayContaining(
rows.map(r => expect.objectContaining(r.rowData))
)
)
})
2023-01-20 00:06:41 +13:00
test("Given than multiple tables have multiple rows, search only return the requested ones", async () => {
await populateRows(2, (await config.createTable())._id)
const rowsCount = 6
await populateRows(rowsCount)
await populateRows(2, (await config.createTable())._id)
const res = await makeRequest(
"post",
`/tables/${postgresTable._id}/rows/search`
)
expect(res.status).toBe(200)
expect(res.body.data).toHaveLength(rowsCount)
})
2023-01-20 00:00:51 +13:00
})
2023-01-18 06:22:31 +13:00
})