mirror of https://github.com/nocodb/nocodb
3 changed files with 184 additions and 1 deletions
@ -0,0 +1,182 @@ |
|||||||
|
import 'mocha'; |
||||||
|
import { createProject, createSakilaProject } from './factory/project'; |
||||||
|
import init from '../init'; |
||||||
|
import request from 'supertest'; |
||||||
|
import Project from '../../../../src/lib/models/Project'; |
||||||
|
import Model from '../../../../src/lib/models/Model'; |
||||||
|
import { getTable } from './factory/table'; |
||||||
|
import View from '../../../../src/lib/models/View'; |
||||||
|
import { ColumnType } from 'nocodb-sdk'; |
||||||
|
|
||||||
|
const isColumnsCorrectInResponse = (row, columns: ColumnType[]) => { |
||||||
|
const responseColumnsListStr = Object.keys(row).sort().join(','); |
||||||
|
const customerColumnsListStr = columns |
||||||
|
.map((c) => c.title) |
||||||
|
.sort() |
||||||
|
.join(','); |
||||||
|
|
||||||
|
return responseColumnsListStr === customerColumnsListStr; |
||||||
|
}; |
||||||
|
|
||||||
|
function tableTest() { |
||||||
|
let context; |
||||||
|
let project: Project; |
||||||
|
let sakilaProject: Project; |
||||||
|
let customerTable: Model; |
||||||
|
let customerColumns; |
||||||
|
|
||||||
|
beforeEach(async function () { |
||||||
|
context = await init(); |
||||||
|
|
||||||
|
sakilaProject = await createSakilaProject(context); |
||||||
|
project = await createProject(context); |
||||||
|
customerTable = await getTable({project: sakilaProject, name: 'customer'}) |
||||||
|
customerColumns = await customerTable.getColumns(); |
||||||
|
}); |
||||||
|
|
||||||
|
it.only('Get view row list', async () => { |
||||||
|
const view = (await View.list(customerTable.id))[0] |
||||||
|
const response = await request(context.app) |
||||||
|
.get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`) |
||||||
|
.set('xc-auth', context.token) |
||||||
|
.expect(200); |
||||||
|
|
||||||
|
const pageInfo = response.body.pageInfo; |
||||||
|
|
||||||
|
if(pageInfo.totalRows !== 599 || response.body.list[0]['CustomerId'] !== 1){ |
||||||
|
throw new Error('View row list is not correct'); |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
it('Get table data list with required columns', async function () { |
||||||
|
const view = (await View.list(customerTable.id))[0] |
||||||
|
const requiredColumns = customerColumns.filter((_, index) => index < 3); |
||||||
|
|
||||||
|
const response = await request(context.app) |
||||||
|
.get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`) |
||||||
|
.set('xc-auth', context.token) |
||||||
|
.query({ |
||||||
|
fields: requiredColumns.map((c) => c.title), |
||||||
|
}) |
||||||
|
.expect(200); |
||||||
|
const pageInfo = response.body.pageInfo; |
||||||
|
|
||||||
|
if (response.body.list.length !== pageInfo.pageSize) { |
||||||
|
throw new Error('Wrong number of rows'); |
||||||
|
} |
||||||
|
|
||||||
|
if (!isColumnsCorrectInResponse(response.body.list[0], requiredColumns)) { |
||||||
|
throw new Error('Wrong columns'); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
it('Get desc sorted table data list with required columns', async function () { |
||||||
|
const view = (await View.list(customerTable.id))[0] |
||||||
|
const firstNameColumn = customerColumns.find( |
||||||
|
(col) => col.title === 'FirstName' |
||||||
|
); |
||||||
|
const visibleColumns = [firstNameColumn]; |
||||||
|
const sortInfo = [{ fk_column_id: firstNameColumn.id, direction: 'desc' }]; |
||||||
|
|
||||||
|
const response = await request(context.app) |
||||||
|
.get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`) |
||||||
|
.set('xc-auth', context.token) |
||||||
|
.query({ |
||||||
|
fields: visibleColumns.map((c) => c.title), |
||||||
|
sortArrJson: JSON.stringify(sortInfo), |
||||||
|
}) |
||||||
|
.expect(200); |
||||||
|
const pageInfo = response.body.pageInfo; |
||||||
|
|
||||||
|
if (response.body.list.length !== pageInfo.pageSize) { |
||||||
|
throw new Error('Wrong number of rows'); |
||||||
|
} |
||||||
|
|
||||||
|
if (!isColumnsCorrectInResponse(response.body.list[0], visibleColumns)) { |
||||||
|
console.log(response.body.list); |
||||||
|
throw new Error('Wrong columns'); |
||||||
|
} |
||||||
|
|
||||||
|
if (response.body.list[0][firstNameColumn.title] !== 'ZACHARY') { |
||||||
|
console.log(response.body.list); |
||||||
|
throw new Error('Wrong sort'); |
||||||
|
} |
||||||
|
|
||||||
|
const lastPageOffset = |
||||||
|
Math.trunc(pageInfo.totalRows / pageInfo.pageSize) * pageInfo.pageSize; |
||||||
|
const lastPageResponse = await request(context.app) |
||||||
|
.get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}`) |
||||||
|
.set('xc-auth', context.token) |
||||||
|
.query({ |
||||||
|
fields: visibleColumns.map((c) => c.title), |
||||||
|
sortArrJson: JSON.stringify(sortInfo), |
||||||
|
offset: lastPageOffset, |
||||||
|
}) |
||||||
|
.expect(200); |
||||||
|
|
||||||
|
if ( |
||||||
|
lastPageResponse.body.list[lastPageResponse.body.list.length - 1][ |
||||||
|
firstNameColumn.title |
||||||
|
] !== 'AARON' |
||||||
|
) { |
||||||
|
console.log(lastPageOffset, lastPageResponse.body.list); |
||||||
|
throw new Error('Wrong sort on last page'); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
it('Get asc sorted table data list with required columns', async function () { |
||||||
|
const view = (await View.list(customerTable.id))[0] |
||||||
|
const firstNameColumn = customerColumns.find( |
||||||
|
(col) => col.title === 'FirstName' |
||||||
|
); |
||||||
|
const visibleColumns = [firstNameColumn]; |
||||||
|
const sortInfo = [{ fk_column_id: firstNameColumn.id, direction: 'asc' }]; |
||||||
|
|
||||||
|
const response = await request(context.app) |
||||||
|
.get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`) |
||||||
|
.set('xc-auth', context.token) |
||||||
|
.query({ |
||||||
|
fields: visibleColumns.map((c) => c.title), |
||||||
|
sortArrJson: JSON.stringify(sortInfo), |
||||||
|
}) |
||||||
|
.expect(200); |
||||||
|
const pageInfo = response.body.pageInfo; |
||||||
|
|
||||||
|
if (response.body.list.length !== pageInfo.pageSize) { |
||||||
|
throw new Error('Wrong number of rows'); |
||||||
|
} |
||||||
|
|
||||||
|
if (!isColumnsCorrectInResponse(response.body.list[0], visibleColumns)) { |
||||||
|
console.log(response.body.list); |
||||||
|
throw new Error('Wrong columns'); |
||||||
|
} |
||||||
|
|
||||||
|
if (response.body.list[0][firstNameColumn.title] !== 'AARON') { |
||||||
|
console.log(response.body.list); |
||||||
|
throw new Error('Wrong sort'); |
||||||
|
} |
||||||
|
|
||||||
|
const lastPageOffset = |
||||||
|
Math.trunc(pageInfo.totalRows / pageInfo.pageSize) * pageInfo.pageSize; |
||||||
|
const lastPageResponse = await request(context.app) |
||||||
|
.get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}`) |
||||||
|
.set('xc-auth', context.token) |
||||||
|
.query({ |
||||||
|
fields: visibleColumns.map((c) => c.title), |
||||||
|
sortArrJson: JSON.stringify(sortInfo), |
||||||
|
offset: lastPageOffset, |
||||||
|
}) |
||||||
|
.expect(200); |
||||||
|
|
||||||
|
if ( |
||||||
|
lastPageResponse.body.list[lastPageResponse.body.list.length - 1][ |
||||||
|
firstNameColumn.title |
||||||
|
] !== 'ZACHARY' |
||||||
|
) { |
||||||
|
console.log(lastPageOffset, lastPageResponse.body.list); |
||||||
|
throw new Error('Wrong sort on last page'); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
export default tableTest; |
Loading…
Reference in new issue