From 37d176c6b0a44aed02e447c6d937fbf611bc0426 Mon Sep 17 00:00:00 2001 From: shrouti1507 Date: Mon, 11 Nov 2024 15:32:51 +0530 Subject: [PATCH 1/8] fix: handling invalid timestamp for adjust source --- src/v0/sources/adjust/transform.js | 20 +++++++-- test/integrations/sources/adjust/data.ts | 54 ++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/v0/sources/adjust/transform.js b/src/v0/sources/adjust/transform.js index 9da90751b7..684dfd715a 100644 --- a/src/v0/sources/adjust/transform.js +++ b/src/v0/sources/adjust/transform.js @@ -43,11 +43,23 @@ const processEvent = (inputEvent) => { message.properties = { ...message.properties, ...customProperties }; if (formattedPayload.created_at) { - const ts = new Date(formattedPayload.created_at * 1000).toISOString(); - message.setProperty('originalTimestamp', ts); - message.setProperty('timestamp', ts); + try { + const createdAt = Number(formattedPayload.created_at); + if (Number.isFinite(createdAt) && createdAt > 0) { + const ts = new Date(createdAt * 1000).toISOString(); + message.setProperty('originalTimestamp', ts); + message.setProperty('timestamp', ts); + } else { + throw new TransformationError( + `[Adjust] Error processing timestamp ${formattedPayload.created_at}.`, + ); + } + } catch (error) { + throw new TransformationError( + `[Adjust] Error processing timestamp ${formattedPayload.created_at}: ${error.message}`, + ); + } } - // adjust does not has the concept of user but we need to set some random anonymousId in order to make the server accept the message message.anonymousId = generateUUID(); return message; diff --git a/test/integrations/sources/adjust/data.ts b/test/integrations/sources/adjust/data.ts index e57feb45d4..7fde65fabe 100644 --- a/test/integrations/sources/adjust/data.ts +++ b/test/integrations/sources/adjust/data.ts @@ -125,4 +125,58 @@ export const data = [ defaultMockFns(); }, }, + { + name: 'adjust', + description: 'Simple track call with wrong created at', + module: 'source', + version: 'v0', + 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'], + }, + updated_at: '2023-02-10T12:16:07.251Z', + created_at: 'test', + }, + ], + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + '[Adjust] Error processing timestamp test: [Adjust] Error processing timestamp test.', + statTags: { + destinationId: 'Non determinable', + errorCategory: 'transformation', + implementation: 'native', + module: 'source', + workspaceId: 'Non determinable', + }, + statusCode: 400, + }, + ], + }, + }, + mockFns: () => { + defaultMockFns(); + }, + }, ]; From 42428b4c0610007a6abffca57b1f7e16f15d297e Mon Sep 17 00:00:00 2001 From: shrouti1507 Date: Mon, 11 Nov 2024 15:50:59 +0530 Subject: [PATCH 2/8] fix: small change in logic --- src/v0/sources/adjust/transform.js | 19 ++++++++----------- test/integrations/sources/adjust/data.ts | 3 +-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/v0/sources/adjust/transform.js b/src/v0/sources/adjust/transform.js index 684dfd715a..7f91fdb060 100644 --- a/src/v0/sources/adjust/transform.js +++ b/src/v0/sources/adjust/transform.js @@ -42,24 +42,21 @@ const processEvent = (inputEvent) => { ); message.properties = { ...message.properties, ...customProperties }; + // ... existing code ... if (formattedPayload.created_at) { + const rawTimestamp = formattedPayload.created_at; try { - const createdAt = Number(formattedPayload.created_at); - if (Number.isFinite(createdAt) && createdAt > 0) { - const ts = new Date(createdAt * 1000).toISOString(); - message.setProperty('originalTimestamp', ts); - message.setProperty('timestamp', ts); - } else { - throw new TransformationError( - `[Adjust] Error processing timestamp ${formattedPayload.created_at}.`, - ); - } + const createdAt = Number(rawTimestamp); + const ts = new Date(createdAt * 1000).toISOString(); + message.setProperty('originalTimestamp', ts); + message.setProperty('timestamp', ts); } catch (error) { throw new TransformationError( - `[Adjust] Error processing timestamp ${formattedPayload.created_at}: ${error.message}`, + `[Adjust] Invalid timestamp "${rawTimestamp}": ${error.message}`, ); } } + // ... existing code ... // adjust does not has the concept of user but we need to set some random anonymousId in order to make the server accept the message message.anonymousId = generateUUID(); return message; diff --git a/test/integrations/sources/adjust/data.ts b/test/integrations/sources/adjust/data.ts index 7fde65fabe..8dfe48b058 100644 --- a/test/integrations/sources/adjust/data.ts +++ b/test/integrations/sources/adjust/data.ts @@ -161,8 +161,7 @@ export const data = [ status: 200, body: [ { - error: - '[Adjust] Error processing timestamp test: [Adjust] Error processing timestamp test.', + error: '[Adjust] Invalid timestamp "test": Invalid time value', statTags: { destinationId: 'Non determinable', errorCategory: 'transformation', From 91710fcb0f67aaa61b73cb2e487b7aeff5b2ebbe Mon Sep 17 00:00:00 2001 From: shrouti1507 Date: Mon, 11 Nov 2024 15:52:23 +0530 Subject: [PATCH 3/8] fix: unnecessary line removal --- test/integrations/testUtils.ts | 72 ++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/test/integrations/testUtils.ts b/test/integrations/testUtils.ts index 4eda20a901..394fd0d77d 100644 --- a/test/integrations/testUtils.ts +++ b/test/integrations/testUtils.ts @@ -19,25 +19,42 @@ import { RouterTransformationResponseListSchema, } from '../../src/types/zodTypes'; +const getDataFilesFromDir = (dir: string): string[] => { + // Look for data.ts files recursively in the directory + return globSync('**/data.ts', { + cwd: dir, + absolute: true, + }); +}; + +const getNetworkFilesFromDir = (dir: string): string[] => { + // Look for network.ts files recursively in the directory + return globSync('**/network.ts', { + cwd: dir, + absolute: true, + }); +}; + const generateAlphanumericId = (size = 36) => [...Array(size)].map(() => ((Math.random() * size) | 0).toString(size)).join(''); -export const getTestDataFilePaths = (dirPath: string, opts: OptionValues): string[] => { - const globPattern = join(dirPath, '**', 'data.ts'); - let testFilePaths = globSync(globPattern); - let filteredTestFilePaths: string[] = testFilePaths; - - const destinationOrSource = opts.destination || opts.source; - if (destinationOrSource) { - filteredTestFilePaths = testFilePaths.filter( - (testFile) => destinationOrSource && testFile.includes(`${destinationOrSource}/`), - ); +export const getTestDataFilePaths = (rootDir: string, opts: any) => { + const paths: string[] = []; + if (opts.destination) { + // Existing destination logic + const destinationPath = join(rootDir, 'destinations', opts.destination); + paths.push(...getDataFilesFromDir(destinationPath)); + } else if (opts.source) { + // New source logic + const sourcePath = join(rootDir, 'sources', opts.source); + paths.push(...getDataFilesFromDir(sourcePath)); + } else { + // Get all test files if no specific integration is specified + const destinationsPath = join(rootDir, 'destinations'); + const sourcesPath = join(rootDir, 'sources'); + paths.push(...getDataFilesFromDir(destinationsPath)); + paths.push(...getDataFilesFromDir(sourcesPath)); } - if (opts.feature) { - filteredTestFilePaths = filteredTestFilePaths.filter((testFile) => - testFile.includes(opts.feature), - ); - } - return filteredTestFilePaths; + return paths; }; export const getTestData = (filePath): TestCaseData[] => { @@ -48,17 +65,22 @@ export const getMockHttpCallsData = (filePath): MockHttpCallsData[] => { return require(filePath).networkCallsData as MockHttpCallsData[]; }; -export const getAllTestMockDataFilePaths = (dirPath: string, destination: string): string[] => { - const globPattern = join(dirPath, '**', 'network.ts'); - let testFilePaths = globSync(globPattern); +export const getAllTestMockDataFilePaths = ( + rootDir: string, + destination?: string, + source?: string, +) => { + const paths: string[] = []; if (destination) { - const commonTestFilePaths = testFilePaths.filter((testFile) => - testFile.includes('test/integrations/common'), - ); - testFilePaths = testFilePaths.filter((testFile) => testFile.includes(destination)); - testFilePaths = [...commonTestFilePaths, ...testFilePaths]; + // Existing destination logic + const destinationPath = join(rootDir, 'destinations', destination); + paths.push(...getNetworkFilesFromDir(destinationPath)); + } else if (source) { + // New source logic + const sourcePath = join(rootDir, 'sources', source); + paths.push(...getNetworkFilesFromDir(sourcePath)); } - return testFilePaths; + return paths; }; export const addMock = (mock: MockAdapter, axiosMock: MockHttpCallsData) => { From 518184f7fe8dcf0fdba087e056a5ee4905c2e447 Mon Sep 17 00:00:00 2001 From: shrouti1507 Date: Mon, 11 Nov 2024 15:54:10 +0530 Subject: [PATCH 4/8] fix: unnecessary line removal --- src/v0/sources/adjust/transform.js | 2 - test/integrations/testUtils.ts | 72 +++++++++++------------------- 2 files changed, 25 insertions(+), 49 deletions(-) diff --git a/src/v0/sources/adjust/transform.js b/src/v0/sources/adjust/transform.js index 7f91fdb060..ab2555902b 100644 --- a/src/v0/sources/adjust/transform.js +++ b/src/v0/sources/adjust/transform.js @@ -42,7 +42,6 @@ const processEvent = (inputEvent) => { ); message.properties = { ...message.properties, ...customProperties }; - // ... existing code ... if (formattedPayload.created_at) { const rawTimestamp = formattedPayload.created_at; try { @@ -56,7 +55,6 @@ const processEvent = (inputEvent) => { ); } } - // ... existing code ... // adjust does not has the concept of user but we need to set some random anonymousId in order to make the server accept the message message.anonymousId = generateUUID(); return message; diff --git a/test/integrations/testUtils.ts b/test/integrations/testUtils.ts index 394fd0d77d..4eda20a901 100644 --- a/test/integrations/testUtils.ts +++ b/test/integrations/testUtils.ts @@ -19,42 +19,25 @@ import { RouterTransformationResponseListSchema, } from '../../src/types/zodTypes'; -const getDataFilesFromDir = (dir: string): string[] => { - // Look for data.ts files recursively in the directory - return globSync('**/data.ts', { - cwd: dir, - absolute: true, - }); -}; - -const getNetworkFilesFromDir = (dir: string): string[] => { - // Look for network.ts files recursively in the directory - return globSync('**/network.ts', { - cwd: dir, - absolute: true, - }); -}; - const generateAlphanumericId = (size = 36) => [...Array(size)].map(() => ((Math.random() * size) | 0).toString(size)).join(''); -export const getTestDataFilePaths = (rootDir: string, opts: any) => { - const paths: string[] = []; - if (opts.destination) { - // Existing destination logic - const destinationPath = join(rootDir, 'destinations', opts.destination); - paths.push(...getDataFilesFromDir(destinationPath)); - } else if (opts.source) { - // New source logic - const sourcePath = join(rootDir, 'sources', opts.source); - paths.push(...getDataFilesFromDir(sourcePath)); - } else { - // Get all test files if no specific integration is specified - const destinationsPath = join(rootDir, 'destinations'); - const sourcesPath = join(rootDir, 'sources'); - paths.push(...getDataFilesFromDir(destinationsPath)); - paths.push(...getDataFilesFromDir(sourcesPath)); +export const getTestDataFilePaths = (dirPath: string, opts: OptionValues): string[] => { + const globPattern = join(dirPath, '**', 'data.ts'); + let testFilePaths = globSync(globPattern); + let filteredTestFilePaths: string[] = testFilePaths; + + const destinationOrSource = opts.destination || opts.source; + if (destinationOrSource) { + filteredTestFilePaths = testFilePaths.filter( + (testFile) => destinationOrSource && testFile.includes(`${destinationOrSource}/`), + ); } - return paths; + if (opts.feature) { + filteredTestFilePaths = filteredTestFilePaths.filter((testFile) => + testFile.includes(opts.feature), + ); + } + return filteredTestFilePaths; }; export const getTestData = (filePath): TestCaseData[] => { @@ -65,22 +48,17 @@ export const getMockHttpCallsData = (filePath): MockHttpCallsData[] => { return require(filePath).networkCallsData as MockHttpCallsData[]; }; -export const getAllTestMockDataFilePaths = ( - rootDir: string, - destination?: string, - source?: string, -) => { - const paths: string[] = []; +export const getAllTestMockDataFilePaths = (dirPath: string, destination: string): string[] => { + const globPattern = join(dirPath, '**', 'network.ts'); + let testFilePaths = globSync(globPattern); if (destination) { - // Existing destination logic - const destinationPath = join(rootDir, 'destinations', destination); - paths.push(...getNetworkFilesFromDir(destinationPath)); - } else if (source) { - // New source logic - const sourcePath = join(rootDir, 'sources', source); - paths.push(...getNetworkFilesFromDir(sourcePath)); + const commonTestFilePaths = testFilePaths.filter((testFile) => + testFile.includes('test/integrations/common'), + ); + testFilePaths = testFilePaths.filter((testFile) => testFile.includes(destination)); + testFilePaths = [...commonTestFilePaths, ...testFilePaths]; } - return paths; + return testFilePaths; }; export const addMock = (mock: MockAdapter, axiosMock: MockHttpCallsData) => { From 9b6e977cc0f1b525f5ee0792d9ba9a06c8104dbd Mon Sep 17 00:00:00 2001 From: shrouti1507 Date: Fri, 15 Nov 2024 10:31:42 +0530 Subject: [PATCH 5/8] fix: review comment addressed --- src/v0/sources/adjust/transform.js | 15 ++++----------- src/v0/sources/adjust/utils.js | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 src/v0/sources/adjust/utils.js diff --git a/src/v0/sources/adjust/transform.js b/src/v0/sources/adjust/transform.js index ab2555902b..c923cde057 100644 --- a/src/v0/sources/adjust/transform.js +++ b/src/v0/sources/adjust/transform.js @@ -7,6 +7,7 @@ const Message = require('../message'); const { CommonUtils } = require('../../../util/common'); const { excludedFieldList } = require('./config'); const { extractCustomFields, generateUUID } = require('../../util'); +const { processTimestamp } = require('./utils'); // ref : https://help.adjust.com/en/article/global-callbacks#general-recommended-placeholders // import mapping json using JSON.parse to preserve object key order @@ -43,17 +44,9 @@ const processEvent = (inputEvent) => { message.properties = { ...message.properties, ...customProperties }; if (formattedPayload.created_at) { - const rawTimestamp = formattedPayload.created_at; - try { - const createdAt = Number(rawTimestamp); - const ts = new Date(createdAt * 1000).toISOString(); - message.setProperty('originalTimestamp', ts); - message.setProperty('timestamp', ts); - } catch (error) { - throw new TransformationError( - `[Adjust] Invalid timestamp "${rawTimestamp}": ${error.message}`, - ); - } + const ts = processTimestamp(formattedPayload.created_at); + message.setProperty('originalTimestamp', ts); + message.setProperty('timestamp', ts); } // adjust does not has the concept of user but we need to set some random anonymousId in order to make the server accept the message message.anonymousId = generateUUID(); diff --git a/src/v0/sources/adjust/utils.js b/src/v0/sources/adjust/utils.js new file mode 100644 index 0000000000..36055680f5 --- /dev/null +++ b/src/v0/sources/adjust/utils.js @@ -0,0 +1,14 @@ +const { TransformationError } = require('@rudderstack/integrations-lib'); + +const processTimestamp = (rawTimestamp) => { + try { + const createdAt = Number(rawTimestamp); + return new Date(createdAt * 1000).toISOString(); + } catch (error) { + throw new TransformationError(`[Adjust] Invalid timestamp "${rawTimestamp}": ${error.message}`); + } +}; + +module.exports = { + processTimestamp, +}; From e57643199c3de9d5ad9f75281ba2f3c300c1dc04 Mon Sep 17 00:00:00 2001 From: shrouti1507 Date: Mon, 18 Nov 2024 11:39:39 +0530 Subject: [PATCH 6/8] fix: review comment addressed --- src/v0/sources/adjust/transform.js | 4 +-- src/v0/sources/adjust/utils.js | 31 +++++++++++++++++------ src/v0/sources/adjust/utils.test.js | 32 ++++++++++++++++++++++++ test/integrations/sources/adjust/data.ts | 2 +- 4 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 src/v0/sources/adjust/utils.test.js diff --git a/src/v0/sources/adjust/transform.js b/src/v0/sources/adjust/transform.js index c923cde057..f68e87d476 100644 --- a/src/v0/sources/adjust/transform.js +++ b/src/v0/sources/adjust/transform.js @@ -7,7 +7,7 @@ const Message = require('../message'); const { CommonUtils } = require('../../../util/common'); const { excludedFieldList } = require('./config'); const { extractCustomFields, generateUUID } = require('../../util'); -const { processTimestamp } = require('./utils'); +const { convertToISODate } = require('./utils'); // ref : https://help.adjust.com/en/article/global-callbacks#general-recommended-placeholders // import mapping json using JSON.parse to preserve object key order @@ -44,7 +44,7 @@ const processEvent = (inputEvent) => { message.properties = { ...message.properties, ...customProperties }; if (formattedPayload.created_at) { - const ts = processTimestamp(formattedPayload.created_at); + const ts = convertToISODate(formattedPayload.created_at); message.setProperty('originalTimestamp', ts); message.setProperty('timestamp', ts); } diff --git a/src/v0/sources/adjust/utils.js b/src/v0/sources/adjust/utils.js index 36055680f5..febbddd78f 100644 --- a/src/v0/sources/adjust/utils.js +++ b/src/v0/sources/adjust/utils.js @@ -1,14 +1,31 @@ const { TransformationError } = require('@rudderstack/integrations-lib'); -const processTimestamp = (rawTimestamp) => { - try { - const createdAt = Number(rawTimestamp); - return new Date(createdAt * 1000).toISOString(); - } catch (error) { - throw new TransformationError(`[Adjust] Invalid timestamp "${rawTimestamp}": ${error.message}`); +const convertToISODate = (rawTimestamp) => { + if (typeof rawTimestamp !== 'number' && typeof rawTimestamp !== 'string') { + throw new TransformationError( + `[Adjust] Invalid timestamp "${rawTimestamp}": must be a number or numeric string.`, + ); } + + const createdAt = Number(rawTimestamp); + + if (Number.isNaN(createdAt)) { + throw new TransformationError( + `[Adjust] Invalid timestamp "${rawTimestamp}": cannot be converted to a valid number.`, + ); + } + + const date = new Date(createdAt * 1000); + + if (Number.isNaN(date.getTime())) { + throw new TransformationError( + `[Adjust] Invalid timestamp "${rawTimestamp}": results in an invalid date.`, + ); + } + + return date.toISOString(); }; module.exports = { - processTimestamp, + convertToISODate, }; diff --git a/src/v0/sources/adjust/utils.test.js b/src/v0/sources/adjust/utils.test.js new file mode 100644 index 0000000000..b8096909c8 --- /dev/null +++ b/src/v0/sources/adjust/utils.test.js @@ -0,0 +1,32 @@ +const { convertToISODate } = require('./utils'); +const { TransformationError } = require('@rudderstack/integrations-lib'); + +describe('convertToISODate', () => { + // Converts valid numeric timestamp to ISO date string + it('should return ISO date string when given a valid numeric timestamp', () => { + const timestamp = 1633072800; // Example timestamp for 2021-10-01T00:00:00.000Z + const result = convertToISODate(timestamp); + expect(result).toBe('2021-10-01T07:20:00.000Z'); + }); + + // Throws error for non-numeric string input + it('should throw TransformationError when given a non-numeric string', () => { + const invalidTimestamp = 'invalid'; + expect(() => convertToISODate(invalidTimestamp)).toThrow(TransformationError); + }); + + // Converts valid numeric string timestamp to ISO date string + it('should convert valid numeric string timestamp to ISO date string', () => { + const rawTimestamp = '1633072800'; // Corresponds to 2021-10-01T00:00:00.000Z + const result = convertToISODate(rawTimestamp); + expect(result).toBe('2021-10-01T07:20:00.000Z'); + }); + + // Throws error for non-number and non-string input + it('should throw error for non-number and non-string input', () => { + expect(() => convertToISODate({})).toThrow(TransformationError); + expect(() => convertToISODate([])).toThrow(TransformationError); + expect(() => convertToISODate(null)).toThrow(TransformationError); + expect(() => convertToISODate(undefined)).toThrow(TransformationError); + }); +}); diff --git a/test/integrations/sources/adjust/data.ts b/test/integrations/sources/adjust/data.ts index 8dfe48b058..4807507f5f 100644 --- a/test/integrations/sources/adjust/data.ts +++ b/test/integrations/sources/adjust/data.ts @@ -161,7 +161,7 @@ export const data = [ status: 200, body: [ { - error: '[Adjust] Invalid timestamp "test": Invalid time value', + error: '[Adjust] Invalid timestamp "test": cannot be converted to a valid number.', statTags: { destinationId: 'Non determinable', errorCategory: 'transformation', From 54a503a56cfb0c2b36c49dca50d7589f22d4b138 Mon Sep 17 00:00:00 2001 From: Sai Sankeerth Date: Mon, 18 Nov 2024 13:26:48 +0530 Subject: [PATCH 7/8] chore: add edge testcase - update error messages --- src/v0/sources/adjust/utils.js | 10 +++------- src/v0/sources/adjust/utils.test.js | 5 +++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/v0/sources/adjust/utils.js b/src/v0/sources/adjust/utils.js index febbddd78f..73ec696e34 100644 --- a/src/v0/sources/adjust/utils.js +++ b/src/v0/sources/adjust/utils.js @@ -3,24 +3,20 @@ const { TransformationError } = require('@rudderstack/integrations-lib'); const convertToISODate = (rawTimestamp) => { if (typeof rawTimestamp !== 'number' && typeof rawTimestamp !== 'string') { throw new TransformationError( - `[Adjust] Invalid timestamp "${rawTimestamp}": must be a number or numeric string.`, + `Invalid timestamp type: expected number or string, received ${typeof rawTimestamp}`, ); } const createdAt = Number(rawTimestamp); if (Number.isNaN(createdAt)) { - throw new TransformationError( - `[Adjust] Invalid timestamp "${rawTimestamp}": cannot be converted to a valid number.`, - ); + throw new TransformationError(`Failed to parse timestamp: "${rawTimestamp}"`); } const date = new Date(createdAt * 1000); if (Number.isNaN(date.getTime())) { - throw new TransformationError( - `[Adjust] Invalid timestamp "${rawTimestamp}": results in an invalid date.`, - ); + throw new TransformationError(`Failed to create valid date for timestamp "${rawTimestamp}"`); } return date.toISOString(); diff --git a/src/v0/sources/adjust/utils.test.js b/src/v0/sources/adjust/utils.test.js index b8096909c8..f5a0caa832 100644 --- a/src/v0/sources/adjust/utils.test.js +++ b/src/v0/sources/adjust/utils.test.js @@ -29,4 +29,9 @@ describe('convertToISODate', () => { expect(() => convertToISODate(null)).toThrow(TransformationError); expect(() => convertToISODate(undefined)).toThrow(TransformationError); }); + + it('should throw error for timestamp that results in invalid date when multiplied', () => { + const hugeTimestamp = 999999999999999; // This will become invalid when multiplied by 1000 + expect(() => convertToISODate(hugeTimestamp)).toThrow(TransformationError); + }); }); From 3efd47aee15645188fdf80dd2e9709c6c5aa8892 Mon Sep 17 00:00:00 2001 From: Sai Sankeerth Date: Mon, 18 Nov 2024 13:36:17 +0530 Subject: [PATCH 8/8] fix: testcase error message --- test/integrations/sources/adjust/data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integrations/sources/adjust/data.ts b/test/integrations/sources/adjust/data.ts index 4807507f5f..107bb444c4 100644 --- a/test/integrations/sources/adjust/data.ts +++ b/test/integrations/sources/adjust/data.ts @@ -161,7 +161,7 @@ export const data = [ status: 200, body: [ { - error: '[Adjust] Invalid timestamp "test": cannot be converted to a valid number.', + error: 'Failed to parse timestamp: "test"', statTags: { destinationId: 'Non determinable', errorCategory: 'transformation',