From 244abd3f280c61dc980553dae03f39c55bc09d17 Mon Sep 17 00:00:00 2001 From: Miroslav Kramolinski Date: Tue, 20 Jan 2026 17:14:40 +0200 Subject: [PATCH 1/6] Add support for DELETE /2.0/reports/{reportId} --- lib/reports/index.ts | 7 ++ lib/reports/types.ts | 13 +++ test/mock-api/reports/delete-reports.spec.ts | 96 ++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 test/mock-api/reports/delete-reports.spec.ts diff --git a/lib/reports/index.ts b/lib/reports/index.ts index b4fd0bb..e8f53ae 100644 --- a/lib/reports/index.ts +++ b/lib/reports/index.ts @@ -16,6 +16,8 @@ import type { ReportPublish, SetReportPublishStatusOptions, SetReportPublishStatusResponse, + DeleteReportOptions, + DeleteReportResponse, } from './types'; import * as constants from '../utils/constants'; @@ -87,6 +89,11 @@ export function create(options: CreateOptions): ReportsApi { return requestor.put({ ...optionsToSend, ...urlOptions, ...putOptions }, callback); }; + const deleteReport = (deleteOptions: DeleteReportOptions, callback?: RequestCallback) => { + const urlOptions = { url: options.apiUrls.reports + '/delete/' + deleteOptions.reportId }; + return requestor.delete({ ...optionsToSend, ...urlOptions, ...deleteOptions }, callback); + }; + return { listReports, getReport, diff --git a/lib/reports/types.ts b/lib/reports/types.ts index 891cdb3..7834a0e 100644 --- a/lib/reports/types.ts +++ b/lib/reports/types.ts @@ -722,3 +722,16 @@ export interface SetReportPublishStatusResponse extends BaseResponseStatus { failedItems?: FailedItem[]; result: ReportPublish; } + +// ============================================================================ +// Delete Report +// ============================================================================ + +export interface DeleteReportOptions extends RequestOptions { + /** + * Report Id + */ + reportId: number; +} + +export type DeleteReportResponse = BaseResponseStatus; \ No newline at end of file diff --git a/test/mock-api/reports/delete-reports.spec.ts b/test/mock-api/reports/delete-reports.spec.ts new file mode 100644 index 0000000..911ec47 --- /dev/null +++ b/test/mock-api/reports/delete-reports.spec.ts @@ -0,0 +1,96 @@ +import crypto from 'crypto'; +import { createClient, findWireMockRequest } from '../utils/utils'; +import { expect } from '@jest/globals'; +import { + TEST_REPORT_ID, + TEST_REPORT_NAME, + TEST_REPORT_PERMALINK, + TEST_REPORT_ACCESS_LEVEL, + TEST_MODIFIED_SINCE, + TEST_SUCCESS_MESSAGE, + TEST_SUCCESS_RESULT_CODE, + ERROR_500_STATUS_CODE, + ERROR_500_MESSAGE, + ERROR_400_STATUS_CODE, + ERROR_400_MESSAGE +} from './common_test_constants'; + +describe('Reports - deleteReport endpoint tests', () => { + const client = createClient(); + + it('deleteReport generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + reportId: TEST_REPORT_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/reports/delete-report/all-response-body-properties' + } + }; + await client.reports.deleteReport(options); + const matchedRequest = await findWireMockRequest(requestId); + const parsedUrl = new URL(matchedRequest.absoluteUrl); + expect(parsedUrl.pathname).toEqual("/2.0/reports/" + TEST_REPORT_ID); + + const queryParamsObject = Object.fromEntries(parsedUrl.searchParams); + expect(queryParamsObject).toEqual({ + reportId: TEST_REPORT_ID + }); + }); + + it('deleteReport all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + reportId: TEST_REPORT_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/reports/delete-report/all-response-body-properties' + } + }; + + const response = await client.reports.deleteReport(options); + + expect(response).toEqual({ + message: TEST_SUCCESS_MESSAGE, + resultCode: TEST_SUCCESS_RESULT_CODE + }); + }); + + it('deleteReport error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + reportId: TEST_REPORT_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + + try { + await client.reports.deleteReport(options); + expect(true).toBe(false); // Expected an error to be thrown + } catch (error) { + expect(error.statusCode).toBe(ERROR_500_STATUS_CODE); + expect(error.message).toBe(ERROR_500_MESSAGE); + } + }); + + it('listReports error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + reportId: TEST_REPORT_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + + try { + await client.reports.deleteReport(options); + expect(true).toBe(false); // Expected an error to be thrown + } catch (error) { + expect(error.statusCode).toBe(ERROR_400_STATUS_CODE); + expect(error.message).toBe(ERROR_400_MESSAGE); + } + }); +}); From 81f5ae4ac0ee9aa45a95989b425765af0dfd5c81 Mon Sep 17 00:00:00 2001 From: Miroslav Kramolinski Date: Tue, 20 Jan 2026 17:15:35 +0200 Subject: [PATCH 2/6] Fix typo --- test/mock-api/reports/delete-reports.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/mock-api/reports/delete-reports.spec.ts b/test/mock-api/reports/delete-reports.spec.ts index 911ec47..c32ba24 100644 --- a/test/mock-api/reports/delete-reports.spec.ts +++ b/test/mock-api/reports/delete-reports.spec.ts @@ -75,7 +75,7 @@ describe('Reports - deleteReport endpoint tests', () => { } }); - it('listReports error 400 response', async () => { + it('deleteReport error 400 response', async () => { const requestId = crypto.randomUUID(); const options = { reportId: TEST_REPORT_ID, From 905211343835861587fb54e5dd196a76e1347453 Mon Sep 17 00:00:00 2001 From: Miroslav Kramolinski Date: Tue, 20 Jan 2026 17:17:19 +0200 Subject: [PATCH 3/6] Clean unused imports --- test/mock-api/reports/delete-reports.spec.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/mock-api/reports/delete-reports.spec.ts b/test/mock-api/reports/delete-reports.spec.ts index c32ba24..f6ded80 100644 --- a/test/mock-api/reports/delete-reports.spec.ts +++ b/test/mock-api/reports/delete-reports.spec.ts @@ -3,10 +3,6 @@ import { createClient, findWireMockRequest } from '../utils/utils'; import { expect } from '@jest/globals'; import { TEST_REPORT_ID, - TEST_REPORT_NAME, - TEST_REPORT_PERMALINK, - TEST_REPORT_ACCESS_LEVEL, - TEST_MODIFIED_SINCE, TEST_SUCCESS_MESSAGE, TEST_SUCCESS_RESULT_CODE, ERROR_500_STATUS_CODE, From 20b094d9e1beae95e08483d00164c69d9ffb264c Mon Sep 17 00:00:00 2001 From: Miroslav Kramolinski Date: Wed, 21 Jan 2026 11:51:59 +0200 Subject: [PATCH 4/6] Added missing specs --- lib/reports/index.ts | 1 + lib/reports/types.ts | 22 ++++++++++++++++++++++ test/functional/client.spec.ts | 4 ++++ test/functional/endpoints.spec.ts | 1 + 4 files changed, 28 insertions(+) diff --git a/lib/reports/index.ts b/lib/reports/index.ts index e8f53ae..c573d56 100644 --- a/lib/reports/index.ts +++ b/lib/reports/index.ts @@ -102,6 +102,7 @@ export function create(options: CreateOptions): ReportsApi { getReportAsCSV, getReportPublishStatus, setReportPublishStatus, + deleteReport, ...shares.create(options), }; } diff --git a/lib/reports/types.ts b/lib/reports/types.ts index 7834a0e..5d5ec9c 100644 --- a/lib/reports/types.ts +++ b/lib/reports/types.ts @@ -175,6 +175,28 @@ export interface ReportsApi { options: SetReportPublishStatusOptions, callback?: RequestCallback ) => Promise; + + /** + * Deletes the specified Report. + * + * @param options - {@link DeleteReportOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link DeleteReportResponse}\> - Optional callback function + * @returns Promise\<{@link DeleteReportResponse}\> + * + * @remarks + * It mirrors to the following Smartsheet REST API method: `DELETE /2.0/reports/{reportId}` + * + * @example + * ```typescript + * const result = await client.reports.deleteReport({ + * reportId: 11235813 + * }); + * ``` + */ + deleteReport: ( + options: DeleteReportOptions, + callback?: RequestCallback + ) => Promise; } // ============================================================================ diff --git a/test/functional/client.spec.ts b/test/functional/client.spec.ts index 65375a8..4f44b82 100644 --- a/test/functional/client.spec.ts +++ b/test/functional/client.spec.ts @@ -195,6 +195,10 @@ describe('Client Unit Tests', () => { expect(smartsheet.reports).toHaveProperty('setReportPublishStatus'); expect(smartsheet.reports).toHaveProperty('sendReportViaEmail'); }); + + it('should have delete methods', () => { + expect(smartsheet.reports).toHaveProperty('deleteReport'); + }); }); describe('#server', () => { diff --git a/test/functional/endpoints.spec.ts b/test/functional/endpoints.spec.ts index 9dd5d14..01e5864 100644 --- a/test/functional/endpoints.spec.ts +++ b/test/functional/endpoints.spec.ts @@ -103,6 +103,7 @@ describe('Method Unit Tests', () => { { name: 'getReportAsCSV', stub: 'get', options: {reportId: 123}, expectedRequest: {url: "reports/123", accept: constants.acceptHeaders.textCsv }}, { name: 'getReportPublishStatus', stub: 'get', options: {reportId: 123}, expectedRequest: {url: "reports/123/publish" }}, { name: 'setReportPublishStatus', stub: 'put', options: {reportId: 123}, expectedRequest: {url: "reports/123/publish" }}, + { name: 'deleteReport', stub: 'delete', options: {reportId:123}, expectedRequest: {url: "reports/123"}}, ] }, { From 93f1982e75a43dff3b594bda70c8ff83593b9273 Mon Sep 17 00:00:00 2001 From: Miroslav Kramolinski Date: Wed, 21 Jan 2026 12:29:19 +0200 Subject: [PATCH 5/6] Fix prettier failure --- lib/reports/types.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/reports/types.ts b/lib/reports/types.ts index 5d5ec9c..e3b4bc9 100644 --- a/lib/reports/types.ts +++ b/lib/reports/types.ts @@ -178,14 +178,14 @@ export interface ReportsApi { /** * Deletes the specified Report. - * + * * @param options - {@link DeleteReportOptions} - Configuration options for the request * @param callback - {@link RequestCallback}\<{@link DeleteReportResponse}\> - Optional callback function * @returns Promise\<{@link DeleteReportResponse}\> - * + * * @remarks * It mirrors to the following Smartsheet REST API method: `DELETE /2.0/reports/{reportId}` - * + * * @example * ```typescript * const result = await client.reports.deleteReport({ @@ -756,4 +756,4 @@ export interface DeleteReportOptions extends RequestOptions Date: Wed, 21 Jan 2026 14:52:51 +0200 Subject: [PATCH 6/6] Fix for coverage tests --- lib/reports/index.ts | 2 +- test/functional/client.spec.ts | 2 +- test/mock-api/reports/delete-reports.spec.ts | 6 +----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/reports/index.ts b/lib/reports/index.ts index c573d56..0f75adf 100644 --- a/lib/reports/index.ts +++ b/lib/reports/index.ts @@ -90,7 +90,7 @@ export function create(options: CreateOptions): ReportsApi { }; const deleteReport = (deleteOptions: DeleteReportOptions, callback?: RequestCallback) => { - const urlOptions = { url: options.apiUrls.reports + '/delete/' + deleteOptions.reportId }; + const urlOptions = { url: options.apiUrls.reports + '/' + deleteOptions.reportId }; return requestor.delete({ ...optionsToSend, ...urlOptions, ...deleteOptions }, callback); }; diff --git a/test/functional/client.spec.ts b/test/functional/client.spec.ts index 4f44b82..da092b0 100644 --- a/test/functional/client.spec.ts +++ b/test/functional/client.spec.ts @@ -180,7 +180,7 @@ describe('Client Unit Tests', () => { describe('#reports', () => { it('should have reports object', () => { expect(smartsheet).toHaveProperty('reports'); - expect(Object.keys(smartsheet.reports)).toHaveLength(12); + expect(Object.keys(smartsheet.reports)).toHaveLength(13); }); it('should have get methods', () => { diff --git a/test/mock-api/reports/delete-reports.spec.ts b/test/mock-api/reports/delete-reports.spec.ts index f6ded80..4b5eb65 100644 --- a/test/mock-api/reports/delete-reports.spec.ts +++ b/test/mock-api/reports/delete-reports.spec.ts @@ -21,17 +21,13 @@ describe('Reports - deleteReport endpoint tests', () => { customProperties: { 'x-request-id': requestId, 'x-test-name': '/reports/delete-report/all-response-body-properties' + } }; await client.reports.deleteReport(options); const matchedRequest = await findWireMockRequest(requestId); const parsedUrl = new URL(matchedRequest.absoluteUrl); expect(parsedUrl.pathname).toEqual("/2.0/reports/" + TEST_REPORT_ID); - - const queryParamsObject = Object.fromEntries(parsedUrl.searchParams); - expect(queryParamsObject).toEqual({ - reportId: TEST_REPORT_ID - }); }); it('deleteReport all response body properties', async () => {