Browse Source

Merge pull request #5881 from nocodb/fix/delete-api-error

fix: on delete fail, return error instead of 200 OK
pull/5884/head
Raju Udava 1 year ago committed by GitHub
parent
commit
96be9728f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      packages/nocodb/src/services/datas.service.ts
  2. 8
      packages/nocodb/tests/unit/rest/tests/tableRow.test.ts
  3. 131
      packages/nocodb/tests/unit/rest/tests/viewRow.test.ts

2
packages/nocodb/src/services/datas.service.ts

@ -106,7 +106,7 @@ export class DatasService {
// todo: Should have error http status code
const message = await baseModel.hasLTARData(param.rowId, model);
if (message.length) {
return { message };
NcError.badRequest(message);
}
return await baseModel.delByPk(param.rowId, null, param.cookie);
}

8
packages/nocodb/tests/unit/rest/tests/tableRow.test.ts

@ -1425,7 +1425,7 @@ function tableTest() {
const response = await request(context.app)
.delete(`/api/v1/db/data/noco/${project.id}/${table.id}/${row['Id']}`)
.set('xc-auth', context.token)
.expect(200);
.expect(400);
const deleteRow = await getRow(context, { project, table, id: row['Id'] });
if (!deleteRow) {
@ -1433,11 +1433,9 @@ function tableTest() {
}
if (
!(response.body.message[0] as string).includes(
'is a LinkToAnotherRecord of',
)
!(response.body.msg as string).includes('is a LinkToAnotherRecord of')
) {
throw new Error('Should give ltar foreign key error');
throw new Error('Should give LTAR foreign key error');
}
});

131
packages/nocodb/tests/unit/rest/tests/viewRow.test.ts

@ -1,12 +1,11 @@
import 'mocha';
import { isString } from 'util';
import request from 'supertest';
import { UITypes, ViewTypes } from 'nocodb-sdk';
import { expect } from 'chai';
import init from '../../init';
import { createProject, createSakilaProject } from '../../factory/project';
import request from 'supertest';
import Project from '../../../../src/models/Project';
import Model from '../../../../src/models/Model';
import { createTable, getTable } from '../../factory/table';
import View from '../../../../src/models/View';
import { ColumnType, UITypes, ViewTypes } from 'nocodb-sdk';
import { createView } from '../../factory/view';
import {
createColumn,
@ -21,9 +20,11 @@ import {
getOneRow,
getRow,
} from '../../factory/row';
import { expect } from 'chai';
import { isPg } from '../../init/db';
import { isString } from 'util';
import type { ColumnType } from 'nocodb-sdk';
import type View from '../../../../src/models/View';
import type Model from '../../../../src/models/Model';
import type Project from '../../../../src/models/Project';
// Test case list
// 1. Get view row list g
@ -160,7 +161,7 @@ function viewRowTests() {
const testGetViewRowList = async (view: View) => {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.expect(200);
@ -179,7 +180,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${view.id}/group/${ratingColumn.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${view.id}/group/${ratingColumn.id}`,
)
.set('xc-auth', context.token)
.expect(200);
@ -225,7 +226,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -244,7 +245,7 @@ function viewRowTests() {
requiredColumns.map((c: ColumnType) => ({
title: c.title,
uidt: c.uidt,
}))
})),
);
throw new Error('Wrong columns');
}
@ -271,7 +272,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${view.id}/group/${ratingColumn.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${view.id}/group/${ratingColumn.id}`,
)
.set('xc-auth', context.token)
.query({
@ -287,7 +288,7 @@ function viewRowTests() {
expect(
Object.keys(response.body.find((e) => e.key === 'NC-17').value.list[0])
.sort()
.join(',')
.join(','),
).to.equal('FilmId,Title');
};
@ -297,14 +298,14 @@ function viewRowTests() {
const testDescSortedViewDataList = async (view: View) => {
const firstNameColumn = customerColumns.find(
(col) => col.title === 'FirstName'
(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}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -332,7 +333,7 @@ function viewRowTests() {
Math.trunc(pageInfo.totalRows / pageInfo.pageSize) * pageInfo.pageSize;
const lastPageResponse = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -375,7 +376,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${view.id}/group/${ratingColumn.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${view.id}/group/${ratingColumn.id}`,
)
.set('xc-auth', context.token)
.query({
@ -390,7 +391,7 @@ function viewRowTests() {
expect(response.body).to.be.have.length(6);
expect(
response.body.find((e) => e.key === 'PG').value.list[0].Title
response.body.find((e) => e.key === 'PG').value.list[0].Title,
).to.equal('WORST BANGER');
};
@ -400,14 +401,14 @@ function viewRowTests() {
const testAscSortedViewDataList = async (view: View) => {
const firstNameColumn = customerColumns.find(
(col) => col.title === 'FirstName'
(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}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -435,7 +436,7 @@ function viewRowTests() {
Math.trunc(pageInfo.totalRows / pageInfo.pageSize) * pageInfo.pageSize;
const lastPageResponse = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -478,7 +479,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${view.id}/group/${ratingColumn.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${view.id}/group/${ratingColumn.id}`,
)
.set('xc-auth', context.token)
.query({
@ -493,7 +494,7 @@ function viewRowTests() {
expect(response.body).to.be.have.length(6);
expect(
response.body.find((e) => e.key === 'PG').value.list[0].Title
response.body.find((e) => e.key === 'PG').value.list[0].Title,
).to.equal('ACADEMY DINOSAUR');
};
@ -502,7 +503,7 @@ function viewRowTests() {
});
const testGetViewDataListWithRequiredColumnsAndFilter = async (
viewType: ViewTypes
viewType: ViewTypes,
) => {
const rentalTable = await getTable({
project: sakilaProject,
@ -523,7 +524,7 @@ function viewRowTests() {
});
const paymentListColumn = (await rentalTable.getColumns()).find(
(c) => c.title === 'Payment List'
(c) => c.title === 'Payment List',
);
const nestedFilter = {
@ -549,7 +550,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${rentalTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${rentalTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -560,7 +561,7 @@ function viewRowTests() {
const ascResponse = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${rentalTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${rentalTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -579,7 +580,7 @@ function viewRowTests() {
const descResponse = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${rentalTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${rentalTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -606,7 +607,7 @@ function viewRowTests() {
});
const testGetNestedSortedFilteredTableDataListWithLookupColumn = async (
viewType: ViewTypes
viewType: ViewTypes,
) => {
const view = await createView(context, {
title: 'View',
@ -624,11 +625,11 @@ function viewRowTests() {
});
const paymentListColumn = (await customerTable.getColumns()).find(
(c) => c.title === 'Payment List'
(c) => c.title === 'Payment List',
);
const activeColumn = (await customerTable.getColumns()).find(
(c) => c.title === 'Active'
(c) => c.title === 'Active',
);
const nestedFields = {
@ -681,7 +682,7 @@ function viewRowTests() {
const ascResponse = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.query({
@ -703,7 +704,7 @@ function viewRowTests() {
}
const nestedRentalResponse = Object.keys(
ascResponse.body.list[0]['Rental List'][0]
ascResponse.body.list[0]['Rental List'][0],
);
if (
@ -719,7 +720,7 @@ function viewRowTests() {
it('Get nested sorted filtered table with nested fields data list with a rollup column in customer table view grid', async () => {
await testGetNestedSortedFilteredTableDataListWithLookupColumn(
ViewTypes.GRID
ViewTypes.GRID,
);
});
@ -774,7 +775,7 @@ function viewRowTests() {
await request(context.app)
.post(
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${nonRelatedView.id}`
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${nonRelatedView.id}`,
)
.set('xc-auth', context.token)
.send({
@ -802,7 +803,7 @@ function viewRowTests() {
// todo: Test that all the columns needed to be shown in the view are returned
const testFindOneSortedDataWithRequiredColumns = async (
viewType: ViewTypes
viewType: ViewTypes,
) => {
const view = await createView(context, {
title: 'View',
@ -810,13 +811,13 @@ function viewRowTests() {
type: viewType,
});
const firstNameColumn = customerColumns.find(
(col) => col.title === 'FirstName'
(col) => col.title === 'FirstName',
);
const visibleColumns = [firstNameColumn];
let response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/find-one`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/find-one`,
)
.set('xc-auth', context.token)
.query({
@ -837,7 +838,7 @@ function viewRowTests() {
response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/find-one`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/find-one`,
)
.set('xc-auth', context.token)
.query({
@ -870,7 +871,7 @@ function viewRowTests() {
});
const testFindOneSortedFilteredNestedFieldsDataWithRollup = async (
viewType: ViewTypes
viewType: ViewTypes,
) => {
const rollupColumn = await createRollupColumn(context, {
project: sakilaProject,
@ -893,11 +894,11 @@ function viewRowTests() {
});
const paymentListColumn = (await customerTable.getColumns()).find(
(c) => c.title === 'Payment List'
(c) => c.title === 'Payment List',
);
const activeColumn = (await customerTable.getColumns()).find(
(c) => c.title === 'Active'
(c) => c.title === 'Active',
);
const nestedFields = {
@ -950,7 +951,7 @@ function viewRowTests() {
const ascResponse = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/find-one`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/find-one`,
)
.set('xc-auth', context.token)
.query({
@ -995,7 +996,7 @@ function viewRowTests() {
type: viewType,
});
const firstNameColumn = customerColumns.find(
(col) => col.title === 'FirstName'
(col) => col.title === 'FirstName',
);
const rollupColumn = await createRollupColumn(context, {
@ -1012,7 +1013,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/groupby`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/groupby`,
)
.set('xc-auth', context.token)
.query({
@ -1049,7 +1050,7 @@ function viewRowTests() {
});
const firstNameColumn = customerColumns.find(
(col) => col.title === 'FirstName'
(col) => col.title === 'FirstName',
);
const rollupColumn = await createRollupColumn(context, {
@ -1066,7 +1067,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/groupby`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/groupby`,
)
.set('xc-auth', context.token)
.query({
@ -1105,7 +1106,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/count`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/count`,
)
.set('xc-auth', context.token)
.expect(200);
@ -1136,7 +1137,7 @@ function viewRowTests() {
const listResponse = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}`,
)
.set('xc-auth', context.token)
.expect(200);
@ -1145,7 +1146,7 @@ function viewRowTests() {
const readResponse = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/${row['CustomerId']}`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/${row['CustomerId']}`,
)
.set('xc-auth', context.token)
.expect(200);
@ -1181,7 +1182,7 @@ function viewRowTests() {
const updateResponse = await request(context.app)
.patch(
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`,
)
.set('xc-auth', context.token)
.send({
@ -1207,7 +1208,7 @@ function viewRowTests() {
});
const testUpdateViewRowWithValidationAndInvalidData = async (
viewType: ViewTypes
viewType: ViewTypes,
) => {
const table = await createTable(context, project);
const emailColumn = await createColumn(context, table, {
@ -1228,7 +1229,7 @@ function viewRowTests() {
await request(context.app)
.patch(
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`,
)
.set('xc-auth', context.token)
.send({
@ -1253,7 +1254,7 @@ function viewRowTests() {
// todo: Test with form view
const testUpdateViewRowWithValidationAndValidData = async (
viewType: ViewTypes
viewType: ViewTypes,
) => {
const table = await createTable(context, project);
const emailColumn = await createColumn(context, table, {
@ -1273,7 +1274,7 @@ function viewRowTests() {
const response = await request(context.app)
.patch(
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`,
)
.set('xc-auth', context.token)
.send({
@ -1314,7 +1315,7 @@ function viewRowTests() {
await request(context.app)
.delete(
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`,
)
.set('xc-auth', context.token)
.expect(200);
@ -1339,7 +1340,7 @@ function viewRowTests() {
});
const testDeleteViewRowWithForiegnKeyConstraint = async (
viewType: ViewTypes
viewType: ViewTypes,
) => {
const table = await createTable(context, project);
const relatedTable = await createTable(context, project, {
@ -1371,10 +1372,10 @@ function viewRowTests() {
const response = await request(context.app)
.delete(
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`
`/api/v1/db/data/noco/${project.id}/${table.id}/views/${view.id}/${row['Id']}`,
)
.set('xc-auth', context.token)
.expect(200);
.expect(400);
const deleteRow = await getRow(context, { project, table, id: row['Id'] });
if (!deleteRow) {
@ -1382,9 +1383,7 @@ function viewRowTests() {
}
if (
!(response.body.message[0] as string).includes(
'is a LinkToAnotherRecord of'
)
!(response.body.msg as string).includes('is a LinkToAnotherRecord of')
) {
throw new Error('Should give ltar foreign key error');
}
@ -1415,7 +1414,7 @@ function viewRowTests() {
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/${row['CustomerId']}/exist`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/${row['CustomerId']}/exist`,
)
.set('xc-auth', context.token)
.expect(200);
@ -1445,7 +1444,7 @@ function viewRowTests() {
});
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/999999/exist`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}/views/${view.id}/999999/exist`,
)
.set('xc-auth', context.token)
.expect(200);
@ -1475,7 +1474,7 @@ function viewRowTests() {
});
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.title}/views/${view.id}/export/csv`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.title}/views/${view.id}/export/csv`,
)
.set('xc-auth', context.token)
.expect(200);
@ -1499,7 +1498,7 @@ function viewRowTests() {
});
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.title}/views/${view.id}/export/excel`
`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.title}/views/${view.id}/export/excel`,
)
.set('xc-auth', context.token)
.expect(200);

Loading…
Cancel
Save