diff --git a/packages/respect-core/src/modules/__tests__/config-parcer/map-header-params-and-cookie-to-object.test.ts b/packages/respect-core/src/modules/__tests__/config-parcer/map-header-params-and-cookie-to-object.test.ts deleted file mode 100644 index c96e8e9c55..0000000000 --- a/packages/respect-core/src/modules/__tests__/config-parcer/map-header-params-and-cookie-to-object.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { mapHeaderParamsAndCookieToObject } from '../../config-parser/map-header-params-and-cookie-to-object'; - -describe('mapHeaderParamsAndCookieToObject', () => { - it('should map header parameters correctly', () => { - const headerParams = { - 'Content-Type': 'application/json', - Authorization: 'Bearer token', - }; - const result = mapHeaderParamsAndCookieToObject(headerParams); - expect(result).toEqual({ - 'Content-Type': 'application/json', - Authorization: 'Bearer token', - }); - }); - - it('should map cookies correctly', () => { - const headerParams = { - Cookie: 'sessionId=abc123; userId=xyz789', - }; - const result = mapHeaderParamsAndCookieToObject(headerParams); - expect(result).toEqual({ - sessionId: 'abc123', - userId: 'xyz789', - }); - }); - - it('should handle mixed headers and cookies', () => { - const headerParams = { - 'Content-Type': 'application/json', - Cookie: 'sessionId=abc123; userId=xyz789', - Authorization: 'Bearer token', - }; - const result = mapHeaderParamsAndCookieToObject(headerParams); - expect(result).toEqual({ - 'Content-Type': 'application/json', - sessionId: 'abc123', - userId: 'xyz789', - Authorization: 'Bearer token', - }); - }); - - it('should handle empty cookie header', () => { - const headerParams = { - Cookie: '', - }; - const result = mapHeaderParamsAndCookieToObject(headerParams); - expect(result).toEqual({}); - }); - - it('should handle malformed cookie header', () => { - const headerParams = { - Cookie: 'sessionId=abc123; malformedCookie', - }; - const result = mapHeaderParamsAndCookieToObject(headerParams); - expect(result).toEqual({ - sessionId: 'abc123', - }); - }); - - it('should handle multiple cookies with spaces', () => { - const headerParams = { - Cookie: 'sessionId=abc123; userId=xyz789; token=abc def', - }; - const result = mapHeaderParamsAndCookieToObject(headerParams); - expect(result).toEqual({ - sessionId: 'abc123', - userId: 'xyz789', - token: 'abc def', - }); - }); -}); diff --git a/packages/respect-core/src/modules/__tests__/flow-runner/prepare-request.test.ts b/packages/respect-core/src/modules/__tests__/flow-runner/prepare-request.test.ts index 6e9e83683d..0c9c05b8d7 100644 --- a/packages/respect-core/src/modules/__tests__/flow-runner/prepare-request.test.ts +++ b/packages/respect-core/src/modules/__tests__/flow-runner/prepare-request.test.ts @@ -1498,4 +1498,184 @@ describe('prepareRequest', () => { }, ]); }); + + it('should merge cookie parameters from workflow and step', async () => { + const localCtx = { + ...ctx, + ...{ + workflows: [ + { + workflowId: 'get-breeds-workflow', + parameters: [ + { + name: 'pageSize', + in: 'header', + value: 100, + }, + { + name: 'cookie', + in: 'header', + value: 'sessionId=32;userId=32;workflow-cookie=32', + }, + { + name: 'token-from-workflow', + in: 'cookie', + value: '32', + }, + ], + steps: [ + { + stepId: 'get-breeds-step', + operationId: 'cats.getBreeds', + parameters: [ + { + name: 'step-header', + in: 'header', + value: 'step-header-value', + }, + { + name: 'token-from-step', + in: 'cookie', + value: '42', + }, + { + name: 'cookie', + in: 'header', + value: 'sessionId=42;stepДookie=42', + }, + ], + checks: [], + response: { + body: { + current_page: 1, + data: [ + { + breed: 'Abyssinian', + country: 'Ethiopia', + origin: 'Natural/Standard', + coat: 'Short', + pattern: 'Ticked', + }, + { + breed: 'Aegean', + country: 'Greece', + origin: 'Natural/Standard', + coat: 'Semi-long', + pattern: 'Bi- or tri-colored', + }, + ], + first_page_url: 'https://catfact.ninja/breeds?page=1', + from: 1, + last_page: 4, + last_page_url: 'https://catfact.ninja/breeds?page=4', + links: [ + { + url: null, + label: 'Previous', + active: false, + }, + { + url: 'https://catfact.ninja/breeds?page=1', + label: '1', + active: true, + }, + ], + next_page_url: 'https://catfact.ninja/breeds?page=2', + path: 'https://catfact.ninja/breeds', + per_page: 25, + prev_page_url: null, + to: 25, + total: 98, + }, + code: 200, + headers: {}, + contentType: 'application/json', + }, + verboseLog: {}, + }, + ], + }, + ], + $workflows: { + 'get-breeds-workflow': { + parameters: [ + { + name: 'pageSize', + in: 'header', + value: 100, + }, + ], + steps: { + 'get-breeds-step': { + request: { + headers: {}, + path: '/breeds', + url: 'https://catfact.ninja/', + method: 'get', + queryParams: {}, + pathParams: {}, + headerParams: {}, + }, + }, + }, + }, + }, + $components: { + parameters: { + page: { + name: 'page', + in: 'header', + value: 1, + }, + pageSize: { + name: 'pageSize', + in: 'header', + value: 100, + }, + }, + }, + }, + } as unknown as TestContext; + + const step = { + stepId: 'get-breeds-step', + operationId: 'cats.getBreeds', + checks: [], + } as unknown as Step; + + const { parameters } = await prepareRequest(localCtx, step, workflowName); + + expect(parameters).toEqual([ + { + value: 'application/json', + in: 'header', + name: 'accept', + }, + { + value: 100, + in: 'header', + name: 'pageSize', + }, + { + value: '32', + in: 'cookie', + name: 'sessionId', + }, + { + value: '32', + in: 'cookie', + name: 'userId', + }, + { + value: '32', + in: 'cookie', + name: 'workflow-cookie', + }, + { + value: '32', + in: 'cookie', + name: 'token-from-workflow', + }, + ]); + }); }); diff --git a/packages/respect-core/src/modules/config-parser/index.ts b/packages/respect-core/src/modules/config-parser/index.ts index 9b67e45c5a..3351c7b7eb 100644 --- a/packages/respect-core/src/modules/config-parser/index.ts +++ b/packages/respect-core/src/modules/config-parser/index.ts @@ -4,4 +4,3 @@ export * from './parse-request-body'; export * from './handle-request-body-replacements'; export * from './resolve-reusable-object-reference'; export * from './resolve-reusable-component'; -export * from './map-header-params-and-cookie-to-object'; diff --git a/packages/respect-core/src/modules/config-parser/map-header-params-and-cookie-to-object.ts b/packages/respect-core/src/modules/config-parser/map-header-params-and-cookie-to-object.ts deleted file mode 100644 index 8a3dfdbf0b..0000000000 --- a/packages/respect-core/src/modules/config-parser/map-header-params-and-cookie-to-object.ts +++ /dev/null @@ -1,21 +0,0 @@ -export function mapHeaderParamsAndCookieToObject(headerParams: { [key: string]: string }): { - [key: string]: string; -} { - const headerParamsWithMappedCookies: { [key: string]: string } = {}; - - for (const [key, value] of Object.entries(headerParams)) { - if (key.toLowerCase() === 'cookie') { - const cookies = value.split(';'); - for (const cookie of cookies) { - const [cookieKey, cookieValue] = cookie.split('='); - if (cookieKey && cookieValue) { - headerParamsWithMappedCookies[cookieKey.trim()] = cookieValue.trim(); - } - } - } else { - headerParamsWithMappedCookies[key] = value; - } - } - - return headerParamsWithMappedCookies; -} diff --git a/packages/respect-core/src/modules/flow-runner/prepare-request.ts b/packages/respect-core/src/modules/flow-runner/prepare-request.ts index 14b591ff89..5ff9aaf228 100644 --- a/packages/respect-core/src/modules/flow-runner/prepare-request.ts +++ b/packages/respect-core/src/modules/flow-runner/prepare-request.ts @@ -222,5 +222,6 @@ function extractCookieParametersFromHeaderParameters( result.push(parameter); } } + return result; } diff --git a/packages/respect-core/src/utils/api-fetcher.ts b/packages/respect-core/src/utils/api-fetcher.ts index e5ae955015..bed27f18bd 100644 --- a/packages/respect-core/src/utils/api-fetcher.ts +++ b/packages/respect-core/src/utils/api-fetcher.ts @@ -147,6 +147,12 @@ export class ApiFetcher implements IFetcher { headers['content-type'] = 'application/json'; } + if (Object.keys(cookies).length) { + headers['cookie'] = Object.entries(cookies) + .map(([key, value]) => `${key}=${value}`) + .join('; '); + } + let resolvedPath = resolvePath(path, pathParams) || ''; const pathWithSearchParams = `${resolvedPath}${ searchParams.toString() ? '?' + searchParams.toString() : ''