From 3492671021f091f2b0f673cf2fdd9a73d8d1f83f Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Wed, 31 Aug 2022 17:21:09 +0530 Subject: [PATCH] refactor/Added lookup unit test for table row api --- .../unit/rest/tests/helpers/column.ts | 81 +++++++++++++++---- .../unit/rest/tests/tableRow.test.ts | 53 ++++++++++-- 2 files changed, 113 insertions(+), 21 deletions(-) diff --git a/packages/nocodb/src/__tests__/unit/rest/tests/helpers/column.ts b/packages/nocodb/src/__tests__/unit/rest/tests/helpers/column.ts index dbfc8e23d2..29e809a9c9 100644 --- a/packages/nocodb/src/__tests__/unit/rest/tests/helpers/column.ts +++ b/packages/nocodb/src/__tests__/unit/rest/tests/helpers/column.ts @@ -175,48 +175,101 @@ const createRollupColumn = async ( project, title, rollupFunction, - parentTable, - childTableName, - childTableColumnTitle, + table, + relatedTableName, + relatedTableColumnTitle, }: { project: any; title: string; rollupFunction: string; - parentTable: Model; - childTableName: string; - childTableColumnTitle: string; + table: Model; + relatedTableName: string; + relatedTableColumnTitle: string; } ) => { const childTable = await Model.getByIdOrName({ project_id: project.id, base_id: project.bases[0].id, - table_name: childTableName, + table_name: relatedTableName, }); const childTableColumns = await childTable.getColumns(); const childTableColumn = await childTableColumns.find( - (column) => column.title === childTableColumnTitle + (column) => column.title === relatedTableColumnTitle ); - const ltarColumn = (await parentTable.getColumns()).find( + const ltarColumn = (await table.getColumns()).find( (column) => column.uidt === UITypes.LinkToAnotherRecord && column.colOptions?.fk_related_model_id === childTable.id ); - await createColumn(context, parentTable, { + await createColumn(context, table, { title: title, uidt: UITypes.Rollup, fk_relation_column_id: ltarColumn?.id, fk_rollup_column_id: childTableColumn?.id, rollup_function: rollupFunction, - table_name: parentTable.table_name, + table_name: table.table_name, column_name: title, }); - const rollupColumn = (await parentTable.getColumns()).find( + const rollupColumn = (await table.getColumns()).find( (column) => column.title === title - ); + )!; return rollupColumn; }; -export { defaultColumns, createColumn, createRollupColumn }; +const createLookupColumn = async ( + context, + { + project, + title, + table, + relatedTableName, + relatedTableColumnTitle, + }: { + project: any; + title: string; + table: Model; + relatedTableName: string; + relatedTableColumnTitle: string; + } +) => { + const childTable = await Model.getByIdOrName({ + project_id: project.id, + base_id: project.bases[0].id, + table_name: relatedTableName, + }); + const childTableColumns = await childTable.getColumns(); + const childTableColumn = await childTableColumns.find( + (column) => column.title === relatedTableColumnTitle + ); + + if (!childTableColumn) { + throw new Error( + `Could not find column ${relatedTableColumnTitle} in ${relatedTableName}` + ); + } + + const ltarColumn = (await table.getColumns()).find( + (column) => + column.uidt === UITypes.LinkToAnotherRecord && + column.colOptions?.fk_related_model_id === childTable.id + ); + await createColumn(context, table, { + title: title, + uidt: UITypes.Lookup, + fk_relation_column_id: ltarColumn?.id, + fk_lookup_column_id: childTableColumn?.id, + table_name: table.table_name, + column_name: title, + }); + + const lookupColumn = (await table.getColumns()).find( + (column) => column.title === title + )!; + + return lookupColumn; +}; + +export { defaultColumns, createColumn, createRollupColumn, createLookupColumn }; 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 7472202fdd..74aef0bb51 100644 --- a/packages/nocodb/src/__tests__/unit/rest/tests/tableRow.test.ts +++ b/packages/nocodb/src/__tests__/unit/rest/tests/tableRow.test.ts @@ -4,7 +4,7 @@ import Model from '../../../../lib/models/Model'; import init from '../init'; import request from 'supertest'; import { ColumnType } from 'nocodb-sdk'; -import { createRollupColumn } from './helpers/column'; +import { createLookupColumn, createRollupColumn } from './helpers/column'; const isColumnsCorrectInResponse = (response, columns: ColumnType[]) => { const responseColumnsListStr = Object.keys(response.body.list[0]) @@ -182,15 +182,13 @@ function tableTest() { }); it('Get sorted table data list with a rollup column', async function () { - const rollupColumnName = 'Number of rentals'; - const rollupColumn = await createRollupColumn(context, { project, - title: rollupColumnName, + title: 'Number of rentals', rollupFunction: 'count', - parentTable: customerTable, - childTableName: 'rental', - childTableColumnTitle: 'RentalDate', + table: customerTable, + relatedTableName: 'rental', + relatedTableColumnTitle: 'RentalDate', }); const ascResponse = await request(context.app) @@ -217,6 +215,47 @@ function tableTest() { if (descResponse.body.list[0]['FirstName'] !== 'ELEANOR') throw new Error('Wrong sort'); }); + + it('Get sorted table data list with a lookup column', async function () { + const rentalTable = await Model.getByIdOrName({ + project_id: project.id, + base_id: project.bases[0].id, + table_name: 'rental', + }); + + const lookupColumn = await createLookupColumn(context, { + project, + title: 'Lookup', + table: rentalTable, + relatedTableName: customerTable.table_name, + relatedTableColumnTitle: 'FirstName', + }); + + const ascResponse = await request(context.app) + .get(`/api/v1/db/data/noco/${project.id}/${rentalTable.id}`) + .set('xc-auth', context.token) + .query({ + sortArrJson: JSON.stringify([ + { fk_column_id: lookupColumn?.id, direction: 'asc' }, + ]), + }) + .expect(200); + + if (ascResponse.body.list[0][lookupColumn.title] !== 'AARON') + throw new Error('Wrong sort'); + + const descResponse = await request(context.app) + .get(`/api/v1/db/data/noco/${project.id}/${rentalTable.id}`) + .set('xc-auth', context.token) + .query({ + sortArrJson: JSON.stringify([ + { fk_column_id: lookupColumn?.id, direction: 'desc' }, + ]), + }) + .expect(200); + if (descResponse.body.list[0][lookupColumn.title] !== 'ZACHARY') + throw new Error('Wrong sort'); + }); } export default function () {