From a42bef13ece70bd2295e50b11c923808b22bd3b0 Mon Sep 17 00:00:00 2001 From: shrouti1507 Date: Fri, 8 Nov 2024 17:34:05 +0530 Subject: [PATCH] fix: linkedin ads conversionValue object as well as price is not mandatory --- src/cdk/v2/destinations/linkedin_ads/utils.js | 6 +- .../destinations/linkedin_ads/utils.test.js | 9 +- .../processor/validationTestData.ts | 117 ++++++++++++++++-- 3 files changed, 112 insertions(+), 20 deletions(-) diff --git a/src/cdk/v2/destinations/linkedin_ads/utils.js b/src/cdk/v2/destinations/linkedin_ads/utils.js index 69fea4299d0..93a46fe68b9 100644 --- a/src/cdk/v2/destinations/linkedin_ads/utils.js +++ b/src/cdk/v2/destinations/linkedin_ads/utils.js @@ -89,7 +89,7 @@ function checkIfPricePresent(properties) { } const calculateConversionObject = (message) => { - const { properties, event } = message; + const { properties } = message; const calculateAmount = () => { if (properties?.products && properties.products.length > 0) { @@ -107,9 +107,7 @@ const calculateConversionObject = (message) => { }; return conversionObject; } - throw new InstrumentationError( - `[LinkedIn Conversion API]: Cannot map price for event ${event}. Aborting`, - ); + return null; }; const deduceConversionRules = (trackEventName, destConfig) => { diff --git a/src/cdk/v2/destinations/linkedin_ads/utils.test.js b/src/cdk/v2/destinations/linkedin_ads/utils.test.js index ee52928198a..d66bda47dc1 100644 --- a/src/cdk/v2/destinations/linkedin_ads/utils.test.js +++ b/src/cdk/v2/destinations/linkedin_ads/utils.test.js @@ -29,12 +29,13 @@ describe('formatEmail', () => { }); describe('calculateConversionObject', () => { - // Returns a conversion object with currency code 'USD' and amount 0 when message properties are empty - it('should throw instrumentation error when message properties are empty', () => { + // Returns empty object when message properties are empty + it('should return empty object when message properties are empty', () => { const message = { properties: {} }; expect(() => { - fetchUserIds(calculateConversionObject(message)); - }).toThrow(InstrumentationError); + const conversionObject = calculateConversionObject(message); + expect(conversionObject).toEqual({}); + }); }); // Returns a conversion object with currency code 'USD' and amount 0 when message properties price is defined but quantity is 0 diff --git a/test/integrations/destinations/linkedin_ads/processor/validationTestData.ts b/test/integrations/destinations/linkedin_ads/processor/validationTestData.ts index 4579cf68ee2..5cb6ff8cf27 100644 --- a/test/integrations/destinations/linkedin_ads/processor/validationTestData.ts +++ b/test/integrations/destinations/linkedin_ads/processor/validationTestData.ts @@ -1,4 +1,9 @@ -import { generateMetadata, generateTrackPayload, overrideDestination } from '../../../testUtils'; +import { + generateMetadata, + generateTrackPayload, + overrideDestination, + transformResultBuilder, +} from '../../../testUtils'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; @@ -75,6 +80,14 @@ const commonStats = { workspaceId: 'default-workspaceId', }; +const commonHeader = { + Authorization: 'Bearer default-accessToken', + 'Content-Type': 'application/json', + 'LinkedIn-Version': '202402', + 'X-RestLi-Method': 'BATCH_CREATE', + 'X-Restli-Protocol-Version': '2.0.0', +}; + const commonTimestamp = new Date('2023-10-14'); const olderTimestamp = new Date('2023-07-13'); @@ -234,7 +247,7 @@ export const validationTestData: ProcessorTestData[] = [ description: 'Track call : properties without product array and no price', scenario: 'Business', successCriteria: - 'should throw error with status code 400 and error message regarding price is a mandatory field for linkedin conversions', + 'should not have conversionValue object as price is a mandatory field for linkedin conversions', feature: 'processor', module: 'destination', version: 'v0', @@ -243,7 +256,7 @@ export const validationTestData: ProcessorTestData[] = [ body: [ { message: generateTrackPayload({ - event: 'random event', + event: 'ABC Searched', properties: commonUserProperties, context: { traits: commonUserTraits, @@ -264,11 +277,51 @@ export const validationTestData: ProcessorTestData[] = [ status: 200, body: [ { - error: - '[LinkedIn Conversion API]: Cannot map price for event random event. Aborting: Workflow: procWorkflow, Step: commonFields, ChildStep: undefined, OriginalError: [LinkedIn Conversion API]: Cannot map price for event random event. Aborting', + output: transformResultBuilder({ + version: '1', + type: 'REST', + method: 'POST', + endpoint: `https://api.linkedin.com/rest/conversionEvents`, + headers: commonHeader, + params: {}, + FORM: {}, + files: {}, + JSON: { + elements: [ + { + conversion: 'urn:lla:llaPartnerConversion:1234567', + conversionHappenedAt: 1697241600000, + eventId: '12345', + user: { + userIds: [ + { + idType: 'SHA256_EMAIL', + idValue: + '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + }, + ], + }, + }, + { + conversion: 'urn:lla:llaPartnerConversion:34567', + conversionHappenedAt: 1697241600000, + eventId: '12345', + user: { + userIds: [ + { + idType: 'SHA256_EMAIL', + idValue: + '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + }, + ], + }, + }, + ], + }, + userId: '', + }), + statusCode: 200, metadata: generateMetadata(1), - statTags: commonStats, - statusCode: 400, }, ], }, @@ -289,7 +342,7 @@ export const validationTestData: ProcessorTestData[] = [ body: [ { message: generateTrackPayload({ - event: 'random event', + event: 'ABC Searched', properties: commonUserPropertiesWithProductWithoutPrice, context: { traits: commonUserTraits, @@ -310,11 +363,51 @@ export const validationTestData: ProcessorTestData[] = [ status: 200, body: [ { - error: - '[LinkedIn Conversion API]: Cannot map price for event random event. Aborting: Workflow: procWorkflow, Step: commonFields, ChildStep: undefined, OriginalError: [LinkedIn Conversion API]: Cannot map price for event random event. Aborting', + output: transformResultBuilder({ + version: '1', + type: 'REST', + method: 'POST', + endpoint: `https://api.linkedin.com/rest/conversionEvents`, + headers: commonHeader, + params: {}, + FORM: {}, + files: {}, + JSON: { + elements: [ + { + conversion: 'urn:lla:llaPartnerConversion:1234567', + conversionHappenedAt: 1697241600000, + eventId: '12345', + user: { + userIds: [ + { + idType: 'SHA256_EMAIL', + idValue: + '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + }, + ], + }, + }, + { + conversion: 'urn:lla:llaPartnerConversion:34567', + conversionHappenedAt: 1697241600000, + eventId: '12345', + user: { + userIds: [ + { + idType: 'SHA256_EMAIL', + idValue: + '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + }, + ], + }, + }, + ], + }, + userId: '', + }), + statusCode: 200, metadata: generateMetadata(1), - statTags: commonStats, - statusCode: 400, }, ], },