meta-capi-param-builder-clientjs
Version:
Conversions API parameter builder for Client-side JavaScript
267 lines (246 loc) • 8.55 kB
JavaScript
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the license found in the
* LICENSE file in the root directory of this source tree.
*/
import {
readPackedCookie,
readCookieRaw,
writeNewCookie,
writeExistingCookie,
mintDomainScopedBrowserIDCookieValue,
updateClickIdCookieIfNecessary,
updateDomainScopedBrowserIdCookieIfNecessary,
writeCookieWithToken,
} from '../utils/cookieUtil.js';
jest.mock('../version.js', () => ({
getVersionInfo: () => ({
version: '1.0.0',
buildDate: '2025-01-01T00:00:00.000Z',
}),
}));
jest.mock('../model/constants.js', () => ({
MAX_INT_9_DECIMAL_DIGITS: 999999999,
NINETY_DAYS_IN_MS: 90 * 24 * 60 * 60 * 1000,
CLICK_ID_PARAMETER: 'fbclid',
CLICKTHROUGH_COOKIE_NAME: '_fbc',
DOMAIN_SCOPED_BROWSER_ID_COOKIE_NAME: '_fbp',
LANGUAGE_TOKEN: 'Bg',
NUM_OF_EXPECTED_COOKIE_COMPONENTS: 4,
NUM_OF_EXPECTED_COOKIE_COMPONENTS_WITH_LANGUAGE_TOKEN: 5,
VALID_PARAM_BUILDER_TOKENS: ['AQ', 'Ag', 'Aw', 'BA', 'BQ', 'Bg'],
ONLY_VALID_VERSION_SO_FAR: 'fb',
DEFAULT_FBC_PARAMS: [
{ query: 'fbclid', prefix: '', ebp_path: 'clickID' },
{ query: 'query', prefix: 'test', ebp_path: 'clickID_sample' },
],
DEFAULT_FORMAT: 0x01,
LANGUAGE_TOKEN_INDEX: 0x06,
APPENDIX_LENGTH_V2: 8,
APPENDIX_GENERAL_NEW: 0x01,
APPENDIX_NET_NEW: 0x02,
APPENDIX_MODIFIED_NEW: 0x03,
APPENDIX_NO_CHANGE: 0x00,
}));
describe('Test cookieUtil', () => {
let originalCookie;
// Expected appendix values for version 1.0.0
const APPENDIX_NET_NEW_STR = 'AQYCAQAA';
const APPENDIX_MODIFIED_NEW_STR = 'AQYDAQAA';
const APPENDIX_NO_CHANGE_STR = 'AQYAAQAA';
beforeAll(() => {
originalCookie = document.cookie;
});
afterAll(() => {
Object.defineProperty(document, 'cookie', {
value: originalCookie,
writable: true,
});
});
beforeEach(() => {
// Clear all cookies before each test
Object.defineProperty(document, 'cookie', {
value: '',
writable: true,
configurable: true,
});
Object.defineProperty(window, 'location', {
value: { href: 'http://test.com/', hostname: 'test.com' },
writable: true,
configurable: true,
});
jest.spyOn(console, 'warn').mockImplementation(() => {});
});
afterEach(() => {
console.warn.mockRestore();
jest.resetModules();
jest.resetAllMocks();
});
test('readPackedCookie valid', () => {
document.cookie = '_fbc=fb.1.4567.testPayload.Bg';
const cookie = readPackedCookie('_fbc');
expect(cookie).toEqual({
creationTime: 4567,
subdomainIndex: 1,
appendix: 'Bg',
payload: 'testPayload',
});
});
test('readPackedCookie invalid', () => {
document.cookie = '_fbc=fb.1.4567.testPayload.Bg';
const cookie = readPackedCookie('fbc');
expect(cookie).toBeNull();
});
test('readCookieRaw with multiple cookies', () => {
document.cookie = '_fbc=fb.1.4567.testCookie.Bg;';
document.cookie = '_test=value.123.test';
const cookie = readCookieRaw('_test');
expect(cookie).toEqual('value.123.test');
});
test('writeNewCookie success case', () => {
const newCookie = writeNewCookie('_fbc', 'cookiePayload');
expect(document.cookie).toEqual(
expect.stringContaining('_fbc=' + newCookie)
);
});
test('writeExistingCookie success case', () => {
Object.defineProperty(document, 'cookie', {
value: '_fbc=fb.1.4567.testCookie;',
writable: true,
});
const existing_cookie = readPackedCookie('_fbc');
const write_existing_cookie = writeExistingCookie('_fbc', existing_cookie);
expect(document.cookie).toEqual(
expect.stringContaining('_fbc=' + write_existing_cookie)
);
expect(write_existing_cookie).toEqual(
expect.stringContaining('fb.1.4567.testCookie.' + APPENDIX_NO_CHANGE_STR)
);
});
test('writeCookieWithToken appends the appendix once after a domain retry', () => {
const attemptedCookies = [];
let storedCookie = '';
Object.defineProperty(document, 'cookie', {
configurable: true,
get: () => storedCookie,
set: (cookie) => {
attemptedCookies.push(cookie);
if (!cookie.includes('domain=.com;')) {
storedCookie = cookie.split(';')[0];
}
},
});
window.location.hostname = 'www.example.com';
const ipAddress = '2001:4860:4860::8888';
const result = writeCookieWithToken(
'_fbi',
ipAddress,
false,
1000,
APPENDIX_NET_NEW_STR
);
expect(result).toBe(true);
expect(attemptedCookies).toHaveLength(2);
expect(storedCookie).toBe(`_fbi=${ipAddress}.${APPENDIX_NET_NEW_STR}`);
});
test('mintDomainScopedBrowserIDCookieValue', () => {
const browserID = mintDomainScopedBrowserIDCookieValue();
expect(browserID.length).toBeLessThan(19); // equal or less than 18
});
test('updateClickIdCookieIfNecessary when url updated', () => {
Object.defineProperty(document, 'cookie', {
value: '_fbc=fb.1.4567.testCookie',
writable: true,
});
const updated_cookie = updateClickIdCookieIfNecessary(
'http://test.com/?fbclid=testFbc'
);
expect(updated_cookie).toEqual(
expect.stringContaining('.testFbc.' + APPENDIX_MODIFIED_NEW_STR)
);
expect(document.cookie).toEqual(
expect.stringContaining('_fbc=' + updated_cookie)
);
});
test('updateClickIdCookieIfNecessary, persis the same fbc when no new fbclid input', () => {
const fbc_string = '_fbc=fb.1.4567.testCookie';
Object.defineProperty(document, 'cookie', {
value: fbc_string,
writable: true,
});
updateClickIdCookieIfNecessary('http://test.com/');
expect(document.cookie).toEqual(
expect.stringContaining(fbc_string + '.' + APPENDIX_NO_CHANGE_STR)
);
});
test('updateClickIdCookieIfNecessary, update fbc from window.location.href when no fbclid from input url', () => {
const fbc_string = '_fbc=fb.1.4567.testCookie';
Object.defineProperty(document, 'cookie', {
value: fbc_string,
writable: true,
});
Object.defineProperty(window.location, 'href', {
writable: true,
value: 'http://test.com/?fbclid=testFbc',
});
const updated_cookie = updateClickIdCookieIfNecessary('http://abc.com/');
expect(updated_cookie).toEqual(
expect.stringContaining('.testFbc.' + APPENDIX_MODIFIED_NEW_STR)
);
expect(document.cookie).toEqual(
expect.stringContaining('_fbc=' + updated_cookie)
);
});
test('updateClickIdCookieIfNecessary with multiple paramConfig', () => {
const updated_cookie = updateClickIdCookieIfNecessary(
'http://abc.com/?fbclid=test123&query=test456'
);
expect(updated_cookie).toEqual(
expect.stringContaining('.test123_test_test456.' + APPENDIX_NET_NEW_STR)
);
expect(document.cookie).toEqual(
expect.stringContaining('_fbc=' + updated_cookie)
);
});
test('updateClickIdCookieIfNecessary with partially matched paramConfig', () => {
const updated_cookie = updateClickIdCookieIfNecessary(
'http://abc.com/?query=test456'
);
expect(updated_cookie).toEqual(
expect.stringContaining('.test_test456.' + APPENDIX_NET_NEW_STR)
);
expect(document.cookie).toEqual(
expect.stringContaining('_fbc=' + updated_cookie)
);
});
test('updateClickIdCookieIfNecessary with paramConfig duplication value', () => {
const updated_cookie = updateClickIdCookieIfNecessary(
'http://abc.com/?fbclid=test123_test_balabla&query=test456'
);
expect(updated_cookie).toEqual(
expect.stringContaining('.test123_test_balabla.' + APPENDIX_NET_NEW_STR)
);
expect(document.cookie).toEqual(
expect.stringContaining('_fbc=' + updated_cookie)
);
});
test('updateDomainScopedBrowserIdCookieIfNecessary, no updates, contains fbp already', () => {
Object.defineProperty(document, 'cookie', {
value: '_fbp=fb.1.4567.1234567',
writable: true,
});
updateDomainScopedBrowserIdCookieIfNecessary();
expect(document.cookie).toEqual(
expect.stringContaining('_fbp=fb.1.4567.1234567.' + APPENDIX_NO_CHANGE_STR)
);
});
test('updateDomainScopedBrowserIdCookieIfNecessary, update add', () => {
updateDomainScopedBrowserIdCookieIfNecessary();
expect(document.cookie).toEqual(expect.stringContaining('_fbp=fb.'));
expect(document.cookie).toEqual(
expect.stringContaining('.' + APPENDIX_NET_NEW_STR)
);
});
});