From 5351a54433b6998ae030e6d95b5891d905818e66 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 2 Sep 2022 10:51:40 +0530 Subject: [PATCH] refactor/Added unit test to get groupby, read, and update table row api --- .../__tests__/unit/rest/tests/factory/row.ts | 2 + .../unit/rest/tests/factory/table.ts | 3 +- .../unit/rest/tests/tableRow.test.ts | 115 ++++++++++++++++++ .../sql-data-mapper/lib/sql/BaseModelSqlv2.ts | 1 + 4 files changed, 120 insertions(+), 1 deletion(-) diff --git a/packages/nocodb/src/__tests__/unit/rest/tests/factory/row.ts b/packages/nocodb/src/__tests__/unit/rest/tests/factory/row.ts index 63bfd62501..ca7de6efc6 100644 --- a/packages/nocodb/src/__tests__/unit/rest/tests/factory/row.ts +++ b/packages/nocodb/src/__tests__/unit/rest/tests/factory/row.ts @@ -3,6 +3,8 @@ import request from 'supertest'; const rowValue = (column: ColumnType, index: number) => { switch (column.uidt) { + case UITypes.ID: + return index; case UITypes.Number: return index; case UITypes.SingleLineText: diff --git a/packages/nocodb/src/__tests__/unit/rest/tests/factory/table.ts b/packages/nocodb/src/__tests__/unit/rest/tests/factory/table.ts index 5f5afa2fd6..b2ba0b5fc9 100644 --- a/packages/nocodb/src/__tests__/unit/rest/tests/factory/table.ts +++ b/packages/nocodb/src/__tests__/unit/rest/tests/factory/table.ts @@ -1,4 +1,5 @@ import request from 'supertest'; +import Model from '../../../../../lib/models/Model'; import { defaultColumns } from './column'; const defaultTableValue = { @@ -13,7 +14,7 @@ const createTable = async (context, project, args = {}) => { .set('xc-auth', context.token) .send({ ...defaultTableValue, ...args }); - const table = response.body; + const table = await Model.get(response.body.id); return table; }; diff --git a/packages/nocodb/src/__tests__/unit/rest/tests/tableRow.test.ts b/packages/nocodb/src/__tests__/unit/rest/tests/tableRow.test.ts index 4b292fcdc9..90b8b85b2c 100644 --- a/packages/nocodb/src/__tests__/unit/rest/tests/tableRow.test.ts +++ b/packages/nocodb/src/__tests__/unit/rest/tests/tableRow.test.ts @@ -10,6 +10,7 @@ import { createRollupColumn, } from './factory/column'; import { createTable } from './factory/table'; +import { createRow } from './factory/row'; const isColumnsCorrectInResponse = (row, columns: ColumnType[]) => { const responseColumnsListStr = Object.keys(row).sort().join(','); @@ -987,6 +988,120 @@ function tableTest() { throw new Error('Wrong nested fields'); } }); + + it('Groupby desc sorted and with rollup table data list with required columns', async function () { + const firstNameColumn = customerColumns.find( + (col) => col.title === 'FirstName' + ); + + const rollupColumn = await createRollupColumn(context, { + project: sakilaProject, + title: 'Rollup', + rollupFunction: 'count', + table: customerTable, + relatedTableName: 'rental', + relatedTableColumnTitle: 'RentalDate', + }); + + const visibleColumns = [firstNameColumn]; + const sortInfo = `-FirstName, +${rollupColumn.title}`; + + const response = await request(context.app) + .get( + `/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/groupby` + ) + .set('xc-auth', context.token) + .query({ + fields: visibleColumns.map((c) => c.title), + sort: sortInfo, + column_name: firstNameColumn.column_name, + }) + .expect(200); + + if ( + response.body.list[4]['first_name'] !== 'WILLIE' || + response.body.list[4]['count'] !== 2 + ) + throw new Error('Wrong groupby'); + }); + + it('Groupby desc sorted and with rollup table data list with required columns', async function () { + const firstNameColumn = customerColumns.find( + (col) => col.title === 'FirstName' + ); + + const rollupColumn = await createRollupColumn(context, { + project: sakilaProject, + title: 'Rollup', + rollupFunction: 'count', + table: customerTable, + relatedTableName: 'rental', + relatedTableColumnTitle: 'RentalDate', + }); + + const visibleColumns = [firstNameColumn]; + const sortInfo = `-FirstName, +${rollupColumn.title}`; + + const response = await request(context.app) + .get( + `/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/groupby` + ) + .set('xc-auth', context.token) + .query({ + fields: visibleColumns.map((c) => c.title), + sort: sortInfo, + column_name: firstNameColumn.column_name, + offset: 4, + }) + .expect(200); + + if ( + response.body.list[0]['first_name'] !== 'WILLIE' || + response.body.list[0]['count'] !== 2 + ) + throw new Error('Wrong groupby'); + }); + + it('Read table row', async function () { + const listResponse = await request(context.app) + .get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}`) + .set('xc-auth', context.token) + .expect(200); + + const row = listResponse.body.list[0]; + + const readResponse = await request(context.app) + .get( + `/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/${row['CustomerId']}` + ) + .set('xc-auth', context.token) + .expect(200); + + if ( + row['CustomerId'] !== readResponse.body['CustomerId'] || + row['FirstName'] !== readResponse.body['FirstName'] + ) { + throw new Error('Wrong read'); + } + }); + + it('Update table row', async function () { + const table = await createTable(context, project); + const columns = await table.getColumns(); + const row = await createRow(context, project, table, columns, 0); + + const updateResponse = await request(context.app) + .patch(`/api/v1/db/data/noco/${project.id}/${table.id}/${row['Id']}`) + .set('xc-auth', context.token) + .send({ + title: 'Updated', + }) + .expect(200); + + if (updateResponse.body['Title'] !== 'Updated') { + throw new Error('Wrong update'); + } + }); } export default function () { diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts index e2b249227c..baf121d342 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts @@ -320,6 +320,7 @@ class BaseModelSqlv2 { return (this.isPg ? res.rows[0] : res[0][0] ?? res[0]).count; } + // todo: add support for sortArrJson and filterArrJson async groupBy( args: { where?: string;