diff --git a/src/controllers/util/index.ts b/src/controllers/util/index.ts index ab2a0f5dc3..b011540fb7 100644 --- a/src/controllers/util/index.ts +++ b/src/controllers/util/index.ts @@ -15,6 +15,7 @@ import { getValueFromMessage } from '../../v0/util'; import genericFieldMap from '../../v0/util/data/GenericFieldMapping.json'; import { EventType, MappedToDestinationKey } from '../../constants'; import { versionConversionFactory } from './versionConversion'; +import defaultFeaturesConfig from '../../features'; export class ControllerUtility { private static sourceVersionMap: Map = new Map(); @@ -29,15 +30,29 @@ export class ControllerUtility { [EventType.TRACK]: [`properties.${RETL_TIMESTAMP}`, ...genericFieldMap.timestamp], }; + private static getSourceDirPath(version: string): string { + if (version === 'v2') { + return path.resolve(__dirname, `../../sources`); + } + return path.resolve(__dirname, `../../${version}/sources`); + } + private static getSourceVersionsMap(): Map { if (this.sourceVersionMap?.size > 0) { return this.sourceVersionMap; } + const versions = ['v0', 'v1']; + if (defaultFeaturesConfig.upgradedToSourceTransformV2) { + // this makes it easy to revert to v0,v1 spec if something doesn't work out using ENV variables + versions.push('v2'); + } + versions.forEach((version) => { - const files = fs.readdirSync(path.resolve(__dirname, `../../${version}/sources`), { + const files = fs.readdirSync(this.getSourceDirPath(version), { withFileTypes: true, }); + const sources = files.filter((file) => file.isDirectory()).map((folder) => folder.name); sources.forEach((source) => { this.sourceVersionMap.set(source, version); diff --git a/src/services/misc.ts b/src/services/misc.ts index 334b54ba17..3efbe617bf 100644 --- a/src/services/misc.ts +++ b/src/services/misc.ts @@ -14,6 +14,9 @@ export class MiscService { } public static getSourceHandler(source: string, version: string) { + if (version === 'v2') { + return require(`../sources/${source}/transform`); + } return require(`../${version}/sources/${source}/transform`); } diff --git a/src/sources/adjust/transform.js b/src/sources/adjust/transform.js new file mode 100644 index 0000000000..42ed933a97 --- /dev/null +++ b/src/sources/adjust/transform.js @@ -0,0 +1,18 @@ +const { processEvent: processV0Event } = require('../../v0/sources/adjust/transform'); +const { CommonUtils } = require('../../util/common'); + +const convertV2ToV0 = (sourceEvent) => { + const v0Event = JSON.parse(sourceEvent.request.body); + if (sourceEvent.request.query_parameters) { + v0Event.query_parameters = sourceEvent.request.query_parameters; + } + return v0Event; +}; + +const process = (requests) => { + const requestsArray = CommonUtils.toArray(requests); + const v0Events = requestsArray.map(convertV2ToV0); + return v0Events.map(processV0Event); +}; + +module.exports = { process }; diff --git a/src/sources/shopify/transform.js b/src/sources/shopify/transform.js new file mode 100644 index 0000000000..1d0d70ca90 --- /dev/null +++ b/src/sources/shopify/transform.js @@ -0,0 +1,19 @@ +const { process: processV1 } = require('../../v1/sources/shopify/transform'); + +const convertV2ToV1 = (inputRequest) => { + const { body: bodyString, query_parameters: qParams } = inputRequest.request; + const requestBody = JSON.parse(bodyString); + + if (qParams) { + requestBody.query_parameters = qParams; + } + + return { + event: requestBody, + source: inputRequest.source, + }; +}; + +const process = async (inputEvent) => processV1(convertV2ToV1(inputEvent)); + +module.exports = { process }; diff --git a/src/v0/sources/adjust/transform.js b/src/v0/sources/adjust/transform.js index f68e87d476..8769cc310f 100644 --- a/src/v0/sources/adjust/transform.js +++ b/src/v0/sources/adjust/transform.js @@ -59,4 +59,4 @@ const process = (events) => { return eventsArray.map(processEvent); }; -module.exports = { process }; +module.exports = { process, processEvent }; diff --git a/test/apitests/service.api.test.ts b/test/apitests/service.api.test.ts index 2ad1f323ac..d69d568355 100644 --- a/test/apitests/service.api.test.ts +++ b/test/apitests/service.api.test.ts @@ -543,28 +543,6 @@ describe('Destination api tests', () => { }); describe('Source api tests', () => { - test('(shopify) successful source transform', async () => { - const data = getDataFromPath('./data_scenarios/source/v0/successful.json'); - const response = await request(server) - .post('/v0/sources/shopify') - .set('Accept', 'application/json') - .send(data.input); - const parsedResp = JSON.parse(response.text); - delete parsedResp[0].output.batch[0].anonymousId; - expect(response.status).toEqual(200); - expect(parsedResp).toEqual(data.output); - }); - - test('(shopify) failure source transform (shopify)', async () => { - const data = getDataFromPath('./data_scenarios/source/v0/failure.json'); - const response = await request(server) - .post('/v0/sources/shopify') - .set('Accept', 'application/json') - .send(data.input); - expect(response.status).toEqual(200); - expect(JSON.parse(response.text)).toEqual(data.output); - }); - test('(shopify) success source transform (monday)', async () => { const data = getDataFromPath('./data_scenarios/source/v0/response_to_caller.json'); const response = await request(server) diff --git a/test/integrations/component.test.ts b/test/integrations/component.test.ts index baad6813df..b077c31694 100644 --- a/test/integrations/component.test.ts +++ b/test/integrations/component.test.ts @@ -7,7 +7,7 @@ import axios from 'axios'; import bodyParser from 'koa-bodyparser'; import { Command } from 'commander'; import { createHttpTerminator } from 'http-terminator'; -import { MockHttpCallsData, TestCaseData } from './testTypes'; +import { ExtendedTestCaseData, MockHttpCallsData, TestCaseData } from './testTypes'; import { applicationRoutes } from '../../src/routes/index'; import MockAxiosAdapter from 'axios-mock-adapter'; import { @@ -24,6 +24,9 @@ import { appendFileSync } from 'fs'; import { assertRouterOutput, responses } from '../testHelper'; import { generateTestReport, initaliseReport } from '../test_reporter/reporter'; import _ from 'lodash'; +import defaultFeaturesConfig from '../../src/features'; +import { ControllerUtility } from '../../src/controllers/util'; +import { FetchHandler } from '../../src/helpers/fetchHandlers'; // To run single destination test cases // npm run test:ts -- component --destination=adobe_analytics @@ -228,23 +231,53 @@ describe.each(allTestDataFilePaths)('%s Tests', (testDataPath) => { return false; }); } + + const extendedTestData: ExtendedTestCaseData[] = testData.flatMap((tcData) => { + if (tcData.module === tags.MODULES.SOURCE) { + return [ + { + tcData, + sourceTransformV2Flag: false, + descriptionSuffix: ' (sourceTransformV2Flag: false)', + }, + { + tcData, + sourceTransformV2Flag: true, + descriptionSuffix: ' (sourceTransformV2Flag: true)', + }, + ]; + } + return [{ tcData }]; + }); + describe(`${testData[0].name} ${testData[0].module}`, () => { - test.each(testData)('$feature -> $description (index: $#)', async (tcData) => { - tcData?.mockFns?.(mockAdapter); - - switch (tcData.module) { - case tags.MODULES.DESTINATION: - await destinationTestHandler(tcData); - break; - case tags.MODULES.SOURCE: - await sourceTestHandler(tcData); - break; - default: - console.log('Invalid module'); - // Intentionally fail the test case - expect(true).toEqual(false); - break; - } - }); + test.each(extendedTestData)( + '$feature -> $description$descriptionSuffix (index: $#)', + async ({ tcData, sourceTransformV2Flag }) => { + tcData?.mockFns?.(mockAdapter); + + switch (tcData.module) { + case tags.MODULES.DESTINATION: + await destinationTestHandler(tcData); + break; + case tags.MODULES.SOURCE: + tcData?.mockFns?.(mockAdapter); + testSetupSourceTransformV2(sourceTransformV2Flag); + await sourceTestHandler(tcData); + break; + default: + console.log('Invalid module'); + // Intentionally fail the test case + expect(true).toEqual(false); + break; + } + }, + ); }); }); + +const testSetupSourceTransformV2 = (flag) => { + defaultFeaturesConfig.upgradedToSourceTransformV2 = flag; + ControllerUtility['sourceVersionMap'] = new Map(); + FetchHandler['sourceHandlerMap'] = new Map(); +}; diff --git a/test/integrations/sources/adjust/data.ts b/test/integrations/sources/adjust/data.ts index 107bb444c4..bfd61d4ed3 100644 --- a/test/integrations/sources/adjust/data.ts +++ b/test/integrations/sources/adjust/data.ts @@ -10,23 +10,26 @@ export const data = [ name: 'adjust', description: 'Simple track call', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - id: 'adjust', - query_parameters: { - gps_adid: ['38400000-8cf0-11bd-b23e-10b96e40000d'], - adid: ['18546f6171f67e29d1cb983322ad1329'], - tracker_token: ['abc'], - custom: ['custom'], - tracker_name: ['dummy'], - created_at: ['1404214665'], - event_name: ['Click'], + event: { + id: 'adjust', + query_parameters: { + gps_adid: ['38400000-8cf0-11bd-b23e-10b96e40000d'], + adid: ['18546f6171f67e29d1cb983322ad1329'], + tracker_token: ['abc'], + custom: ['custom'], + tracker_name: ['dummy'], + created_at: ['1404214665'], + event_name: ['Click'], + }, + updated_at: '2023-02-10T12:16:07.251Z', + created_at: '2023-02-10T12:05:04.402Z', }, - updated_at: '2023-02-10T12:16:07.251Z', - created_at: '2023-02-10T12:05:04.402Z', + source: {}, }, ], method: 'POST', @@ -85,15 +88,18 @@ export const data = [ name: 'adjust', description: 'Simple track call with no query parameters', module: 'source', - version: 'v0', + version: 'v1', skipGo: 'FIXME', input: { request: { body: [ { - id: 'adjust', - updated_at: '2023-02-10T12:16:07.251Z', - created_at: '2023-02-10T12:05:04.402Z', + event: { + id: 'adjust', + updated_at: '2023-02-10T12:16:07.251Z', + created_at: '2023-02-10T12:05:04.402Z', + }, + source: {}, }, ], method: 'POST', @@ -129,24 +135,27 @@ export const data = [ name: 'adjust', description: 'Simple track call with wrong created at', module: 'source', - version: 'v0', + version: 'v1', skipGo: 'FIXME', input: { request: { body: [ { - id: 'adjust', - query_parameters: { - gps_adid: ['38400000-8cf0-11bd-b23e-10b96e40000d'], - adid: ['18546f6171f67e29d1cb983322ad1329'], - tracker_token: ['abc'], - custom: ['custom'], - tracker_name: ['dummy'], - created_at: ['test'], - event_name: ['Click'], + event: { + id: 'adjust', + query_parameters: { + gps_adid: ['38400000-8cf0-11bd-b23e-10b96e40000d'], + adid: ['18546f6171f67e29d1cb983322ad1329'], + tracker_token: ['abc'], + custom: ['custom'], + tracker_name: ['dummy'], + created_at: ['test'], + event_name: ['Click'], + }, + updated_at: '2023-02-10T12:16:07.251Z', + created_at: 'test', }, - updated_at: '2023-02-10T12:16:07.251Z', - created_at: 'test', + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/shopify/data.ts b/test/integrations/sources/shopify/data.ts index d4498e089c..fdf2009492 100644 --- a/test/integrations/sources/shopify/data.ts +++ b/test/integrations/sources/shopify/data.ts @@ -11,18 +11,21 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Track Call -> carts_create ', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - id: 'shopify_test3', - query_parameters: { topic: ['carts_create'] }, - token: 'shopify_test3', - line_items: [], - note: null, - updated_at: '2023-02-10T12:16:07.251Z', - created_at: '2023-02-10T12:05:04.402Z', + event: { + id: 'shopify_test3', + query_parameters: { topic: ['carts_create'] }, + token: 'shopify_test3', + line_items: [], + note: null, + updated_at: '2023-02-10T12:16:07.251Z', + created_at: '2023-02-10T12:05:04.402Z', + }, + source: {}, }, ], method: 'POST', @@ -41,10 +44,14 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'No Query Parameters', module: 'source', - version: 'v0', + version: 'v1', skipGo: 'not possible', input: { - request: { body: [{}], method: 'POST', headers: { 'Content-Type': 'application/json' } }, + request: { + body: [{ event: {}, source: {} }], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, pathSuffix: '', }, output: { @@ -70,11 +77,16 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Invalid topic', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ - { query_parameters: { signature: ['rudderstack'], writeKey: ['sample-write-key'] } }, + { + event: { + query_parameters: { signature: ['rudderstack'], writeKey: ['sample-write-key'] }, + }, + source: {}, + }, ], method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -104,17 +116,20 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Topic Not found', module: 'source', - version: 'v0', + version: 'v1', skipGo: 'not possible', input: { request: { body: [ { - query_parameters: { - topic: [], - signature: ['rudderstack'], - writeKey: ['sample-write-key'], + event: { + query_parameters: { + topic: [], + signature: ['rudderstack'], + writeKey: ['sample-write-key'], + }, }, + source: {}, }, ], method: 'POST', @@ -145,16 +160,19 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Unsupported Event Type', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['random_event'], - signature: ['rudderstack'], - writeKey: ['sample-write-key'], + event: { + query_parameters: { + topic: ['random_event'], + signature: ['rudderstack'], + writeKey: ['sample-write-key'], + }, }, + source: {}, }, ], method: 'POST', @@ -173,37 +191,68 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Identify Call for customers create event', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['customers_create'], - signature: ['rudderstack'], - writeKey: ['sample-write-key'], - }, - id: 5747017285820, - email: 'anuraj@rudderstack.com', - accepts_marketing: false, - created_at: '2021-12-29T15:15:19+05:30', - updated_at: '2021-12-29T15:15:20+05:30', - first_name: 'Anuraj', - last_name: 'Guha', - orders_count: 0, - state: 'disabled', - total_spent: '0.00', - last_order_id: null, - note: '', - verified_email: true, - multipass_identifier: null, - tax_exempt: false, - phone: '+919876543210', - tags: '', - last_order_name: null, - currency: 'INR', - addresses: [ - { + event: { + query_parameters: { + topic: ['customers_create'], + signature: ['rudderstack'], + writeKey: ['sample-write-key'], + }, + id: 5747017285820, + email: 'anuraj@rudderstack.com', + accepts_marketing: false, + created_at: '2021-12-29T15:15:19+05:30', + updated_at: '2021-12-29T15:15:20+05:30', + first_name: 'Anuraj', + last_name: 'Guha', + orders_count: 0, + state: 'disabled', + total_spent: '0.00', + last_order_id: null, + note: '', + verified_email: true, + multipass_identifier: null, + tax_exempt: false, + phone: '+919876543210', + tags: '', + last_order_name: null, + currency: 'INR', + addresses: [ + { + id: 6947581821116, + customer_id: 5747017285820, + first_name: 'Anuraj', + last_name: 'Guha', + company: 'Rudderstack', + address1: 'Home', + address2: 'Apartment', + city: 'Kolkata', + province: 'West Bengal', + country: 'India', + zip: '708091', + phone: '+919876543210', + name: 'Anuraj Guha', + province_code: 'WB', + country_code: 'IN', + country_name: 'India', + default: true, + }, + ], + accepts_marketing_updated_at: '2021-12-29T15:15:20+05:30', + marketing_opt_in_level: null, + tax_exemptions: [], + sms_marketing_consent: { + state: 'not_subscribed', + opt_in_level: 'single_opt_in', + consent_updated_at: null, + consent_collected_from: 'SHOPIFY', + }, + admin_graphql_api_id: 'gid://shopify/Customer/5747017285820', + default_address: { id: 6947581821116, customer_id: 5747017285820, first_name: 'Anuraj', @@ -222,36 +271,8 @@ const serverSideEventsScenarios = [ country_name: 'India', default: true, }, - ], - accepts_marketing_updated_at: '2021-12-29T15:15:20+05:30', - marketing_opt_in_level: null, - tax_exemptions: [], - sms_marketing_consent: { - state: 'not_subscribed', - opt_in_level: 'single_opt_in', - consent_updated_at: null, - consent_collected_from: 'SHOPIFY', - }, - admin_graphql_api_id: 'gid://shopify/Customer/5747017285820', - default_address: { - id: 6947581821116, - customer_id: 5747017285820, - first_name: 'Anuraj', - last_name: 'Guha', - company: 'Rudderstack', - address1: 'Home', - address2: 'Apartment', - city: 'Kolkata', - province: 'West Bengal', - country: 'India', - zip: '708091', - phone: '+919876543210', - name: 'Anuraj Guha', - province_code: 'WB', - country_code: 'IN', - country_name: 'India', - default: true, }, + source: {}, }, ], method: 'POST', @@ -352,40 +373,44 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Unsupported checkout event', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['checkout_delete'], - writeKey: ['sample-write-key'], - signature: ['rudderstack'], + event: { + query_parameters: { + topic: ['checkout_delete'], + writeKey: ['sample-write-key'], + signature: ['rudderstack'], + }, + admin_graphql_api_id: 'gid://shopify/Fulfillment/4124667937024', + created_at: '2022-01-05T18:13:02+05:30', + destination: null, + id: 4124667937024, + line_items: [], + customer: { email: 'test_person@email.com', first_name: 'Test', last_name: 'Person' }, + billing_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, + shipping_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, + location_id: 66855371008, + name: '#1002.1', + order_id: 4617255092480, + origin_address: null, + receipt: {}, + service: 'manual', + shipment_status: null, + status: 'success', + tracking_company: 'Amazon Logistics UK', + tracking_number: 'Sample001test', + tracking_numbers: ['Sample001test'], + tracking_url: + 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', + tracking_urls: [ + 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', + ], + updated_at: '2022-01-05T18:16:48+05:30', }, - admin_graphql_api_id: 'gid://shopify/Fulfillment/4124667937024', - created_at: '2022-01-05T18:13:02+05:30', - destination: null, - id: 4124667937024, - line_items: [], - customer: { email: 'test_person@email.com', first_name: 'Test', last_name: 'Person' }, - billing_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, - shipping_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, - location_id: 66855371008, - name: '#1002.1', - order_id: 4617255092480, - origin_address: null, - receipt: {}, - service: 'manual', - shipment_status: null, - status: 'success', - tracking_company: 'Amazon Logistics UK', - tracking_number: 'Sample001test', - tracking_numbers: ['Sample001test'], - tracking_url: 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', - tracking_urls: [ - 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', - ], - updated_at: '2022-01-05T18:16:48+05:30', + source: {}, }, ], method: 'POST', @@ -404,97 +429,101 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Track Call -> Fullfillments updated event', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['fulfillments_update'], - writeKey: ['sample-write-key'], - signature: ['rudderstack'], - }, - shipping_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, - billing_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, - admin_graphql_api_id: 'gid://shopify/Fulfillment/4124667937024', - created_at: '2022-01-05T18:13:02+05:30', - destination: null, - email: 'test_person@email.com', - id: 4124667937024, - line_items: [ - { - admin_graphql_api_id: 'gid://shopify/LineItem/11896203149568', - discount_allocations: [], - duties: [], - fulfillable_quantity: 0, - fulfillment_service: 'manual', - fulfillment_status: 'fulfilled', - gift_card: false, - grams: 0, - id: 11896203149568, - name: 'p1', - origin_location: { - address1: '74 CC/7, Anupama Housing Estate - II', - address2: '', - city: 'Kolkatta', - country_code: 'IN', - id: 3373642219776, - name: '74 CC/7, Anupama Housing Estate - II', - province_code: 'WB', - zip: '700052', - }, - price: '5000.00', - price_set: { - presentment_money: { amount: '5000.00', currency_code: 'INR' }, - shop_money: { amount: '5000.00', currency_code: 'INR' }, - }, - product_exists: true, - product_id: 7510929801472, - properties: [], - quantity: 1, - requires_shipping: true, - sku: '15', - tax_lines: [ - { - channel_liable: false, - price: '900.00', - price_set: { - presentment_money: { amount: '900.00', currency_code: 'INR' }, - shop_money: { amount: '900.00', currency_code: 'INR' }, + event: { + query_parameters: { + topic: ['fulfillments_update'], + writeKey: ['sample-write-key'], + signature: ['rudderstack'], + }, + shipping_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, + billing_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, + admin_graphql_api_id: 'gid://shopify/Fulfillment/4124667937024', + created_at: '2022-01-05T18:13:02+05:30', + destination: null, + email: 'test_person@email.com', + id: 4124667937024, + line_items: [ + { + admin_graphql_api_id: 'gid://shopify/LineItem/11896203149568', + discount_allocations: [], + duties: [], + fulfillable_quantity: 0, + fulfillment_service: 'manual', + fulfillment_status: 'fulfilled', + gift_card: false, + grams: 0, + id: 11896203149568, + name: 'p1', + origin_location: { + address1: '74 CC/7, Anupama Housing Estate - II', + address2: '', + city: 'Kolkatta', + country_code: 'IN', + id: 3373642219776, + name: '74 CC/7, Anupama Housing Estate - II', + province_code: 'WB', + zip: '700052', + }, + price: '5000.00', + price_set: { + presentment_money: { amount: '5000.00', currency_code: 'INR' }, + shop_money: { amount: '5000.00', currency_code: 'INR' }, + }, + product_exists: true, + product_id: 7510929801472, + properties: [], + quantity: 1, + requires_shipping: true, + sku: '15', + tax_lines: [ + { + channel_liable: false, + price: '900.00', + price_set: { + presentment_money: { amount: '900.00', currency_code: 'INR' }, + shop_money: { amount: '900.00', currency_code: 'INR' }, + }, + rate: 0.18, + title: 'IGST', }, - rate: 0.18, - title: 'IGST', + ], + taxable: true, + title: 'p1', + total_discount: '0.00', + total_discount_set: { + presentment_money: { amount: '0.00', currency_code: 'INR' }, + shop_money: { amount: '0.00', currency_code: 'INR' }, }, - ], - taxable: true, - title: 'p1', - total_discount: '0.00', - total_discount_set: { - presentment_money: { amount: '0.00', currency_code: 'INR' }, - shop_money: { amount: '0.00', currency_code: 'INR' }, + variant_id: 42211160228096, + variant_inventory_management: 'shopify', + variant_title: '', + vendor: 'rudderstack-store', }, - variant_id: 42211160228096, - variant_inventory_management: 'shopify', - variant_title: '', - vendor: 'rudderstack-store', - }, - ], - location_id: 66855371008, - name: '#1002.1', - order_id: 4617255092480, - origin_address: null, - receipt: {}, - service: 'manual', - shipment_status: null, - status: 'success', - tracking_company: 'Amazon Logistics UK', - tracking_number: 'Sample001test', - tracking_numbers: ['Sample001test'], - tracking_url: 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', - tracking_urls: [ - 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', - ], - updated_at: '2022-01-05T18:16:48+05:30', + ], + location_id: 66855371008, + name: '#1002.1', + order_id: 4617255092480, + origin_address: null, + receipt: {}, + service: 'manual', + shipment_status: null, + status: 'success', + tracking_company: 'Amazon Logistics UK', + tracking_number: 'Sample001test', + tracking_numbers: ['Sample001test'], + tracking_url: + 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', + tracking_urls: [ + 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', + ], + updated_at: '2022-01-05T18:16:48+05:30', + }, + source: {}, }, ], method: 'POST', @@ -616,407 +645,410 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Track Call -> Order Partially Fulfilled event', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['orders_partially_fulfilled'], - writeKey: ['sample-write-key'], - signature: ['rudderstack'], - }, - id: 820982911946154508, - admin_graphql_api_id: 'gid://shopify/Order/820982911946154508', - app_id: null, - browser_ip: null, - buyer_accepts_marketing: true, - cancel_reason: 'customer', - cancelled_at: '2021-12-31T19:00:00-05:00', - cart_token: null, - checkout_id: null, - checkout_token: null, - client_details: null, - closed_at: null, - confirmation_number: null, - confirmed: false, - contact_email: 'jon@example.com', - created_at: '2021-12-31T19:00:00-05:00', - currency: 'USD', - current_subtotal_price: '398.00', - current_subtotal_price_set: { - shop_money: { - amount: '398.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '398.00', - currency_code: 'USD', - }, - }, - current_total_additional_fees_set: null, - current_total_discounts: '0.00', - current_total_discounts_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', - }, - }, - current_total_duties_set: null, - current_total_price: '398.00', - current_total_price_set: { - shop_money: { - amount: '398.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '398.00', - currency_code: 'USD', - }, - }, - current_total_tax: '0.00', - current_total_tax_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', - }, - }, - customer_locale: 'en', - device_id: null, - discount_codes: [], - email: 'jon@example.com', - estimated_taxes: false, - financial_status: 'voided', - fulfillment_status: 'pending', - landing_site: null, - landing_site_ref: null, - location_id: null, - merchant_of_record_app_id: null, - name: '#9999', - note: null, - note_attributes: [], - number: 234, - order_number: 1234, - order_status_url: - 'https://jsmith.myshopify.com/548380009/orders/123456abcd/authenticate?key=abcdefg', - original_total_additional_fees_set: null, - original_total_duties_set: null, - payment_gateway_names: ['visa', 'bogus'], - phone: null, - po_number: null, - presentment_currency: 'USD', - processed_at: '2021-12-31T19:00:00-05:00', - reference: null, - referring_site: null, - source_identifier: null, - source_name: 'web', - source_url: null, - subtotal_price: '388.00', - subtotal_price_set: { - shop_money: { - amount: '388.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '388.00', - currency_code: 'USD', + event: { + query_parameters: { + topic: ['orders_partially_fulfilled'], + writeKey: ['sample-write-key'], + signature: ['rudderstack'], }, - }, - tags: 'tag1, tag2', - tax_exempt: false, - tax_lines: [], - taxes_included: false, - test: true, - token: '123456abcd', - total_discounts: '20.00', - total_discounts_set: { - shop_money: { - amount: '20.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '20.00', - currency_code: 'USD', + id: 820982911946154508, + admin_graphql_api_id: 'gid://shopify/Order/820982911946154508', + app_id: null, + browser_ip: null, + buyer_accepts_marketing: true, + cancel_reason: 'customer', + cancelled_at: '2021-12-31T19:00:00-05:00', + cart_token: null, + checkout_id: null, + checkout_token: null, + client_details: null, + closed_at: null, + confirmation_number: null, + confirmed: false, + contact_email: 'jon@example.com', + created_at: '2021-12-31T19:00:00-05:00', + currency: 'USD', + current_subtotal_price: '398.00', + current_subtotal_price_set: { + shop_money: { + amount: '398.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '398.00', + currency_code: 'USD', + }, }, - }, - total_line_items_price: '398.00', - total_line_items_price_set: { - shop_money: { - amount: '398.00', - currency_code: 'USD', + current_total_additional_fees_set: null, + current_total_discounts: '0.00', + current_total_discounts_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '398.00', - currency_code: 'USD', + current_total_duties_set: null, + current_total_price: '398.00', + current_total_price_set: { + shop_money: { + amount: '398.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '398.00', + currency_code: 'USD', + }, }, - }, - total_outstanding: '398.00', - total_price: '388.00', - total_price_set: { - shop_money: { - amount: '388.00', - currency_code: 'USD', + current_total_tax: '0.00', + current_total_tax_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '388.00', - currency_code: 'USD', + customer_locale: 'en', + device_id: null, + discount_codes: [], + email: 'jon@example.com', + estimated_taxes: false, + financial_status: 'voided', + fulfillment_status: 'pending', + landing_site: null, + landing_site_ref: null, + location_id: null, + merchant_of_record_app_id: null, + name: '#9999', + note: null, + note_attributes: [], + number: 234, + order_number: 1234, + order_status_url: + 'https://jsmith.myshopify.com/548380009/orders/123456abcd/authenticate?key=abcdefg', + original_total_additional_fees_set: null, + original_total_duties_set: null, + payment_gateway_names: ['visa', 'bogus'], + phone: null, + po_number: null, + presentment_currency: 'USD', + processed_at: '2021-12-31T19:00:00-05:00', + reference: null, + referring_site: null, + source_identifier: null, + source_name: 'web', + source_url: null, + subtotal_price: '388.00', + subtotal_price_set: { + shop_money: { + amount: '388.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '388.00', + currency_code: 'USD', + }, }, - }, - total_shipping_price_set: { - shop_money: { - amount: '10.00', - currency_code: 'USD', + tags: 'tag1, tag2', + tax_exempt: false, + tax_lines: [], + taxes_included: false, + test: true, + token: '123456abcd', + total_discounts: '20.00', + total_discounts_set: { + shop_money: { + amount: '20.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '20.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '10.00', - currency_code: 'USD', + total_line_items_price: '398.00', + total_line_items_price_set: { + shop_money: { + amount: '398.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '398.00', + currency_code: 'USD', + }, }, - }, - total_tax: '0.00', - total_tax_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', + total_outstanding: '398.00', + total_price: '388.00', + total_price_set: { + shop_money: { + amount: '388.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '388.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', + total_shipping_price_set: { + shop_money: { + amount: '10.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '10.00', + currency_code: 'USD', + }, }, - }, - total_tip_received: '0.00', - total_weight: 0, - updated_at: '2021-12-31T19:00:00-05:00', - user_id: null, - billing_address: { - first_name: 'Steve', - address1: '123 Shipping Street', - phone: '555-555-SHIP', - city: 'Shippington', - zip: '40003', - province: 'Kentucky', - country: 'United States', - last_name: 'Shipper', - address2: null, - company: 'Shipping Company', - latitude: null, - longitude: null, - name: 'Steve Shipper', - country_code: 'US', - province_code: 'KY', - }, - customer: { - id: 115310627314723954, - email: 'john@example.com', - created_at: null, - updated_at: null, - first_name: 'John', - last_name: 'Smith', - state: 'disabled', - note: null, - verified_email: true, - multipass_identifier: null, - tax_exempt: false, - phone: null, - email_marketing_consent: { - state: 'not_subscribed', - opt_in_level: null, - consent_updated_at: null, + total_tax: '0.00', + total_tax_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, - sms_marketing_consent: null, - tags: '', - currency: 'USD', - tax_exemptions: [], - admin_graphql_api_id: 'gid://shopify/Customer/115310627314723954', - default_address: { - id: 715243470612851245, - customer_id: 115310627314723954, - first_name: null, - last_name: null, - company: null, - address1: '123 Elm St.', + total_tip_received: '0.00', + total_weight: 0, + updated_at: '2021-12-31T19:00:00-05:00', + user_id: null, + billing_address: { + first_name: 'Steve', + address1: '123 Shipping Street', + phone: '555-555-SHIP', + city: 'Shippington', + zip: '40003', + province: 'Kentucky', + country: 'United States', + last_name: 'Shipper', address2: null, - city: 'Ottawa', - province: 'Ontario', - country: 'Canada', - zip: 'K2H7A8', - phone: '123-123-1234', - name: '', - province_code: 'ON', - country_code: 'CA', - country_name: 'Canada', - default: true, + company: 'Shipping Company', + latitude: null, + longitude: null, + name: 'Steve Shipper', + country_code: 'US', + province_code: 'KY', }, - }, - discount_applications: [], - fulfillments: [], - line_items: [ - { - id: 866550311766439020, - admin_graphql_api_id: 'gid://shopify/LineItem/866550311766439020', - attributed_staffs: [ - { - id: 'gid://shopify/StaffMember/902541635', - quantity: 1, - }, - ], - current_quantity: 1, - fulfillable_quantity: 1, - fulfillment_service: 'manual', - fulfillment_status: null, - gift_card: false, - grams: 567, - name: 'IPod Nano - 8GB', - price: '199.00', - price_set: { - shop_money: { - amount: '199.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '199.00', - currency_code: 'USD', - }, + customer: { + id: 115310627314723954, + email: 'john@example.com', + created_at: null, + updated_at: null, + first_name: 'John', + last_name: 'Smith', + state: 'disabled', + note: null, + verified_email: true, + multipass_identifier: null, + tax_exempt: false, + phone: null, + email_marketing_consent: { + state: 'not_subscribed', + opt_in_level: null, + consent_updated_at: null, }, - product_exists: true, - product_id: 632910392, - properties: [], - quantity: 1, - requires_shipping: true, - sku: 'IPOD2008PINK', - taxable: true, - title: 'IPod Nano - 8GB', - total_discount: '0.00', - total_discount_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', - }, + sms_marketing_consent: null, + tags: '', + currency: 'USD', + tax_exemptions: [], + admin_graphql_api_id: 'gid://shopify/Customer/115310627314723954', + default_address: { + id: 715243470612851245, + customer_id: 115310627314723954, + first_name: null, + last_name: null, + company: null, + address1: '123 Elm St.', + address2: null, + city: 'Ottawa', + province: 'Ontario', + country: 'Canada', + zip: 'K2H7A8', + phone: '123-123-1234', + name: '', + province_code: 'ON', + country_code: 'CA', + country_name: 'Canada', + default: true, }, - variant_id: 808950810, - variant_inventory_management: 'shopify', - variant_title: null, - vendor: null, - tax_lines: [], - duties: [], - discount_allocations: [], }, - { - id: 141249953214522974, - admin_graphql_api_id: 'gid://shopify/LineItem/141249953214522974', - attributed_staffs: [], - current_quantity: 1, - fulfillable_quantity: 1, - fulfillment_service: 'manual', - fulfillment_status: null, - gift_card: false, - grams: 567, - name: 'IPod Nano - 8GB', - price: '199.00', - price_set: { - shop_money: { - amount: '199.00', - currency_code: 'USD', + discount_applications: [], + fulfillments: [], + line_items: [ + { + id: 866550311766439020, + admin_graphql_api_id: 'gid://shopify/LineItem/866550311766439020', + attributed_staffs: [ + { + id: 'gid://shopify/StaffMember/902541635', + quantity: 1, + }, + ], + current_quantity: 1, + fulfillable_quantity: 1, + fulfillment_service: 'manual', + fulfillment_status: null, + gift_card: false, + grams: 567, + name: 'IPod Nano - 8GB', + price: '199.00', + price_set: { + shop_money: { + amount: '199.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '199.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '199.00', - currency_code: 'USD', + product_exists: true, + product_id: 632910392, + properties: [], + quantity: 1, + requires_shipping: true, + sku: 'IPOD2008PINK', + taxable: true, + title: 'IPod Nano - 8GB', + total_discount: '0.00', + total_discount_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, + variant_id: 808950810, + variant_inventory_management: 'shopify', + variant_title: null, + vendor: null, + tax_lines: [], + duties: [], + discount_allocations: [], }, - product_exists: true, - product_id: 632910392, - properties: [], - quantity: 1, - requires_shipping: true, - sku: 'IPOD2008PINK', - taxable: true, - title: 'IPod Nano - 8GB', - total_discount: '0.00', - total_discount_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', + { + id: 141249953214522974, + admin_graphql_api_id: 'gid://shopify/LineItem/141249953214522974', + attributed_staffs: [], + current_quantity: 1, + fulfillable_quantity: 1, + fulfillment_service: 'manual', + fulfillment_status: null, + gift_card: false, + grams: 567, + name: 'IPod Nano - 8GB', + price: '199.00', + price_set: { + shop_money: { + amount: '199.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '199.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', + product_exists: true, + product_id: 632910392, + properties: [], + quantity: 1, + requires_shipping: true, + sku: 'IPOD2008PINK', + taxable: true, + title: 'IPod Nano - 8GB', + total_discount: '0.00', + total_discount_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, + variant_id: 808950810, + variant_inventory_management: 'shopify', + variant_title: null, + vendor: null, + tax_lines: [], + duties: [], + discount_allocations: [], }, - variant_id: 808950810, - variant_inventory_management: 'shopify', - variant_title: null, - vendor: null, - tax_lines: [], - duties: [], - discount_allocations: [], + ], + payment_terms: null, + refunds: [], + shipping_address: { + first_name: 'Steve', + address1: '123 Shipping Street', + phone: '555-555-SHIP', + city: 'Shippington', + zip: '40003', + province: 'Kentucky', + country: 'United States', + last_name: 'Shipper', + address2: null, + company: 'Shipping Company', + latitude: null, + longitude: null, + name: 'Steve Shipper', + country_code: 'US', + province_code: 'KY', }, - ], - payment_terms: null, - refunds: [], - shipping_address: { - first_name: 'Steve', - address1: '123 Shipping Street', - phone: '555-555-SHIP', - city: 'Shippington', - zip: '40003', - province: 'Kentucky', - country: 'United States', - last_name: 'Shipper', - address2: null, - company: 'Shipping Company', - latitude: null, - longitude: null, - name: 'Steve Shipper', - country_code: 'US', - province_code: 'KY', - }, - shipping_lines: [ - { - id: 271878346596884015, - carrier_identifier: null, - code: null, - discounted_price: '10.00', - discounted_price_set: { - shop_money: { - amount: '10.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '10.00', - currency_code: 'USD', - }, - }, - is_removed: false, - phone: null, - price: '10.00', - price_set: { - shop_money: { - amount: '10.00', - currency_code: 'USD', + shipping_lines: [ + { + id: 271878346596884015, + carrier_identifier: null, + code: null, + discounted_price: '10.00', + discounted_price_set: { + shop_money: { + amount: '10.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '10.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '10.00', - currency_code: 'USD', + is_removed: false, + phone: null, + price: '10.00', + price_set: { + shop_money: { + amount: '10.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '10.00', + currency_code: 'USD', + }, }, + requested_fulfillment_service_id: null, + source: 'shopify', + title: 'Generic Shipping', + tax_lines: [], + discount_allocations: [], }, - requested_fulfillment_service_id: null, - source: 'shopify', - title: 'Generic Shipping', - tax_lines: [], - discount_allocations: [], - }, - ], + ], + }, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/testTypes.ts b/test/integrations/testTypes.ts index 3c5cf60600..dbd02e2217 100644 --- a/test/integrations/testTypes.ts +++ b/test/integrations/testTypes.ts @@ -57,6 +57,14 @@ export interface TestCaseData { mockFns?: (mockAdapter: MockAdapter) => {}; } +export interface ExtendedTestCaseData { + // use this to add any new properties for dynamic test cases + // this will keep the base TestCaseData structure generic and intact + tcData: TestCaseData; + sourceTransformV2Flag?: boolean; + descriptionSuffix?: string; +} + export type MockFns = (mockAdapter: MockAdapter) => void; export interface SrcTestCaseData {