From fa4f0c0183a1f461882aadd9b65c76d186cb0f78 Mon Sep 17 00:00:00 2001 From: denislavstanchev Date: Mon, 1 Dec 2025 11:36:32 +0200 Subject: [PATCH 1/8] Migrate the favorites module to typescript, add wiremock tests and remove the test_ prefix from test names --- lib/favorites/index.js | 108 ----- lib/favorites/index.ts | 154 ++++++ lib/favorites/types.ts | 441 ++++++++++++++++++ lib/types/SmartsheetClient.ts | 3 +- test/functional/endpoints.spec.ts | 24 +- .../favorites/add_items_to_favorites.spec.ts | 108 +++++ .../add_multiple_to_favorites.spec.ts | 142 ++++++ ...to_favorites_convenience_functions.spec.ts | 176 +++++++ .../favorites/common_test_constants.ts | 27 ++ .../mock-api/favorites/list_favorites.spec.ts | 140 ++++++ ...om_favorites_convenience_functions.spec.ts | 163 +++++++ ...le_favorites_convenience_functions.spec.ts | 183 ++++++++ ...il.spec.ts => add_alternate_email.spec.ts} | 0 ...mage.spec.ts => add_profile_image.spec.ts} | 0 ...test_add_user.spec.ts => add_user.spec.ts} | 0 ....ts => deactivate_reactivate_user.spec.ts} | 0 ...spec.ts => delete_alternate_email.spec.ts} | 0 ...il.spec.ts => get_alternate_email.spec.ts} | 0 ..._user.spec.ts => get_current_user.spec.ts} | 0 ...test_get_user.spec.ts => get_user.spec.ts} | 0 ....spec.ts => list_alternate_emails.spec.ts} | 0 ..._plans.spec.ts => list_user_plans.spec.ts} | 0 ..._list_users.spec.ts => list_users.spec.ts} | 0 ...s => make_alternate_email_primary.spec.ts} | 0 ...emove_user.spec.ts => remove_user.spec.ts} | 0 ....spec.ts => remove_user_from_plan.spec.ts} | 0 ...pdate_user.spec.ts => update_user.spec.ts} | 0 ...spec.ts => user_upgrade_downgrade.spec.ts} | 0 28 files changed, 1548 insertions(+), 121 deletions(-) delete mode 100644 lib/favorites/index.js create mode 100644 lib/favorites/index.ts create mode 100644 lib/favorites/types.ts create mode 100644 test/mock-api/favorites/add_items_to_favorites.spec.ts create mode 100644 test/mock-api/favorites/add_multiple_to_favorites.spec.ts create mode 100644 test/mock-api/favorites/add_to_favorites_convenience_functions.spec.ts create mode 100644 test/mock-api/favorites/common_test_constants.ts create mode 100644 test/mock-api/favorites/list_favorites.spec.ts create mode 100644 test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts create mode 100644 test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts rename test/mock-api/users/{test_add_alternate_email.spec.ts => add_alternate_email.spec.ts} (100%) rename test/mock-api/users/{test_add_profile_image.spec.ts => add_profile_image.spec.ts} (100%) rename test/mock-api/users/{test_add_user.spec.ts => add_user.spec.ts} (100%) rename test/mock-api/users/{test_deactivate_reactivate_user.spec.ts => deactivate_reactivate_user.spec.ts} (100%) rename test/mock-api/users/{test_delete_alternate_email.spec.ts => delete_alternate_email.spec.ts} (100%) rename test/mock-api/users/{test_get_alternate_email.spec.ts => get_alternate_email.spec.ts} (100%) rename test/mock-api/users/{test_get_current_user.spec.ts => get_current_user.spec.ts} (100%) rename test/mock-api/users/{test_get_user.spec.ts => get_user.spec.ts} (100%) rename test/mock-api/users/{test_list_alternate_emails.spec.ts => list_alternate_emails.spec.ts} (100%) rename test/mock-api/users/{test_list_user_plans.spec.ts => list_user_plans.spec.ts} (100%) rename test/mock-api/users/{test_list_users.spec.ts => list_users.spec.ts} (100%) rename test/mock-api/users/{test_make_alternate_email_primary.spec.ts => make_alternate_email_primary.spec.ts} (100%) rename test/mock-api/users/{test_remove_user.spec.ts => remove_user.spec.ts} (100%) rename test/mock-api/users/{test_remove_user_from_plan.spec.ts => remove_user_from_plan.spec.ts} (100%) rename test/mock-api/users/{test_update_user.spec.ts => update_user.spec.ts} (100%) rename test/mock-api/users/{test_user_upgrade_downgrade.spec.ts => user_upgrade_downgrade.spec.ts} (100%) diff --git a/lib/favorites/index.js b/lib/favorites/index.js deleted file mode 100644 index d7da837..0000000 --- a/lib/favorites/index.js +++ /dev/null @@ -1,108 +0,0 @@ -import _ from 'underscore'; -import { types } from '../utils/constants'; - -export function create(options) { - const requestor = options.requestor; - - const optionsToSend = { - url: options.apiUrls.favorites, - }; - _.extend(optionsToSend, options.clientOptions); - - const listFavorites = (getOptions, callback) => requestor.get(_.extend({}, optionsToSend, getOptions), callback); - - const addItemsToFavorites = (postOptions, callback) => - requestor.post(_.extend({}, optionsToSend, postOptions), callback); - - const handleFavorites = (postOptions, callback) => { - const body = _.pick(postOptions, 'type', 'objectId'); - const options = _.omit(postOptions, 'type', 'objectId'); - - options.body = body; - return addItemsToFavorites(options, callback); - }; - - const buildFavoriteAddition = function (type) { - return (postOptions, callback) => { - const options = JSON.parse(JSON.stringify(postOptions)); - options.type = type; - return handleFavorites(options, callback); - }; - }; - - const addSheetToFavorites = buildFavoriteAddition(types.sheet); - - const addFolderToFavorites = buildFavoriteAddition(types.folder); - - const addReportToFavorites = buildFavoriteAddition(types.report); - - const addTemplateToFavorites = buildFavoriteAddition(types.template); - - const addWorkspaceToFavorites = buildFavoriteAddition(types.workspace); - - const addSightToFavorites = buildFavoriteAddition(types.sight); - - const addMultipleToFavorites = (postOptions, callback) => { - return requestor.post(_.extend({}, optionsToSend, postOptions), callback); - }; - - const removeFavorite = (deleteOptions, callback) => { - const params = deleteOptions.queryParameters; - if (params && _.isArray(params.objectIds)) { - params.objectIds = params.objectIds.join(','); - } - - const urlOptions = { - url: deleteOptions.objectId - ? options.apiUrls.favorites + '/' + deleteOptions.type + '/' + deleteOptions.objectId - : options.apiUrls.favorites + '/' + deleteOptions.type, - }; - return requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback); - }; - - const buildFavoriteRemoval = function (type) { - return (deleteOptions, callback) => { - const options = JSON.parse(JSON.stringify(deleteOptions)); - options.type = type; - return removeFavorite(options, callback); - }; - }; - - const removeSheetFromFavorites = buildFavoriteRemoval(types.sheet); - - const removeFolderFromFavorites = buildFavoriteRemoval(types.folder); - - const removeReportFromFavorites = buildFavoriteRemoval(types.report); - - const removeTemplateFromFavorites = buildFavoriteRemoval(types.template); - - const removeWorkspaceFromFavorites = buildFavoriteRemoval(types.workspace); - - const removeSightFromFavorites = buildFavoriteRemoval(types.sight); - - return { - listFavorites: listFavorites, - addItemsToFavorites: addItemsToFavorites, - addSheetToFavorites: addSheetToFavorites, - addFolderToFavorites: addFolderToFavorites, - addReportToFavorites: addReportToFavorites, - addTemplateToFavorites: addTemplateToFavorites, - addSightToFavorites: addSightToFavorites, - addWorkspaceToFavorites: addWorkspaceToFavorites, - addMultipleToFavorites: addMultipleToFavorites, - removeSheetFromFavorites: removeSheetFromFavorites, - removeFolderFromFavorites: removeFolderFromFavorites, - removeReportFromFavorites: removeReportFromFavorites, - removeTemplateFromFavorites: removeTemplateFromFavorites, - removeSightFromFavorites: removeSightFromFavorites, - removeWorkspaceFromFavorites: removeWorkspaceFromFavorites, - //convenience methods to remove multiples. - //Uses the same as the singular remove methods. - removeSheetsFromFavorites: removeSheetFromFavorites, - removeFoldersFromFavorites: removeFolderFromFavorites, - removeReportsFromFavorites: removeReportFromFavorites, - removeTemplatesFromFavorites: removeTemplateFromFavorites, - removeSightsFromFavorites: removeSightFromFavorites, - removeWorkspacesFromFavorites: removeWorkspaceFromFavorites, - }; -} diff --git a/lib/favorites/index.ts b/lib/favorites/index.ts new file mode 100644 index 0000000..fd0c82f --- /dev/null +++ b/lib/favorites/index.ts @@ -0,0 +1,154 @@ +import type { CreateOptions } from '../types/CreateOptions'; +import type { RequestCallback } from '../types/RequestCallback'; +import type { RequestOptions } from '../types/RequestOptions'; +import type { + FavoritesApi, + ListFavoritesQueryParameters, + ListFavoritesResponse, + AddFavoritesBody, + AddFavoritesResponse, + RemoveFavoriteOptions, + RemoveMultipleFavoritesOptions, + RemoveFavoritesResponse, +} from './types'; +import { FavoriteType } from './types' +import { types } from '../utils/constants'; + +export function create(options: CreateOptions): FavoritesApi { + const requestor = options.requestor; + + const optionsToSend = { + url: options.apiUrls.favorites, + ...options.clientOptions, + }; + + const listFavorites = ( + getOptions: RequestOptions, + callback?: RequestCallback + ) => requestor.get({ ...optionsToSend, ...getOptions }, callback); + + const addItemsToFavorites = ( + postOptions: RequestOptions, + callback?: RequestCallback + ) => requestor.post({ ...optionsToSend, ...postOptions }, callback); + + const handleFavorites = ( + postOptions: RequestOptions, + callback?: RequestCallback + ) => { + const body: AddFavoritesBody = { + type: (postOptions as any).type, + objectId: (postOptions as any).objectId, + }; + const options = { ...postOptions, body }; + return addItemsToFavorites(options, callback); + }; + + const buildFavoriteAddition = (type: string) => { + return ( + postOptions: RequestOptions, + callback?: RequestCallback + ) => { + const options = JSON.parse(JSON.stringify(postOptions)) as any; + options.type = type; + return handleFavorites(options, callback); + }; + }; + + const addSheetToFavorites = buildFavoriteAddition(types.sheet); + + const addFolderToFavorites = buildFavoriteAddition(types.folder); + + const addReportToFavorites = buildFavoriteAddition(types.report); + + const addTemplateToFavorites = buildFavoriteAddition(types.template); + + const addWorkspaceToFavorites = buildFavoriteAddition(types.workspace); + + const addSightToFavorites = buildFavoriteAddition(types.sight); + + const addMultipleToFavorites = ( + postOptions: RequestOptions, + callback?: RequestCallback + ) => { + return requestor.post({ ...optionsToSend, ...postOptions }, callback); + }; + + const removeFavorite = ( + deleteOptions: RemoveFavoriteOptions, + callback?: RequestCallback + ) => { + const favoriteId = deleteOptions.favoriteId; + const urlOptions = { url: options.apiUrls.favorites + '/' + deleteOptions.favoriteType + '/' + favoriteId }; + return requestor.delete({ ...optionsToSend, ...urlOptions, ...deleteOptions }, callback); + }; + + const removeMultipleFavorites = ( + deleteOptions: RemoveMultipleFavoritesOptions, + callback?: RequestCallback + ) => { + const urlOptions = { + url: options.apiUrls.favorites + '/' + deleteOptions.favoriteType, + }; + return requestor.delete({ ...optionsToSend, ...urlOptions, ...deleteOptions }, callback); + }; + + const buildFavoriteRemoval = (type: FavoriteType) => { + return ( + deleteOptions: RemoveFavoriteOptions, + callback?: RequestCallback + ) => { + const options = JSON.parse(JSON.stringify(deleteOptions)) as RemoveFavoriteOptions; + options.favoriteType = type as FavoriteType; + return removeFavorite(options, callback); + }; + }; + + const buildMultipleFavoriteRemoval = (type: FavoriteType) => { + return ( + deleteOptions: RemoveMultipleFavoritesOptions, + callback?: RequestCallback + ) => { + const options = JSON.parse(JSON.stringify(deleteOptions)) as RemoveMultipleFavoritesOptions; + options.favoriteType = type as FavoriteType; + return removeMultipleFavorites(options, callback); + }; + }; + + const removeSheetFromFavorites = buildFavoriteRemoval(FavoriteType.SHEET); + + const removeFolderFromFavorites = buildFavoriteRemoval(FavoriteType.FOLDER); + + const removeReportFromFavorites = buildFavoriteRemoval(FavoriteType.REPORT); + + const removeTemplateFromFavorites = buildFavoriteRemoval(FavoriteType.TEMPLATE); + + const removeWorkspaceFromFavorites = buildFavoriteRemoval(FavoriteType.WORKSPACE); + + const removeSightFromFavorites = buildFavoriteRemoval(FavoriteType.SIGHT); + + return { + listFavorites, + addItemsToFavorites, + addSheetToFavorites, + addFolderToFavorites, + addReportToFavorites, + addTemplateToFavorites, + addSightToFavorites, + addWorkspaceToFavorites, + addMultipleToFavorites, + removeSheetFromFavorites, + removeFolderFromFavorites, + removeReportFromFavorites, + removeTemplateFromFavorites, + removeSightFromFavorites, + removeWorkspaceFromFavorites, + // Convenience methods to remove multiples. + removeSheetsFromFavorites: buildMultipleFavoriteRemoval(FavoriteType.SHEET), + removeFoldersFromFavorites: buildMultipleFavoriteRemoval(FavoriteType.FOLDER), + removeReportsFromFavorites: buildMultipleFavoriteRemoval(FavoriteType.REPORT), + removeTemplatesFromFavorites: buildMultipleFavoriteRemoval(FavoriteType.TEMPLATE), + removeSightsFromFavorites: buildMultipleFavoriteRemoval(FavoriteType.SIGHT), + removeWorkspacesFromFavorites: buildMultipleFavoriteRemoval(FavoriteType.WORKSPACE), + }; +} diff --git a/lib/favorites/types.ts b/lib/favorites/types.ts new file mode 100644 index 0000000..b05c9d3 --- /dev/null +++ b/lib/favorites/types.ts @@ -0,0 +1,441 @@ +import type { RequestCallback } from '../types/RequestCallback'; +import type { RequestOptions } from '../types/RequestOptions'; + +// ============================================================================ +// Favorites API Interface +// ============================================================================ + +export interface FavoritesApi { + /** + * Gets a list of all of the user's favorite items. + * + * @param options - {@link RequestOptions}\<{@link ListFavoritesQueryParameters}, undefined\> - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link ListFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link ListFavoritesResponse}\> + * + * @remarks + * It mirrors to the following Smartsheet REST API method: `GET /favorites` + * + * @example + * ```typescript + * const favorites = await client.favorites.listFavorites({ + * queryParameters: { includeAll: true } + * }); + * ``` + */ + listFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds one or more items to the user's list of favorite items. + * + * @param options - {@link RequestOptions}\ - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + * + * @remarks + * It mirrors to the following Smartsheet REST API method: `POST /favorites` + * + * @example + * ```typescript + * const result = await client.favorites.addItemsToFavorites({ + * body: [ + * { type: 'sheet', objectId: 123456789 } + * ] + * }); + * ``` + */ + addItemsToFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a sheet to the user's list of favorite items. + * @param options - {@link RequestOptions}\ - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + * + * @remarks + * It mirrors to the following Smartsheet REST API method: `POST /favorites` + */ + addSheetToFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a folder to the user's list of favorite items. + * + * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addFolderToFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a report to the user's list of favorite items. + * + * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addReportToFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a template to the user's list of favorite items. + * + * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addTemplateToFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a workspace to the user's list of favorite items. + * + * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addWorkspaceToFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a sight (dashboard) to the user's list of favorite items. + * + * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addSightToFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds multiple items to the user's list of favorite items. + * + * @param options - {@link RequestOptions}\ - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addMultipleToFavorites: ( + options: RequestOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes a sheet from the user's list of favorite items. + * + * @param options - {@link RemoveFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeSheetFromFavorites: ( + options: RemoveFavoriteOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes a folder from the user's list of favorite items. + * + * @param options - {@link RemoveFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeFolderFromFavorites: ( + options: RemoveFavoriteOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes a report from the user's list of favorite items. + * + * @param options - {@link RemoveFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeReportFromFavorites: ( + options: RemoveFavoriteOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes a template from the user's list of favorite items. + * + * @param options - {@link RemoveFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeTemplateFromFavorites: ( + options: RemoveFavoriteOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes a sight (dashboard) from the user's list of favorite items. + * + * @param options - {@link RemoveFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeSightFromFavorites: ( + options: RemoveFavoriteOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes a workspace from the user's list of favorite items. + * + * @param options - {@link RemoveFavoriteOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeWorkspaceFromFavorites: ( + options: RemoveFavoriteOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes multiple sheets from the user's list of favorite items. + * + * @param options - {@link RemoveMultipleFavoritesOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeSheetsFromFavorites: ( + options: RemoveMultipleFavoritesOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes multiple folders from the user's list of favorite items. + * + * @param options - {@link RemoveMultipleFavoritesOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeFoldersFromFavorites: ( + options: RemoveMultipleFavoritesOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes multiple reports from the user's list of favorite items. + * + * @param options - {@link RemoveMultipleFavoritesOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeReportsFromFavorites: ( + options: RemoveMultipleFavoritesOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes multiple templates from the user's list of favorite items. + * + * @param options - {@link RemoveMultipleFavoritesOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeTemplatesFromFavorites: ( + options: RemoveMultipleFavoritesOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes multiple sights (dashboards) from the user's list of favorite items. + * + * @param options - {@link RemoveMultipleFavoritesOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeSightsFromFavorites: ( + options: RemoveMultipleFavoritesOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Removes multiple workspaces from the user's list of favorite items. + * + * @param options - {@link RemoveMultipleFavoritesOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link RemoveFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link RemoveFavoritesResponse}\> + */ + removeWorkspacesFromFavorites: ( + options: RemoveMultipleFavoritesOptions, + callback?: RequestCallback + ) => Promise; +} + +// ============================================================================ +// Favorite Types +// ============================================================================ + +/** + * Favorite object type enumeration + */ +export enum FavoriteType { + SHEET = 'sheet', + FOLDER = 'folder', + REPORT = 'report', + TEMPLATE = 'template', + WORKSPACE = 'workspace', + SIGHT = 'sight', +} + +/** + * Favorite object + */ +export interface Favorite { + /** + * The type of the favorite object + */ + type: FavoriteType; + + /** + * The ID of the favorite object + */ + objectId: number; +} + +// ============================================================================ +// List Favorites +// ============================================================================ + +export interface ListFavoritesQueryParameters { + /** + * If true, include all results (do not paginate) + * @defaultValue false + */ + includeAll?: boolean; + + /** + * A comma-separated list of optional elements to include in the response. + */ + include?: string; + + /** + * Which page to return + * @defaultValue 1 + */ + page?: number; + + /** + * The maximum number of items to return per page + * @defaultValue 100 + */ + pageSize?: number; +} + +export interface ListFavoritesResponse { + /** + * The current page number + * @defaultValue 1 + */ + pageNumber: number; + + /** + * The number of items per page + * @defaultValue 100 + */ + pageSize: number; + + /** + * The total number of pages + */ + totalPages: number; + + /** + * The total number of favorites + */ + totalCount: number; + + /** + * Array of Favorite objects + */ + data: Favorite[]; +} + +// ============================================================================ +// Add Favorites +// ============================================================================ + +export interface AddFavoritesBody { + objectId: number; + type: FavoriteType; +} + +export interface AddFavoritesResponse { + /** + * Status message + */ + message: string; + + /** + * Result code + */ + resultCode: number; + + /** + * The added favorite(s) + */ + result: Favorite | Favorite[]; +} + +// ============================================================================ +// Remove Favorites +// ============================================================================ + +export interface RemoveMultipleFavoritesQueryParams { + /** + * A comma-separated list of Ids of the favorited item. + */ + objectIds?: string; +} + +export interface RemoveMultipleFavoritesOptions extends RequestOptions { + /** + * The type of the favorite object + */ + favoriteType?: FavoriteType; +} + +export interface RemoveFavoriteOptions extends RequestOptions { + /** + * The ID of the object to remove from favorites (for single removal) + */ + favoriteId?: number; + + /** + * The type of the favorite object + */ + favoriteType?: FavoriteType; +} + +export interface RemoveFavoritesResponse { + /** + * Status message + */ + message: string; + + /** + * Result code + */ + resultCode: number; +} diff --git a/lib/types/SmartsheetClient.ts b/lib/types/SmartsheetClient.ts index ae651ad..37832dd 100644 --- a/lib/types/SmartsheetClient.ts +++ b/lib/types/SmartsheetClient.ts @@ -1,3 +1,4 @@ +import type { FavoritesApi } from '@smartsheet/favorites/types'; import type { ContactsApi } from '../contacts/types'; import type { EventsApi } from '../events/types'; import type { SearchApi } from '../search/types'; @@ -11,7 +12,7 @@ export interface SmartsheetClient { constants: any; contacts: ContactsApi; events: EventsApi; - favorites: any; + favorites: FavoritesApi; folders: any; groups: any; home: any; diff --git a/test/functional/endpoints.spec.ts b/test/functional/endpoints.spec.ts index f20000a..9724aaf 100644 --- a/test/functional/endpoints.spec.ts +++ b/test/functional/endpoints.spec.ts @@ -33,18 +33,18 @@ describe('Method Unit Tests', () => { { name: 'addSightToFavorites', stub: 'post', options: { objectId: 123 }, expectedRequest: {url: "favorites", body: { objectId: 123, type: 'sight' } }}, { name: 'addWorkspaceToFavorites', stub: 'post', options: { objectId: 123 }, expectedRequest: {url: "favorites", body: { objectId: 123, type: 'workspace' } }}, { name: 'addMultipleToFavorites', stub: 'post', options: { body: [{objectId: 123, type: 'workspace'}] }, expectedRequest: {url: "favorites", body: [{ objectId: 123, type: 'workspace' }] }}, - { name: 'removeSheetFromFavorites', stub: 'delete', options: { objectId: 123 }, expectedRequest: {url: "favorites/sheet/123" }}, - { name: 'removeFolderFromFavorites', stub: 'delete', options: { objectId: 123 }, expectedRequest: {url: "favorites/folder/123" }}, - { name: 'removeReportFromFavorites', stub: 'delete', options: { objectId: 123 }, expectedRequest: {url: "favorites/report/123" }}, - { name: 'removeTemplateFromFavorites', stub: 'delete', options: { objectId: 123 }, expectedRequest: {url: "favorites/template/123" }}, - { name: 'removeSightFromFavorites', stub: 'delete', options: { objectId: 123 }, expectedRequest: {url: "favorites/sight/123" }}, - { name: 'removeWorkspaceFromFavorites', stub: 'delete', options: { objectId: 123 }, expectedRequest: {url: "favorites/workspace/123" }}, - { name: 'removeSheetsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: [123, 234] }}, expectedRequest: {url: "favorites/sheet", queryParameters: {objectIds: '123,234'}}}, - { name: 'removeFoldersFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: [123, 234] }}, expectedRequest: {url: "favorites/folder", queryParameters: {objectIds: '123,234'} }}, - { name: 'removeReportsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: [123, 234] }}, expectedRequest: {url: "favorites/report", queryParameters: {objectIds: '123,234'} }}, - { name: 'removeTemplatesFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: [123, 234] }}, expectedRequest: {url: "favorites/template", queryParameters: {objectIds: '123,234'} }}, - { name: 'removeSightsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: [123, 234] }}, expectedRequest: {url: "favorites/sight", queryParameters: {objectIds: '123,234'} }}, - { name: 'removeWorkspacesFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: [123, 234] }}, expectedRequest: {url: "favorites/workspace", queryParameters: {objectIds: '123,234'} }}, + { name: 'removeSheetFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/sheet/123" }}, + { name: 'removeFolderFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/folder/123" }}, + { name: 'removeReportFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/report/123" }}, + { name: 'removeTemplateFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/template/123" }}, + { name: 'removeSightFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/sight/123" }}, + { name: 'removeWorkspaceFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/workspace/123" }}, + { name: 'removeSheetsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/sheet", queryParameters: {objectIds: '123,234'}}}, + { name: 'removeFoldersFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/folder", queryParameters: {objectIds: '123,234'} }}, + { name: 'removeReportsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/report", queryParameters: {objectIds: '123,234'} }}, + { name: 'removeTemplatesFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/template", queryParameters: {objectIds: '123,234'} }}, + { name: 'removeSightsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/sight", queryParameters: {objectIds: '123,234'} }}, + { name: 'removeWorkspacesFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/workspace", queryParameters: {objectIds: '123,234'} }}, { name: 'removeSheetsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234'} }, expectedRequest: {url: "favorites/sheet", queryParameters: {objectIds: '123,234'} }}, { name: 'removeFoldersFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234'} }, expectedRequest: {url: "favorites/folder", queryParameters: {objectIds: '123,234'} }}, { name: 'removeReportsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234'} }, expectedRequest: {url: "favorites/report", queryParameters: {objectIds: '123,234'} }}, diff --git a/test/mock-api/favorites/add_items_to_favorites.spec.ts b/test/mock-api/favorites/add_items_to_favorites.spec.ts new file mode 100644 index 0000000..c10d861 --- /dev/null +++ b/test/mock-api/favorites/add_items_to_favorites.spec.ts @@ -0,0 +1,108 @@ +import crypto from 'crypto'; +import { createClient, findWireMockRequest } from '../utils/utils'; +import { expect } from '@jest/globals'; +import { + TEST_SHEET_ID, + TEST_FAVORITE_TYPE_SHEET, + 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'; +import type { Favorite, FavoriteType } from '@smartsheet/favorites/types'; + +describe('Favorites - addItemsToFavorites endpoint tests', () => { + const client = createClient(); + + it('addItemsToFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + body: { + type: TEST_FAVORITE_TYPE_SHEET as FavoriteType, + objectId: TEST_SHEET_ID + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/add-items-to-favorites/all-response-body-properties' + } + }; + await client.favorites.addItemsToFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); + }); + + it('addItemsToFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + body: { + type: TEST_FAVORITE_TYPE_SHEET as FavoriteType, + objectId: TEST_SHEET_ID + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/add-items-to-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.addItemsToFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify request body + const requestBody = JSON.parse(matchedRequest.body); + expect(requestBody.type).toBe(TEST_FAVORITE_TYPE_SHEET); + expect(requestBody.objectId).toBe(TEST_SHEET_ID); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + expect(response.result).toBeTruthy(); + const result = response.result as Favorite; + expect(result.type).toBe(TEST_FAVORITE_TYPE_SHEET); + expect(result.objectId).toBe(TEST_SHEET_ID); + }); + + it('addItemsToFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + body: { + type: TEST_FAVORITE_TYPE_SHEET as FavoriteType, + objectId: TEST_SHEET_ID + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.addItemsToFavorites(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('addItemsToFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + body: { + type: TEST_FAVORITE_TYPE_SHEET as FavoriteType, + objectId: TEST_SHEET_ID + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.addItemsToFavorites(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); + } + }); +}); diff --git a/test/mock-api/favorites/add_multiple_to_favorites.spec.ts b/test/mock-api/favorites/add_multiple_to_favorites.spec.ts new file mode 100644 index 0000000..8fe86e3 --- /dev/null +++ b/test/mock-api/favorites/add_multiple_to_favorites.spec.ts @@ -0,0 +1,142 @@ +import crypto from 'crypto'; +import { createClient, findWireMockRequest } from '../utils/utils'; +import { expect } from '@jest/globals'; +import { + TEST_SHEET_ID, + TEST_FOLDER_ID, + TEST_FAVORITE_TYPE_SHEET, + TEST_FAVORITE_TYPE_FOLDER, + 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'; +import type { FavoriteType } from '@smartsheet/favorites/types'; + +describe('Favorites - addItemsToFavorites endpoint tests', () => { + const client = createClient(); + + it('addMultipleToFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + body: [ + { + type: TEST_FAVORITE_TYPE_SHEET as FavoriteType, + objectId: TEST_SHEET_ID + }, + { + type: TEST_FAVORITE_TYPE_FOLDER as FavoriteType, + objectId: TEST_FOLDER_ID + } + ], + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/add-multiple-items-to-favorites/all-response-body-properties' + } + }; + await client.favorites.addMultipleToFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); + }); + + it('addMultipleToFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + body: [ + { + type: TEST_FAVORITE_TYPE_SHEET as FavoriteType, + objectId: TEST_SHEET_ID + }, + { + type: TEST_FAVORITE_TYPE_FOLDER as FavoriteType, + objectId: TEST_FOLDER_ID + } + ], + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/add-multiple-items-to-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.addMultipleToFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify request body + const requestBody = JSON.parse(matchedRequest.body); + expect(Array.isArray(requestBody)).toBeTruthy(); + expect(requestBody.length).toBe(2); + expect(requestBody[0].type).toBe(TEST_FAVORITE_TYPE_SHEET); + expect(requestBody[0].objectId).toBe(TEST_SHEET_ID); + expect(requestBody[1].type).toBe(TEST_FAVORITE_TYPE_FOLDER); + expect(requestBody[1].objectId).toBe(TEST_FOLDER_ID); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + expect(Array.isArray(response.result)).toBeTruthy(); + if (Array.isArray(response.result)) { + expect(response.result.length).toBe(2); + expect(response.result[0].type).toBe(TEST_FAVORITE_TYPE_SHEET); + expect(response.result[0].objectId).toBe(TEST_SHEET_ID); + expect(response.result[1].type).toBe(TEST_FAVORITE_TYPE_FOLDER); + expect(response.result[1].objectId).toBe(TEST_FOLDER_ID); + } + }); + + it('addMultipleToFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + body: [ + { + type: TEST_FAVORITE_TYPE_SHEET as FavoriteType, + objectId: TEST_SHEET_ID + }, + { + type: TEST_FAVORITE_TYPE_FOLDER as FavoriteType, + objectId: TEST_FOLDER_ID + } + ], + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.addMultipleToFavorites(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('addMultipleToFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + body: [ + { + type: TEST_FAVORITE_TYPE_SHEET as FavoriteType, + objectId: TEST_SHEET_ID + }, + { + type: TEST_FAVORITE_TYPE_FOLDER as FavoriteType, + objectId: TEST_FOLDER_ID + } + ], + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.addMultipleToFavorites(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); + } + }); +}); diff --git a/test/mock-api/favorites/add_to_favorites_convenience_functions.spec.ts b/test/mock-api/favorites/add_to_favorites_convenience_functions.spec.ts new file mode 100644 index 0000000..fae4a47 --- /dev/null +++ b/test/mock-api/favorites/add_to_favorites_convenience_functions.spec.ts @@ -0,0 +1,176 @@ +import crypto from 'crypto'; +import { createClient, findWireMockRequest } from '../utils/utils'; +import { expect } from '@jest/globals'; +import { + TEST_SHEET_ID, + TEST_FOLDER_ID, + TEST_FAVORITE_TYPE_SHEET, + TEST_FAVORITE_TYPE_FOLDER, + 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'; +import type { Favorite } from '@smartsheet/favorites/types'; + +describe('Favorites - addToFavorites convenience endpoint tests', () => { + const client = createClient(); + + it('addSheetToFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + objectId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/add-sheet-to-favorites/all-response-body-properties' + } + }; + await client.favorites.addSheetToFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); + }); + + it('addSheetToFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + objectId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/add-sheet-to-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.addSheetToFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify request body + const requestBody = JSON.parse(matchedRequest.body); + expect(requestBody.type).toBe(TEST_FAVORITE_TYPE_SHEET); + expect(requestBody.objectId).toBe(TEST_SHEET_ID); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + expect(response.result).toBeTruthy(); + const result = response.result as Favorite; + expect(result.type).toBe(TEST_FAVORITE_TYPE_SHEET); + expect(result.objectId).toBe(TEST_SHEET_ID); + }); + + it('addFolderToFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + objectId: TEST_FOLDER_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/add-folder-to-favorites/all-response-body-properties' + } + }; + await client.favorites.addFolderToFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); + }); + + it('addFolderToFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + objectId: TEST_FOLDER_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/add-folder-to-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.addFolderToFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify request body + const requestBody = JSON.parse(matchedRequest.body); + expect(requestBody.type).toBe(TEST_FAVORITE_TYPE_FOLDER); + expect(requestBody.objectId).toBe(TEST_FOLDER_ID); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + expect(response.result).toBeTruthy(); + const result = response.result as Favorite; + expect(result.type).toBe(TEST_FAVORITE_TYPE_FOLDER); + expect(result.objectId).toBe(TEST_FOLDER_ID); + }); + + it('addSheetToFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + objectId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.addSheetToFavorites(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('addSheetToFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + objectId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.addSheetToFavorites(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); + } + }); + + it('addFolderToFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + objectId: TEST_FOLDER_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.addFolderToFavorites(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('addFolderToFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + objectId: TEST_FOLDER_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.addFolderToFavorites(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); + } + }); +}); diff --git a/test/mock-api/favorites/common_test_constants.ts b/test/mock-api/favorites/common_test_constants.ts new file mode 100644 index 0000000..c421331 --- /dev/null +++ b/test/mock-api/favorites/common_test_constants.ts @@ -0,0 +1,27 @@ +import { FavoriteType } from "@smartsheet/favorites/types"; + +// Common Favorite IDs +export const TEST_SHEET_ID = 1234567890123456; +export const TEST_FOLDER_ID = 2345678901234567; +export const TEST_REPORT_ID = 3456789012345678; +export const TEST_WORKSPACE_ID = 4567890123456789; +export const TEST_SIGHT_ID = 5678901234567890; +export const TEST_TEMPLATE_ID = 6789012345678901; + +// Common Favorite Types +export const TEST_FAVORITE_TYPE_SHEET = FavoriteType.SHEET; +export const TEST_FAVORITE_TYPE_FOLDER = FavoriteType.FOLDER; +export const TEST_FAVORITE_TYPE_REPORT = FavoriteType.REPORT; +export const TEST_FAVORITE_TYPE_WORKSPACE = FavoriteType.WORKSPACE; +export const TEST_FAVORITE_TYPE_SIGHT = FavoriteType.SIGHT; +export const TEST_FAVORITE_TYPE_TEMPLATE = FavoriteType.TEMPLATE; + +// Common Success Response Values +export const TEST_SUCCESS_MESSAGE = 'SUCCESS'; +export const TEST_SUCCESS_RESULT_CODE = 0; + +// Common Error Status Codes +export const ERROR_500_STATUS_CODE = 500; +export const ERROR_500_MESSAGE = 'Internal Server Error'; +export const ERROR_400_STATUS_CODE = 400; +export const ERROR_400_MESSAGE = 'Malformed Request'; diff --git a/test/mock-api/favorites/list_favorites.spec.ts b/test/mock-api/favorites/list_favorites.spec.ts new file mode 100644 index 0000000..1702156 --- /dev/null +++ b/test/mock-api/favorites/list_favorites.spec.ts @@ -0,0 +1,140 @@ +import crypto from 'crypto'; +import { createClient, findWireMockRequest } from '../utils/utils'; +import { expect } from '@jest/globals'; +import { + TEST_SHEET_ID, + TEST_FOLDER_ID, + TEST_FAVORITE_TYPE_SHEET, + TEST_FAVORITE_TYPE_FOLDER, + ERROR_500_STATUS_CODE, + ERROR_500_MESSAGE, + ERROR_400_STATUS_CODE, + ERROR_400_MESSAGE +} from './common_test_constants'; + +describe('Favorites - listFavorites endpoint tests', () => { + const client = createClient(); + + it('listFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + includeAll: true + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/list-favorites/all-response-body-properties' + } + }; + await client.favorites.listFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); + }); + + it('listFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + includeAll: true + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/list-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.listFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify query parameters + const queryParams = matchedRequest.queryParams; + expect(queryParams.includeAll).toBeTruthy(); + expect(queryParams.includeAll.values[0]).toBe('true'); + + // Verify response structure + expect(response).toBeTruthy(); + expect(response.pageNumber).toBe(1); + expect(response.pageSize).toBe(100); + expect(response.totalPages).toBe(1); + expect(response.totalCount).toBe(2); + expect(response.data).toBeTruthy(); + expect(Array.isArray(response.data)).toBe(true); + expect(response.data.length).toBe(2); + + // Verify first favorite (sheet) + expect(response.data[0].type).toBe(TEST_FAVORITE_TYPE_SHEET); + expect(response.data[0].objectId).toBe(TEST_SHEET_ID); + + // Verify second favorite (folder) + expect(response.data[1].type).toBe(TEST_FAVORITE_TYPE_FOLDER); + expect(response.data[1].objectId).toBe(TEST_FOLDER_ID); + }); + + it('listFavorites with pagination parameters', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + page: 1, + pageSize: 50 + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/list-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.listFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify query parameters + const queryParams = matchedRequest.queryParams; + expect(queryParams.page).toBeTruthy(); + expect(queryParams.page.values[0]).toBe('1'); + expect(queryParams.pageSize).toBeTruthy(); + expect(queryParams.pageSize.values[0]).toBe('50'); + + // Verify response + expect(response).toBeTruthy(); + expect(response.data).toBeTruthy(); + expect(Array.isArray(response.data)).toBe(true); + }); + + it('listFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + includeAll: true + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.listFavorites(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('listFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + includeAll: true + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.listFavorites(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); + } + }); +}); diff --git a/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts b/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts new file mode 100644 index 0000000..625bc2e --- /dev/null +++ b/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts @@ -0,0 +1,163 @@ +import crypto from 'crypto'; +import { createClient, findWireMockRequest } from '../utils/utils'; +import { expect } from '@jest/globals'; +import { + TEST_SHEET_ID, + TEST_FOLDER_ID, + TEST_FAVORITE_TYPE_SHEET, + TEST_FAVORITE_TYPE_FOLDER, + 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('Favorites - removeFromFavorites convenience endpoint tests', () => { + const client = createClient(); + + it('removeSheetFromFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/remove-from-favorites/all-response-body-properties' + } + }; + await client.favorites.removeSheetFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_SHEET}/${TEST_SHEET_ID}`)).toBeTruthy(); + }); + + it('removeSheetFromFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/remove-from-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.removeSheetFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify URL contains the correct favorite type and ID + expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_SHEET}/${TEST_SHEET_ID}`)).toBeTruthy(); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + }); + + it('removeFolderFromFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_FOLDER_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/remove-from-favorites/all-response-body-properties' + } + }; + await client.favorites.removeFolderFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_FOLDER}/${TEST_FOLDER_ID}`)).toBeTruthy(); + }); + + it('removeFolderFromFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_FOLDER_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/remove-from-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.removeFolderFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify URL contains the correct favorite type and ID + expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_FOLDER}/${TEST_FOLDER_ID}`)).toBeTruthy(); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + }); + + it('removeSheetFromFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.removeSheetFromFavorites(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('removeSheetFromFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.removeSheetFromFavorites(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); + } + }); + + it('removeFolderFromFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_FOLDER_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.removeFolderFromFavorites(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('removeFolderFromFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_FOLDER_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.removeFolderFromFavorites(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); + } + }); +}); diff --git a/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts b/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts new file mode 100644 index 0000000..c5aa2ff --- /dev/null +++ b/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts @@ -0,0 +1,183 @@ +import crypto from 'crypto'; +import { createClient, findWireMockRequest } from '../utils/utils'; +import { expect } from '@jest/globals'; +import { + TEST_SHEET_ID, + TEST_FOLDER_ID, + TEST_FAVORITE_TYPE_SHEET, + TEST_FAVORITE_TYPE_FOLDER, + 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('Favorites - removeMultipleFavorites convenience endpoint tests', () => { + const client = createClient(); + + it('removeSheetsFromFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/remove-multiple-favorites/all-response-body-properties' + } + }; + await client.favorites.removeSheetsFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_SHEET}`)).toBeTruthy(); + }); + + it('removeSheetsFromFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/remove-multiple-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.removeSheetsFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify query parameters + const queryParams = matchedRequest.queryParams; + expect(queryParams.objectIds).toBeTruthy(); + expect(queryParams.objectIds.values[0]).toBe(`${TEST_SHEET_ID},${TEST_FOLDER_ID}`); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + }); + + it('removeFoldersFromFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/remove-multiple-favorites/all-response-body-properties' + } + }; + await client.favorites.removeFoldersFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_FOLDER}`)).toBeTruthy(); + }); + + it('removeFoldersFromFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/remove-multiple-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.removeFoldersFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify query parameters + const queryParams = matchedRequest.queryParams; + expect(queryParams.objectIds).toBeTruthy(); + expect(queryParams.objectIds.values[0]).toBe(`${TEST_SHEET_ID},${TEST_FOLDER_ID}`); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + }); + + it('removeSheetsFromFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.removeSheetsFromFavorites(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('removeSheetsFromFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.removeSheetsFromFavorites(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); + } + }); + + it('removeFoldersFromFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.removeFoldersFromFavorites(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('removeFoldersFromFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.removeFoldersFromFavorites(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); + } + }); +}); diff --git a/test/mock-api/users/test_add_alternate_email.spec.ts b/test/mock-api/users/add_alternate_email.spec.ts similarity index 100% rename from test/mock-api/users/test_add_alternate_email.spec.ts rename to test/mock-api/users/add_alternate_email.spec.ts diff --git a/test/mock-api/users/test_add_profile_image.spec.ts b/test/mock-api/users/add_profile_image.spec.ts similarity index 100% rename from test/mock-api/users/test_add_profile_image.spec.ts rename to test/mock-api/users/add_profile_image.spec.ts diff --git a/test/mock-api/users/test_add_user.spec.ts b/test/mock-api/users/add_user.spec.ts similarity index 100% rename from test/mock-api/users/test_add_user.spec.ts rename to test/mock-api/users/add_user.spec.ts diff --git a/test/mock-api/users/test_deactivate_reactivate_user.spec.ts b/test/mock-api/users/deactivate_reactivate_user.spec.ts similarity index 100% rename from test/mock-api/users/test_deactivate_reactivate_user.spec.ts rename to test/mock-api/users/deactivate_reactivate_user.spec.ts diff --git a/test/mock-api/users/test_delete_alternate_email.spec.ts b/test/mock-api/users/delete_alternate_email.spec.ts similarity index 100% rename from test/mock-api/users/test_delete_alternate_email.spec.ts rename to test/mock-api/users/delete_alternate_email.spec.ts diff --git a/test/mock-api/users/test_get_alternate_email.spec.ts b/test/mock-api/users/get_alternate_email.spec.ts similarity index 100% rename from test/mock-api/users/test_get_alternate_email.spec.ts rename to test/mock-api/users/get_alternate_email.spec.ts diff --git a/test/mock-api/users/test_get_current_user.spec.ts b/test/mock-api/users/get_current_user.spec.ts similarity index 100% rename from test/mock-api/users/test_get_current_user.spec.ts rename to test/mock-api/users/get_current_user.spec.ts diff --git a/test/mock-api/users/test_get_user.spec.ts b/test/mock-api/users/get_user.spec.ts similarity index 100% rename from test/mock-api/users/test_get_user.spec.ts rename to test/mock-api/users/get_user.spec.ts diff --git a/test/mock-api/users/test_list_alternate_emails.spec.ts b/test/mock-api/users/list_alternate_emails.spec.ts similarity index 100% rename from test/mock-api/users/test_list_alternate_emails.spec.ts rename to test/mock-api/users/list_alternate_emails.spec.ts diff --git a/test/mock-api/users/test_list_user_plans.spec.ts b/test/mock-api/users/list_user_plans.spec.ts similarity index 100% rename from test/mock-api/users/test_list_user_plans.spec.ts rename to test/mock-api/users/list_user_plans.spec.ts diff --git a/test/mock-api/users/test_list_users.spec.ts b/test/mock-api/users/list_users.spec.ts similarity index 100% rename from test/mock-api/users/test_list_users.spec.ts rename to test/mock-api/users/list_users.spec.ts diff --git a/test/mock-api/users/test_make_alternate_email_primary.spec.ts b/test/mock-api/users/make_alternate_email_primary.spec.ts similarity index 100% rename from test/mock-api/users/test_make_alternate_email_primary.spec.ts rename to test/mock-api/users/make_alternate_email_primary.spec.ts diff --git a/test/mock-api/users/test_remove_user.spec.ts b/test/mock-api/users/remove_user.spec.ts similarity index 100% rename from test/mock-api/users/test_remove_user.spec.ts rename to test/mock-api/users/remove_user.spec.ts diff --git a/test/mock-api/users/test_remove_user_from_plan.spec.ts b/test/mock-api/users/remove_user_from_plan.spec.ts similarity index 100% rename from test/mock-api/users/test_remove_user_from_plan.spec.ts rename to test/mock-api/users/remove_user_from_plan.spec.ts diff --git a/test/mock-api/users/test_update_user.spec.ts b/test/mock-api/users/update_user.spec.ts similarity index 100% rename from test/mock-api/users/test_update_user.spec.ts rename to test/mock-api/users/update_user.spec.ts diff --git a/test/mock-api/users/test_user_upgrade_downgrade.spec.ts b/test/mock-api/users/user_upgrade_downgrade.spec.ts similarity index 100% rename from test/mock-api/users/test_user_upgrade_downgrade.spec.ts rename to test/mock-api/users/user_upgrade_downgrade.spec.ts From 9bd1ebd6c6e8a0b490d540a35d1e5fef58226977 Mon Sep 17 00:00:00 2001 From: denislavstanchev Date: Mon, 1 Dec 2025 11:39:39 +0200 Subject: [PATCH 2/8] fix formatting --- lib/favorites/index.ts | 12 +++--------- lib/favorites/types.ts | 10 +++++----- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/lib/favorites/index.ts b/lib/favorites/index.ts index fd0c82f..b64734b 100644 --- a/lib/favorites/index.ts +++ b/lib/favorites/index.ts @@ -11,7 +11,7 @@ import type { RemoveMultipleFavoritesOptions, RemoveFavoritesResponse, } from './types'; -import { FavoriteType } from './types' +import { FavoriteType } from './types'; import { types } from '../utils/constants'; export function create(options: CreateOptions): FavoritesApi { @@ -94,10 +94,7 @@ export function create(options: CreateOptions): FavoritesApi { }; const buildFavoriteRemoval = (type: FavoriteType) => { - return ( - deleteOptions: RemoveFavoriteOptions, - callback?: RequestCallback - ) => { + return (deleteOptions: RemoveFavoriteOptions, callback?: RequestCallback) => { const options = JSON.parse(JSON.stringify(deleteOptions)) as RemoveFavoriteOptions; options.favoriteType = type as FavoriteType; return removeFavorite(options, callback); @@ -105,10 +102,7 @@ export function create(options: CreateOptions): FavoritesApi { }; const buildMultipleFavoriteRemoval = (type: FavoriteType) => { - return ( - deleteOptions: RemoveMultipleFavoritesOptions, - callback?: RequestCallback - ) => { + return (deleteOptions: RemoveMultipleFavoritesOptions, callback?: RequestCallback) => { const options = JSON.parse(JSON.stringify(deleteOptions)) as RemoveMultipleFavoritesOptions; options.favoriteType = type as FavoriteType; return removeMultipleFavorites(options, callback); diff --git a/lib/favorites/types.ts b/lib/favorites/types.ts index b05c9d3..d797eb4 100644 --- a/lib/favorites/types.ts +++ b/lib/favorites/types.ts @@ -377,8 +377,8 @@ export interface ListFavoritesResponse { // ============================================================================ export interface AddFavoritesBody { - objectId: number; - type: FavoriteType; + objectId: number; + type: FavoriteType; } export interface AddFavoritesResponse { @@ -403,21 +403,21 @@ export interface AddFavoritesResponse { // ============================================================================ export interface RemoveMultipleFavoritesQueryParams { - /** + /** * A comma-separated list of Ids of the favorited item. */ objectIds?: string; } export interface RemoveMultipleFavoritesOptions extends RequestOptions { - /** + /** * The type of the favorite object */ favoriteType?: FavoriteType; } export interface RemoveFavoriteOptions extends RequestOptions { - /** + /** * The ID of the object to remove from favorites (for single removal) */ favoriteId?: number; From b18b08957269ee7467cc65633b8dc331db89382e Mon Sep 17 00:00:00 2001 From: denislavstanchev Date: Mon, 1 Dec 2025 16:41:44 +0200 Subject: [PATCH 3/8] move query param tests, fix mapping names in tests, use the FavoriteType enum, add an array check for the objectIds, add AddFavoriteConvenienceOptions type --- lib/favorites/index.ts | 42 ++++++++++++------- lib/favorites/types.ts | 42 +++++++++++++------ test/functional/endpoints.spec.ts | 4 +- .../favorites/add_items_to_favorites.spec.ts | 4 +- .../add_multiple_to_favorites.spec.ts | 4 +- ...om_favorites_convenience_functions.spec.ts | 8 ++-- ...le_favorites_convenience_functions.spec.ts | 34 ++++++++------- 7 files changed, 84 insertions(+), 54 deletions(-) diff --git a/lib/favorites/index.ts b/lib/favorites/index.ts index b64734b..39f3efb 100644 --- a/lib/favorites/index.ts +++ b/lib/favorites/index.ts @@ -7,12 +7,12 @@ import type { ListFavoritesResponse, AddFavoritesBody, AddFavoritesResponse, + AddFavoriteConvenienceOptions, RemoveFavoriteOptions, RemoveMultipleFavoritesOptions, RemoveFavoritesResponse, } from './types'; import { FavoriteType } from './types'; -import { types } from '../utils/constants'; export function create(options: CreateOptions): FavoritesApi { const requestor = options.requestor; @@ -33,39 +33,41 @@ export function create(options: CreateOptions): FavoritesApi { ) => requestor.post({ ...optionsToSend, ...postOptions }, callback); const handleFavorites = ( - postOptions: RequestOptions, + postOptions: AddFavoriteConvenienceOptions, callback?: RequestCallback ) => { const body: AddFavoritesBody = { - type: (postOptions as any).type, - objectId: (postOptions as any).objectId, + type: postOptions.type, + objectId: postOptions.objectId, }; const options = { ...postOptions, body }; return addItemsToFavorites(options, callback); }; - const buildFavoriteAddition = (type: string) => { + const buildFavoriteAddition = (type: FavoriteType) => { return ( - postOptions: RequestOptions, + postOptions: AddFavoriteConvenienceOptions, callback?: RequestCallback ) => { - const options = JSON.parse(JSON.stringify(postOptions)) as any; - options.type = type; + const options: AddFavoriteConvenienceOptions = { + ...JSON.parse(JSON.stringify(postOptions)), + type, + }; return handleFavorites(options, callback); }; }; - const addSheetToFavorites = buildFavoriteAddition(types.sheet); + const addSheetToFavorites = buildFavoriteAddition(FavoriteType.SHEET); - const addFolderToFavorites = buildFavoriteAddition(types.folder); + const addFolderToFavorites = buildFavoriteAddition(FavoriteType.FOLDER); - const addReportToFavorites = buildFavoriteAddition(types.report); + const addReportToFavorites = buildFavoriteAddition(FavoriteType.REPORT); - const addTemplateToFavorites = buildFavoriteAddition(types.template); + const addTemplateToFavorites = buildFavoriteAddition(FavoriteType.TEMPLATE); - const addWorkspaceToFavorites = buildFavoriteAddition(types.workspace); + const addWorkspaceToFavorites = buildFavoriteAddition(FavoriteType.WORKSPACE); - const addSightToFavorites = buildFavoriteAddition(types.sight); + const addSightToFavorites = buildFavoriteAddition(FavoriteType.SIGHT); const addMultipleToFavorites = ( postOptions: RequestOptions, @@ -90,7 +92,17 @@ export function create(options: CreateOptions): FavoritesApi { const urlOptions = { url: options.apiUrls.favorites + '/' + deleteOptions.favoriteType, }; - return requestor.delete({ ...optionsToSend, ...urlOptions, ...deleteOptions }, callback); + + // Transform objectIds array to comma-separated string if needed + const processedOptions = { ...deleteOptions }; + if (processedOptions.queryParameters?.objectIds && Array.isArray(processedOptions.queryParameters.objectIds)) { + processedOptions.queryParameters = { + ...processedOptions.queryParameters, + objectIds: processedOptions.queryParameters.objectIds.join(','), + }; + } + + return requestor.delete({ ...optionsToSend, ...urlOptions, ...processedOptions }, callback); }; const buildFavoriteRemoval = (type: FavoriteType) => { diff --git a/lib/favorites/types.ts b/lib/favorites/types.ts index d797eb4..288be46 100644 --- a/lib/favorites/types.ts +++ b/lib/favorites/types.ts @@ -54,7 +54,7 @@ export interface FavoritesApi { /** * Adds a sheet to the user's list of favorite items. - * @param options - {@link RequestOptions}\ - Configuration options for the request + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function * @returns Promise\<{@link AddFavoritesResponse}\> * @@ -62,67 +62,67 @@ export interface FavoritesApi { * It mirrors to the following Smartsheet REST API method: `POST /favorites` */ addSheetToFavorites: ( - options: RequestOptions, + options: AddFavoriteConvenienceOptions, callback?: RequestCallback ) => Promise; /** * Adds a folder to the user's list of favorite items. * - * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function * @returns Promise\<{@link AddFavoritesResponse}\> */ addFolderToFavorites: ( - options: RequestOptions, + options: AddFavoriteConvenienceOptions, callback?: RequestCallback ) => Promise; /** * Adds a report to the user's list of favorite items. * - * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function * @returns Promise\<{@link AddFavoritesResponse}\> */ addReportToFavorites: ( - options: RequestOptions, + options: AddFavoriteConvenienceOptions, callback?: RequestCallback ) => Promise; /** * Adds a template to the user's list of favorite items. * - * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function * @returns Promise\<{@link AddFavoritesResponse}\> */ addTemplateToFavorites: ( - options: RequestOptions, + options: AddFavoriteConvenienceOptions, callback?: RequestCallback ) => Promise; /** * Adds a workspace to the user's list of favorite items. * - * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function * @returns Promise\<{@link AddFavoritesResponse}\> */ addWorkspaceToFavorites: ( - options: RequestOptions, + options: AddFavoriteConvenienceOptions, callback?: RequestCallback ) => Promise; /** * Adds a sight (dashboard) to the user's list of favorite items. * - * @param options - {@link AddFavoriteOptions} - Configuration options for the request + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function * @returns Promise\<{@link AddFavoritesResponse}\> */ addSightToFavorites: ( - options: RequestOptions, + options: AddFavoriteConvenienceOptions, callback?: RequestCallback ) => Promise; @@ -381,6 +381,22 @@ export interface AddFavoritesBody { type: FavoriteType; } +/** + * Options for convenience functions like addSheetToFavorites, addFolderToFavorites, etc. + * Extends RequestOptions to include objectId as a top-level property. + */ +export interface AddFavoriteConvenienceOptions extends RequestOptions { + /** + * The ID of the object to add to favorites + */ + objectId: number; + + /** + * The type of the favorite object (set internally by convenience functions) + */ + type: FavoriteType; +} + export interface AddFavoritesResponse { /** * Status message @@ -406,7 +422,7 @@ export interface RemoveMultipleFavoritesQueryParams { /** * A comma-separated list of Ids of the favorited item. */ - objectIds?: string; + objectIds?: string | string[]; } export interface RemoveMultipleFavoritesOptions extends RequestOptions { diff --git a/test/functional/endpoints.spec.ts b/test/functional/endpoints.spec.ts index 9724aaf..740770c 100644 --- a/test/functional/endpoints.spec.ts +++ b/test/functional/endpoints.spec.ts @@ -39,8 +39,8 @@ describe('Method Unit Tests', () => { { name: 'removeTemplateFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/template/123" }}, { name: 'removeSightFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/sight/123" }}, { name: 'removeWorkspaceFromFavorites', stub: 'delete', options: { favoriteId: 123 }, expectedRequest: {url: "favorites/workspace/123" }}, - { name: 'removeSheetsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/sheet", queryParameters: {objectIds: '123,234'}}}, - { name: 'removeFoldersFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/folder", queryParameters: {objectIds: '123,234'} }}, + { name: 'removeSheetsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: ['123', '234'] }}, expectedRequest: {url: "favorites/sheet", queryParameters: {objectIds: '123,234'}}}, + { name: 'removeFoldersFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: ['123', '234'] }}, expectedRequest: {url: "favorites/folder", queryParameters: {objectIds: '123,234'} }}, { name: 'removeReportsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/report", queryParameters: {objectIds: '123,234'} }}, { name: 'removeTemplatesFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/template", queryParameters: {objectIds: '123,234'} }}, { name: 'removeSightsFromFavorites', stub: 'delete', options: { queryParameters: {objectIds: '123,234' }}, expectedRequest: {url: "favorites/sight", queryParameters: {objectIds: '123,234'} }}, diff --git a/test/mock-api/favorites/add_items_to_favorites.spec.ts b/test/mock-api/favorites/add_items_to_favorites.spec.ts index c10d861..04c64e8 100644 --- a/test/mock-api/favorites/add_items_to_favorites.spec.ts +++ b/test/mock-api/favorites/add_items_to_favorites.spec.ts @@ -25,7 +25,7 @@ describe('Favorites - addItemsToFavorites endpoint tests', () => { }, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/add-items-to-favorites/all-response-body-properties' + 'x-test-name': '/favorites/add-favorites/all-response-body-properties' } }; await client.favorites.addItemsToFavorites(options); @@ -43,7 +43,7 @@ describe('Favorites - addItemsToFavorites endpoint tests', () => { }, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/add-items-to-favorites/all-response-body-properties' + 'x-test-name': '/favorites/add-favorites/all-response-body-properties' } }; const response = await client.favorites.addItemsToFavorites(options); diff --git a/test/mock-api/favorites/add_multiple_to_favorites.spec.ts b/test/mock-api/favorites/add_multiple_to_favorites.spec.ts index 8fe86e3..afe15fe 100644 --- a/test/mock-api/favorites/add_multiple_to_favorites.spec.ts +++ b/test/mock-api/favorites/add_multiple_to_favorites.spec.ts @@ -33,7 +33,7 @@ describe('Favorites - addItemsToFavorites endpoint tests', () => { ], customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/add-multiple-items-to-favorites/all-response-body-properties' + 'x-test-name': '/favorites/add-multiple-favorites/all-response-body-properties' } }; await client.favorites.addMultipleToFavorites(options); @@ -57,7 +57,7 @@ describe('Favorites - addItemsToFavorites endpoint tests', () => { ], customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/add-multiple-items-to-favorites/all-response-body-properties' + 'x-test-name': '/favorites/add-multiple-favorites/all-response-body-properties' } }; const response = await client.favorites.addMultipleToFavorites(options); diff --git a/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts b/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts index 625bc2e..804b280 100644 --- a/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts +++ b/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts @@ -23,7 +23,7 @@ describe('Favorites - removeFromFavorites convenience endpoint tests', () => { favoriteId: TEST_SHEET_ID, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/remove-from-favorites/all-response-body-properties' + 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' } }; await client.favorites.removeSheetFromFavorites(options); @@ -38,7 +38,7 @@ describe('Favorites - removeFromFavorites convenience endpoint tests', () => { favoriteId: TEST_SHEET_ID, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/remove-from-favorites/all-response-body-properties' + 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' } }; const response = await client.favorites.removeSheetFromFavorites(options); @@ -59,7 +59,7 @@ describe('Favorites - removeFromFavorites convenience endpoint tests', () => { favoriteId: TEST_FOLDER_ID, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/remove-from-favorites/all-response-body-properties' + 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' } }; await client.favorites.removeFolderFromFavorites(options); @@ -74,7 +74,7 @@ describe('Favorites - removeFromFavorites convenience endpoint tests', () => { favoriteId: TEST_FOLDER_ID, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/remove-from-favorites/all-response-body-properties' + 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' } }; const response = await client.favorites.removeFolderFromFavorites(options); diff --git a/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts b/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts index c5aa2ff..c311a5d 100644 --- a/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts +++ b/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts @@ -25,13 +25,20 @@ describe('Favorites - removeMultipleFavorites convenience endpoint tests', () => }, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/remove-multiple-favorites/all-response-body-properties' + 'x-test-name': '/favorites/delete-multiple-favorites/all-response-body-properties' } }; await client.favorites.removeSheetsFromFavorites(options); const matchedRequest = await findWireMockRequest(requestId); expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_SHEET}`)).toBeTruthy(); + + // Verify query parameters + expect(matchedRequest.queryParams).toEqual({ + objectIds: { + values: [`${TEST_SHEET_ID},${TEST_FOLDER_ID}`] + } + }); }); it('removeSheetsFromFavorites all response body properties', async () => { @@ -42,16 +49,10 @@ describe('Favorites - removeMultipleFavorites convenience endpoint tests', () => }, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/remove-multiple-favorites/all-response-body-properties' + 'x-test-name': '/favorites/delete-multiple-favorites/all-response-body-properties' } }; const response = await client.favorites.removeSheetsFromFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - // Verify query parameters - const queryParams = matchedRequest.queryParams; - expect(queryParams.objectIds).toBeTruthy(); - expect(queryParams.objectIds.values[0]).toBe(`${TEST_SHEET_ID},${TEST_FOLDER_ID}`); // Verify response expect(response).toBeTruthy(); @@ -67,13 +68,20 @@ describe('Favorites - removeMultipleFavorites convenience endpoint tests', () => }, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/remove-multiple-favorites/all-response-body-properties' + 'x-test-name': '/favorites/delete-multiple-favorites/all-response-body-properties' } }; await client.favorites.removeFoldersFromFavorites(options); const matchedRequest = await findWireMockRequest(requestId); expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_FOLDER}`)).toBeTruthy(); + + // Verify query parameters + expect(matchedRequest.queryParams).toEqual({ + objectIds: { + values: [`${TEST_SHEET_ID},${TEST_FOLDER_ID}`] + } + }); }); it('removeFoldersFromFavorites all response body properties', async () => { @@ -84,16 +92,10 @@ describe('Favorites - removeMultipleFavorites convenience endpoint tests', () => }, customProperties: { 'x-request-id': requestId, - 'x-test-name': '/favorites/remove-multiple-favorites/all-response-body-properties' + 'x-test-name': '/favorites/delete-multiple-favorites/all-response-body-properties' } }; const response = await client.favorites.removeFoldersFromFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - // Verify query parameters - const queryParams = matchedRequest.queryParams; - expect(queryParams.objectIds).toBeTruthy(); - expect(queryParams.objectIds.values[0]).toBe(`${TEST_SHEET_ID},${TEST_FOLDER_ID}`); // Verify response expect(response).toBeTruthy(); From 2709cc48c9f54cd5d4d3491da9d3855de4fe32ba Mon Sep 17 00:00:00 2001 From: denislavstanchev Date: Mon, 1 Dec 2025 16:43:38 +0200 Subject: [PATCH 4/8] fix formatting --- lib/favorites/index.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/favorites/index.ts b/lib/favorites/index.ts index 39f3efb..241b651 100644 --- a/lib/favorites/index.ts +++ b/lib/favorites/index.ts @@ -45,10 +45,7 @@ export function create(options: CreateOptions): FavoritesApi { }; const buildFavoriteAddition = (type: FavoriteType) => { - return ( - postOptions: AddFavoriteConvenienceOptions, - callback?: RequestCallback - ) => { + return (postOptions: AddFavoriteConvenienceOptions, callback?: RequestCallback) => { const options: AddFavoriteConvenienceOptions = { ...JSON.parse(JSON.stringify(postOptions)), type, @@ -92,7 +89,7 @@ export function create(options: CreateOptions): FavoritesApi { const urlOptions = { url: options.apiUrls.favorites + '/' + deleteOptions.favoriteType, }; - + // Transform objectIds array to comma-separated string if needed const processedOptions = { ...deleteOptions }; if (processedOptions.queryParameters?.objectIds && Array.isArray(processedOptions.queryParameters.objectIds)) { @@ -101,7 +98,7 @@ export function create(options: CreateOptions): FavoritesApi { objectIds: processedOptions.queryParameters.objectIds.join(','), }; } - + return requestor.delete({ ...optionsToSend, ...urlOptions, ...processedOptions }, callback); }; From 48e541872e5ec6b70ba21f560f61b2b1ef125310 Mon Sep 17 00:00:00 2001 From: denislavstanchev Date: Mon, 1 Dec 2025 17:11:29 +0200 Subject: [PATCH 5/8] Fix build and tests --- lib/favorites/types.ts | 2 +- lib/types/SmartsheetClient.ts | 2 +- .../remove_multiple_favorites_convenience_functions.spec.ts | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/favorites/types.ts b/lib/favorites/types.ts index 288be46..7726270 100644 --- a/lib/favorites/types.ts +++ b/lib/favorites/types.ts @@ -394,7 +394,7 @@ export interface AddFavoriteConvenienceOptions extends RequestOptions // Verify query parameters expect(matchedRequest.queryParams).toEqual({ objectIds: { + key: 'objectIds', values: [`${TEST_SHEET_ID},${TEST_FOLDER_ID}`] } }); @@ -79,6 +80,7 @@ describe('Favorites - removeMultipleFavorites convenience endpoint tests', () => // Verify query parameters expect(matchedRequest.queryParams).toEqual({ objectIds: { + key: 'objectIds', values: [`${TEST_SHEET_ID},${TEST_FOLDER_ID}`] } }); From fe3d409a84966bce740e7be4606ab450307afb93 Mon Sep 17 00:00:00 2001 From: denislavstanchev Date: Mon, 1 Dec 2025 17:36:18 +0200 Subject: [PATCH 6/8] remove unnecessary tests --- ...to_favorites_convenience_functions.spec.ts | 176 ------------------ .../favorites/remove_favorite.spec.ts | 85 +++++++++ ...om_favorites_convenience_functions.spec.ts | 163 ---------------- ...c.ts => remove_multiple_favorites.spec.ts} | 67 +------ 4 files changed, 90 insertions(+), 401 deletions(-) delete mode 100644 test/mock-api/favorites/add_to_favorites_convenience_functions.spec.ts create mode 100644 test/mock-api/favorites/remove_favorite.spec.ts delete mode 100644 test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts rename test/mock-api/favorites/{remove_multiple_favorites_convenience_functions.spec.ts => remove_multiple_favorites.spec.ts} (64%) diff --git a/test/mock-api/favorites/add_to_favorites_convenience_functions.spec.ts b/test/mock-api/favorites/add_to_favorites_convenience_functions.spec.ts deleted file mode 100644 index fae4a47..0000000 --- a/test/mock-api/favorites/add_to_favorites_convenience_functions.spec.ts +++ /dev/null @@ -1,176 +0,0 @@ -import crypto from 'crypto'; -import { createClient, findWireMockRequest } from '../utils/utils'; -import { expect } from '@jest/globals'; -import { - TEST_SHEET_ID, - TEST_FOLDER_ID, - TEST_FAVORITE_TYPE_SHEET, - TEST_FAVORITE_TYPE_FOLDER, - 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'; -import type { Favorite } from '@smartsheet/favorites/types'; - -describe('Favorites - addToFavorites convenience endpoint tests', () => { - const client = createClient(); - - it('addSheetToFavorites generated url is correct', async () => { - const requestId = crypto.randomUUID(); - const options = { - objectId: TEST_SHEET_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/add-sheet-to-favorites/all-response-body-properties' - } - }; - await client.favorites.addSheetToFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); - }); - - it('addSheetToFavorites all response body properties', async () => { - const requestId = crypto.randomUUID(); - const options = { - objectId: TEST_SHEET_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/add-sheet-to-favorites/all-response-body-properties' - } - }; - const response = await client.favorites.addSheetToFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - // Verify request body - const requestBody = JSON.parse(matchedRequest.body); - expect(requestBody.type).toBe(TEST_FAVORITE_TYPE_SHEET); - expect(requestBody.objectId).toBe(TEST_SHEET_ID); - - // Verify response - expect(response).toBeTruthy(); - expect(response.message).toBe(TEST_SUCCESS_MESSAGE); - expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); - expect(response.result).toBeTruthy(); - const result = response.result as Favorite; - expect(result.type).toBe(TEST_FAVORITE_TYPE_SHEET); - expect(result.objectId).toBe(TEST_SHEET_ID); - }); - - it('addFolderToFavorites generated url is correct', async () => { - const requestId = crypto.randomUUID(); - const options = { - objectId: TEST_FOLDER_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/add-folder-to-favorites/all-response-body-properties' - } - }; - await client.favorites.addFolderToFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); - }); - - it('addFolderToFavorites all response body properties', async () => { - const requestId = crypto.randomUUID(); - const options = { - objectId: TEST_FOLDER_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/add-folder-to-favorites/all-response-body-properties' - } - }; - const response = await client.favorites.addFolderToFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - // Verify request body - const requestBody = JSON.parse(matchedRequest.body); - expect(requestBody.type).toBe(TEST_FAVORITE_TYPE_FOLDER); - expect(requestBody.objectId).toBe(TEST_FOLDER_ID); - - // Verify response - expect(response).toBeTruthy(); - expect(response.message).toBe(TEST_SUCCESS_MESSAGE); - expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); - expect(response.result).toBeTruthy(); - const result = response.result as Favorite; - expect(result.type).toBe(TEST_FAVORITE_TYPE_FOLDER); - expect(result.objectId).toBe(TEST_FOLDER_ID); - }); - - it('addSheetToFavorites error 500 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - objectId: TEST_SHEET_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/500-response' - } - }; - try { - await client.favorites.addSheetToFavorites(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('addSheetToFavorites error 400 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - objectId: TEST_SHEET_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/400-response' - } - }; - try { - await client.favorites.addSheetToFavorites(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); - } - }); - - it('addFolderToFavorites error 500 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - objectId: TEST_FOLDER_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/500-response' - } - }; - try { - await client.favorites.addFolderToFavorites(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('addFolderToFavorites error 400 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - objectId: TEST_FOLDER_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/400-response' - } - }; - try { - await client.favorites.addFolderToFavorites(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); - } - }); -}); diff --git a/test/mock-api/favorites/remove_favorite.spec.ts b/test/mock-api/favorites/remove_favorite.spec.ts new file mode 100644 index 0000000..79a1942 --- /dev/null +++ b/test/mock-api/favorites/remove_favorite.spec.ts @@ -0,0 +1,85 @@ +import crypto from 'crypto'; +import { createClient, findWireMockRequest } from '../utils/utils'; +import { expect } from '@jest/globals'; +import { + TEST_SHEET_ID, + TEST_FAVORITE_TYPE_SHEET, + 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('Favorites - removeFavorite endpoint tests', () => { + const client = createClient(); + + it('removeSheetFromFavorites generated url is correct', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' + } + }; + await client.favorites.removeSheetFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_SHEET}/${TEST_SHEET_ID}`)).toBeTruthy(); + }); + + it('removeSheetFromFavorites all response body properties', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' + } + }; + const response = await client.favorites.removeSheetFromFavorites(options); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + }); + + it('removeSheetFromFavorites error 500 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/500-response' + } + }; + try { + await client.favorites.removeSheetFromFavorites(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('removeSheetFromFavorites error 400 response', async () => { + const requestId = crypto.randomUUID(); + const options = { + favoriteId: TEST_SHEET_ID, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/errors/400-response' + } + }; + try { + await client.favorites.removeSheetFromFavorites(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); + } + }); +}); diff --git a/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts b/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts deleted file mode 100644 index 804b280..0000000 --- a/test/mock-api/favorites/remove_from_favorites_convenience_functions.spec.ts +++ /dev/null @@ -1,163 +0,0 @@ -import crypto from 'crypto'; -import { createClient, findWireMockRequest } from '../utils/utils'; -import { expect } from '@jest/globals'; -import { - TEST_SHEET_ID, - TEST_FOLDER_ID, - TEST_FAVORITE_TYPE_SHEET, - TEST_FAVORITE_TYPE_FOLDER, - 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('Favorites - removeFromFavorites convenience endpoint tests', () => { - const client = createClient(); - - it('removeSheetFromFavorites generated url is correct', async () => { - const requestId = crypto.randomUUID(); - const options = { - favoriteId: TEST_SHEET_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' - } - }; - await client.favorites.removeSheetFromFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_SHEET}/${TEST_SHEET_ID}`)).toBeTruthy(); - }); - - it('removeSheetFromFavorites all response body properties', async () => { - const requestId = crypto.randomUUID(); - const options = { - favoriteId: TEST_SHEET_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' - } - }; - const response = await client.favorites.removeSheetFromFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - // Verify URL contains the correct favorite type and ID - expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_SHEET}/${TEST_SHEET_ID}`)).toBeTruthy(); - - // Verify response - expect(response).toBeTruthy(); - expect(response.message).toBe(TEST_SUCCESS_MESSAGE); - expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); - }); - - it('removeFolderFromFavorites generated url is correct', async () => { - const requestId = crypto.randomUUID(); - const options = { - favoriteId: TEST_FOLDER_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' - } - }; - await client.favorites.removeFolderFromFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_FOLDER}/${TEST_FOLDER_ID}`)).toBeTruthy(); - }); - - it('removeFolderFromFavorites all response body properties', async () => { - const requestId = crypto.randomUUID(); - const options = { - favoriteId: TEST_FOLDER_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/delete-favorite/all-response-body-properties' - } - }; - const response = await client.favorites.removeFolderFromFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - // Verify URL contains the correct favorite type and ID - expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_FOLDER}/${TEST_FOLDER_ID}`)).toBeTruthy(); - - // Verify response - expect(response).toBeTruthy(); - expect(response.message).toBe(TEST_SUCCESS_MESSAGE); - expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); - }); - - it('removeSheetFromFavorites error 500 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - favoriteId: TEST_SHEET_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/500-response' - } - }; - try { - await client.favorites.removeSheetFromFavorites(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('removeSheetFromFavorites error 400 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - favoriteId: TEST_SHEET_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/400-response' - } - }; - try { - await client.favorites.removeSheetFromFavorites(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); - } - }); - - it('removeFolderFromFavorites error 500 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - favoriteId: TEST_FOLDER_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/500-response' - } - }; - try { - await client.favorites.removeFolderFromFavorites(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('removeFolderFromFavorites error 400 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - favoriteId: TEST_FOLDER_ID, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/400-response' - } - }; - try { - await client.favorites.removeFolderFromFavorites(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); - } - }); -}); diff --git a/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts b/test/mock-api/favorites/remove_multiple_favorites.spec.ts similarity index 64% rename from test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts rename to test/mock-api/favorites/remove_multiple_favorites.spec.ts index f641ddb..e8a36f8 100644 --- a/test/mock-api/favorites/remove_multiple_favorites_convenience_functions.spec.ts +++ b/test/mock-api/favorites/remove_multiple_favorites.spec.ts @@ -5,7 +5,6 @@ import { TEST_SHEET_ID, TEST_FOLDER_ID, TEST_FAVORITE_TYPE_SHEET, - TEST_FAVORITE_TYPE_FOLDER, TEST_SUCCESS_MESSAGE, TEST_SUCCESS_RESULT_CODE, ERROR_500_STATUS_CODE, @@ -14,7 +13,7 @@ import { ERROR_400_MESSAGE } from './common_test_constants'; -describe('Favorites - removeMultipleFavorites convenience endpoint tests', () => { +describe('Favorites - removeMultipleFavorites endpoint tests', () => { const client = createClient(); it('removeSheetsFromFavorites generated url is correct', async () => { @@ -61,43 +60,27 @@ describe('Favorites - removeMultipleFavorites convenience endpoint tests', () => expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); }); - it('removeFoldersFromFavorites generated url is correct', async () => { + it('removeSheetsFromFavorites with array objectIds', async () => { const requestId = crypto.randomUUID(); const options = { queryParameters: { - objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` + objectIds: [TEST_SHEET_ID.toString(), TEST_FOLDER_ID.toString()] }, customProperties: { 'x-request-id': requestId, 'x-test-name': '/favorites/delete-multiple-favorites/all-response-body-properties' } }; - await client.favorites.removeFoldersFromFavorites(options); + const response = await client.favorites.removeSheetsFromFavorites(options); const matchedRequest = await findWireMockRequest(requestId); - - expect(matchedRequest.url.includes(`/2.0/favorites/${TEST_FAVORITE_TYPE_FOLDER}`)).toBeTruthy(); - // Verify query parameters + // Verify query parameters were transformed to string expect(matchedRequest.queryParams).toEqual({ objectIds: { key: 'objectIds', values: [`${TEST_SHEET_ID},${TEST_FOLDER_ID}`] } }); - }); - - it('removeFoldersFromFavorites all response body properties', async () => { - const requestId = crypto.randomUUID(); - const options = { - queryParameters: { - objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` - }, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/delete-multiple-favorites/all-response-body-properties' - } - }; - const response = await client.favorites.removeFoldersFromFavorites(options); // Verify response expect(response).toBeTruthy(); @@ -144,44 +127,4 @@ describe('Favorites - removeMultipleFavorites convenience endpoint tests', () => expect(error.message).toBe(ERROR_400_MESSAGE); } }); - - it('removeFoldersFromFavorites error 500 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - queryParameters: { - objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` - }, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/500-response' - } - }; - try { - await client.favorites.removeFoldersFromFavorites(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('removeFoldersFromFavorites error 400 response', async () => { - const requestId = crypto.randomUUID(); - const options = { - queryParameters: { - objectIds: `${TEST_SHEET_ID},${TEST_FOLDER_ID}` - }, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/errors/400-response' - } - }; - try { - await client.favorites.removeFoldersFromFavorites(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 dd2038b74a9601143293adb37cf8879e0bebf837 Mon Sep 17 00:00:00 2001 From: denislavstanchev Date: Tue, 2 Dec 2025 11:22:41 +0200 Subject: [PATCH 7/8] Move query param checks, add new query params test cases for remove multiple favorites --- lib/favorites/types.ts | 2 +- .../mock-api/favorites/list_favorites.spec.ts | 11 ++-- .../remove_multiple_favorites.spec.ts | 60 ++++++++++++++++++- 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/lib/favorites/types.ts b/lib/favorites/types.ts index 7726270..7db65be 100644 --- a/lib/favorites/types.ts +++ b/lib/favorites/types.ts @@ -422,7 +422,7 @@ export interface RemoveMultipleFavoritesQueryParams { /** * A comma-separated list of Ids of the favorited item. */ - objectIds?: string | string[]; + objectIds?: string | string[] | number | number[]; } export interface RemoveMultipleFavoritesOptions extends RequestOptions { diff --git a/test/mock-api/favorites/list_favorites.spec.ts b/test/mock-api/favorites/list_favorites.spec.ts index 1702156..0c20d5c 100644 --- a/test/mock-api/favorites/list_favorites.spec.ts +++ b/test/mock-api/favorites/list_favorites.spec.ts @@ -30,6 +30,11 @@ describe('Favorites - listFavorites endpoint tests', () => { const matchedRequest = await findWireMockRequest(requestId); expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); + + // Verify query parameters + const queryParams = matchedRequest.queryParams; + expect(queryParams.includeAll).toBeTruthy(); + expect(queryParams.includeAll.values[0]).toBe('true'); }); it('listFavorites all response body properties', async () => { @@ -44,12 +49,6 @@ describe('Favorites - listFavorites endpoint tests', () => { } }; const response = await client.favorites.listFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - // Verify query parameters - const queryParams = matchedRequest.queryParams; - expect(queryParams.includeAll).toBeTruthy(); - expect(queryParams.includeAll.values[0]).toBe('true'); // Verify response structure expect(response).toBeTruthy(); diff --git a/test/mock-api/favorites/remove_multiple_favorites.spec.ts b/test/mock-api/favorites/remove_multiple_favorites.spec.ts index e8a36f8..b7bc8ad 100644 --- a/test/mock-api/favorites/remove_multiple_favorites.spec.ts +++ b/test/mock-api/favorites/remove_multiple_favorites.spec.ts @@ -60,7 +60,7 @@ describe('Favorites - removeMultipleFavorites endpoint tests', () => { expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); }); - it('removeSheetsFromFavorites with array objectIds', async () => { + it('removeSheetsFromFavorites with string array objectIds', async () => { const requestId = crypto.randomUUID(); const options = { queryParameters: { @@ -74,7 +74,7 @@ describe('Favorites - removeMultipleFavorites endpoint tests', () => { const response = await client.favorites.removeSheetsFromFavorites(options); const matchedRequest = await findWireMockRequest(requestId); - // Verify query parameters were transformed to string + // Verify query parameters were transformed to comma-separated string expect(matchedRequest.queryParams).toEqual({ objectIds: { key: 'objectIds', @@ -88,6 +88,62 @@ describe('Favorites - removeMultipleFavorites endpoint tests', () => { expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); }); + it('removeSheetsFromFavorites with number array objectIds', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: [TEST_SHEET_ID, TEST_FOLDER_ID] + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/delete-multiple-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.removeSheetsFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify query parameters were transformed to comma-separated string + expect(matchedRequest.queryParams).toEqual({ + objectIds: { + key: 'objectIds', + values: [`${TEST_SHEET_ID},${TEST_FOLDER_ID}`] + } + }); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + }); + + it('removeSheetsFromFavorites with single number objectIds', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + objectIds: TEST_SHEET_ID + }, + customProperties: { + 'x-request-id': requestId, + 'x-test-name': '/favorites/delete-multiple-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.removeSheetsFromFavorites(options); + const matchedRequest = await findWireMockRequest(requestId); + + // Verify query parameters + expect(matchedRequest.queryParams).toEqual({ + objectIds: { + key: 'objectIds', + values: [`${TEST_SHEET_ID}`] + } + }); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + }); + it('removeSheetsFromFavorites error 500 response', async () => { const requestId = crypto.randomUUID(); const options = { From b5a437ec43019a3192869e0dd21ee1a27e855b93 Mon Sep 17 00:00:00 2001 From: denislavstanchev Date: Tue, 2 Dec 2025 13:21:01 +0200 Subject: [PATCH 8/8] fix query params and request body comparisons --- .../favorites/add_items_to_favorites.spec.ts | 6 ++- .../add_multiple_to_favorites.spec.ts | 16 +++--- .../mock-api/favorites/list_favorites.spec.ts | 49 +++++++------------ 3 files changed, 31 insertions(+), 40 deletions(-) diff --git a/test/mock-api/favorites/add_items_to_favorites.spec.ts b/test/mock-api/favorites/add_items_to_favorites.spec.ts index 04c64e8..5f02d2e 100644 --- a/test/mock-api/favorites/add_items_to_favorites.spec.ts +++ b/test/mock-api/favorites/add_items_to_favorites.spec.ts @@ -51,8 +51,10 @@ describe('Favorites - addItemsToFavorites endpoint tests', () => { // Verify request body const requestBody = JSON.parse(matchedRequest.body); - expect(requestBody.type).toBe(TEST_FAVORITE_TYPE_SHEET); - expect(requestBody.objectId).toBe(TEST_SHEET_ID); + expect(requestBody).toEqual({ + type: TEST_FAVORITE_TYPE_SHEET, + objectId: TEST_SHEET_ID + }); // Verify response expect(response).toBeTruthy(); diff --git a/test/mock-api/favorites/add_multiple_to_favorites.spec.ts b/test/mock-api/favorites/add_multiple_to_favorites.spec.ts index afe15fe..5c73593 100644 --- a/test/mock-api/favorites/add_multiple_to_favorites.spec.ts +++ b/test/mock-api/favorites/add_multiple_to_favorites.spec.ts @@ -65,12 +65,16 @@ describe('Favorites - addItemsToFavorites endpoint tests', () => { // Verify request body const requestBody = JSON.parse(matchedRequest.body); - expect(Array.isArray(requestBody)).toBeTruthy(); - expect(requestBody.length).toBe(2); - expect(requestBody[0].type).toBe(TEST_FAVORITE_TYPE_SHEET); - expect(requestBody[0].objectId).toBe(TEST_SHEET_ID); - expect(requestBody[1].type).toBe(TEST_FAVORITE_TYPE_FOLDER); - expect(requestBody[1].objectId).toBe(TEST_FOLDER_ID); + expect(requestBody).toEqual([ + { + type: TEST_FAVORITE_TYPE_SHEET, + objectId: TEST_SHEET_ID + }, + { + type: TEST_FAVORITE_TYPE_FOLDER, + objectId: TEST_FOLDER_ID + } + ]); // Verify response expect(response).toBeTruthy(); diff --git a/test/mock-api/favorites/list_favorites.spec.ts b/test/mock-api/favorites/list_favorites.spec.ts index 0c20d5c..cc9135f 100644 --- a/test/mock-api/favorites/list_favorites.spec.ts +++ b/test/mock-api/favorites/list_favorites.spec.ts @@ -19,7 +19,9 @@ describe('Favorites - listFavorites endpoint tests', () => { const requestId = crypto.randomUUID(); const options = { queryParameters: { - includeAll: true + includeAll: false, + page: 1, + pageSize: 50 }, customProperties: { 'x-request-id': requestId, @@ -32,9 +34,20 @@ describe('Favorites - listFavorites endpoint tests', () => { expect(matchedRequest.url.includes('/2.0/favorites')).toBeTruthy(); // Verify query parameters - const queryParams = matchedRequest.queryParams; - expect(queryParams.includeAll).toBeTruthy(); - expect(queryParams.includeAll.values[0]).toBe('true'); + expect(matchedRequest.queryParams).toEqual({ + includeAll: { + key: 'includeAll', + values: ['false'] + }, + page: { + key: 'page', + values: ['1'] + }, + pageSize: { + key: 'pageSize', + values: ['50'] + } + }); }); it('listFavorites all response body properties', async () => { @@ -69,34 +82,6 @@ describe('Favorites - listFavorites endpoint tests', () => { expect(response.data[1].objectId).toBe(TEST_FOLDER_ID); }); - it('listFavorites with pagination parameters', async () => { - const requestId = crypto.randomUUID(); - const options = { - queryParameters: { - page: 1, - pageSize: 50 - }, - customProperties: { - 'x-request-id': requestId, - 'x-test-name': '/favorites/list-favorites/all-response-body-properties' - } - }; - const response = await client.favorites.listFavorites(options); - const matchedRequest = await findWireMockRequest(requestId); - - // Verify query parameters - const queryParams = matchedRequest.queryParams; - expect(queryParams.page).toBeTruthy(); - expect(queryParams.page.values[0]).toBe('1'); - expect(queryParams.pageSize).toBeTruthy(); - expect(queryParams.pageSize.values[0]).toBe('50'); - - // Verify response - expect(response).toBeTruthy(); - expect(response.data).toBeTruthy(); - expect(Array.isArray(response.data)).toBe(true); - }); - it('listFavorites error 500 response', async () => { const requestId = crypto.randomUUID(); const options = {