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..241b651 --- /dev/null +++ b/lib/favorites/index.ts @@ -0,0 +1,157 @@ +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, + AddFavoriteConvenienceOptions, + RemoveFavoriteOptions, + RemoveMultipleFavoritesOptions, + RemoveFavoritesResponse, +} from './types'; +import { FavoriteType } from './types'; + +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: AddFavoriteConvenienceOptions, + callback?: RequestCallback + ) => { + const body: AddFavoritesBody = { + type: postOptions.type, + objectId: postOptions.objectId, + }; + const options = { ...postOptions, body }; + return addItemsToFavorites(options, callback); + }; + + const buildFavoriteAddition = (type: FavoriteType) => { + return (postOptions: AddFavoriteConvenienceOptions, callback?: RequestCallback) => { + const options: AddFavoriteConvenienceOptions = { + ...JSON.parse(JSON.stringify(postOptions)), + type, + }; + return handleFavorites(options, callback); + }; + }; + + const addSheetToFavorites = buildFavoriteAddition(FavoriteType.SHEET); + + const addFolderToFavorites = buildFavoriteAddition(FavoriteType.FOLDER); + + const addReportToFavorites = buildFavoriteAddition(FavoriteType.REPORT); + + const addTemplateToFavorites = buildFavoriteAddition(FavoriteType.TEMPLATE); + + const addWorkspaceToFavorites = buildFavoriteAddition(FavoriteType.WORKSPACE); + + const addSightToFavorites = buildFavoriteAddition(FavoriteType.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, + }; + + // 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) => { + 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..7db65be --- /dev/null +++ b/lib/favorites/types.ts @@ -0,0 +1,457 @@ +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 AddFavoriteConvenienceOptions} - 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: AddFavoriteConvenienceOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a folder to the user's list of favorite items. + * + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addFolderToFavorites: ( + options: AddFavoriteConvenienceOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a report to the user's list of favorite items. + * + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addReportToFavorites: ( + options: AddFavoriteConvenienceOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a template to the user's list of favorite items. + * + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addTemplateToFavorites: ( + options: AddFavoriteConvenienceOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a workspace to the user's list of favorite items. + * + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addWorkspaceToFavorites: ( + options: AddFavoriteConvenienceOptions, + callback?: RequestCallback + ) => Promise; + + /** + * Adds a sight (dashboard) to the user's list of favorite items. + * + * @param options - {@link AddFavoriteConvenienceOptions} - Configuration options for the request + * @param callback - {@link RequestCallback}\<{@link AddFavoritesResponse}\> - Optional callback function + * @returns Promise\<{@link AddFavoritesResponse}\> + */ + addSightToFavorites: ( + options: AddFavoriteConvenienceOptions, + 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; +} + +/** + * 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 + */ + 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 | string[] | number | number[]; +} + +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..c1a4546 100644 --- a/lib/types/SmartsheetClient.ts +++ b/lib/types/SmartsheetClient.ts @@ -1,3 +1,4 @@ +import type { FavoritesApi } from '../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..740770c 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..5f02d2e --- /dev/null +++ b/test/mock-api/favorites/add_items_to_favorites.spec.ts @@ -0,0 +1,110 @@ +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-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-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).toEqual({ + type: TEST_FAVORITE_TYPE_SHEET, + objectId: 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..5c73593 --- /dev/null +++ b/test/mock-api/favorites/add_multiple_to_favorites.spec.ts @@ -0,0 +1,146 @@ +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-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-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(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(); + 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/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..cc9135f --- /dev/null +++ b/test/mock-api/favorites/list_favorites.spec.ts @@ -0,0 +1,124 @@ +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: false, + page: 1, + pageSize: 50 + }, + 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(); + + // Verify query parameters + 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 () => { + 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); + + // 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 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_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_multiple_favorites.spec.ts b/test/mock-api/favorites/remove_multiple_favorites.spec.ts new file mode 100644 index 0000000..b7bc8ad --- /dev/null +++ b/test/mock-api/favorites/remove_multiple_favorites.spec.ts @@ -0,0 +1,186 @@ +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_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 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/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: { + key: 'objectIds', + values: [`${TEST_SHEET_ID},${TEST_FOLDER_ID}`] + } + }); + }); + + 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/delete-multiple-favorites/all-response-body-properties' + } + }; + const response = await client.favorites.removeSheetsFromFavorites(options); + + // Verify response + expect(response).toBeTruthy(); + expect(response.message).toBe(TEST_SUCCESS_MESSAGE); + expect(response.resultCode).toBe(TEST_SUCCESS_RESULT_CODE); + }); + + it('removeSheetsFromFavorites with string array objectIds', async () => { + const requestId = crypto.randomUUID(); + const options = { + queryParameters: { + 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' + } + }; + 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 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 = { + 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); + } + }); +}); 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