meta-capi-param-builder-clientjs
Version:
Conversions API parameter builder for Client-side JavaScript
289 lines (252 loc) • 8.16 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 { getNormalizedPII } from '../utils/piiUtil/piiUtil.js';
import { getNormalizedCountry } from '../utils/piiUtil/stringUtil.js';
import { PII_DATA_TYPE } from '../model/constants.js';
describe('getNormalizedCountry', () => {
describe('Input validation', () => {
it('should return null for null input', () => {
expect(getNormalizedCountry(null)).toBeNull();
});
it('should return null for undefined input', () => {
expect(getNormalizedCountry(undefined)).toBeNull();
});
it('should return null for empty string input', () => {
expect(getNormalizedCountry('')).toBeNull();
});
it('should return null for whitespace-only input', () => {
expect(getNormalizedCountry(' ')).toBeNull();
expect(getNormalizedCountry('\t\n\r')).toBeNull();
});
});
describe('Country normalization', () => {
it('should normalize example data', () => {
const testCases = [
{
input: ' United States ',
expected: 'us',
},
{
input: ' US ',
expected: 'us',
},
];
testCases.forEach(({ input, expected }) => {
expect(getNormalizedCountry(input)).toEqual(expected);
});
});
it('should normalize major countries to ISO codes', () => {
const testCases = [
{
input: 'United States',
expected: 'us',
},
{
input: 'Canada',
expected: 'ca',
},
{
input: 'Germany',
expected: 'de',
},
{
input: 'France',
expected: 'fr',
},
{
input: 'Japan',
expected: 'jp',
},
{
input: 'Australia',
expected: 'au',
},
];
testCases.forEach(({ input, expected }) => {
expect(getNormalizedCountry(input)).toEqual(expected);
});
});
it('should handle mixed case country names', () => {
const testCases = [
{
input: 'uNiTeD sTaTeS',
expected: 'us',
},
{
input: 'cAnAdA',
expected: 'ca',
},
{
input: 'gErMaNy',
expected: 'de',
},
];
testCases.forEach(({ input, expected }) => {
expect(getNormalizedCountry(input)).toEqual(expected);
});
});
it('should truncate to 2 characters for non-mapped countries', () => {
const testCases = [
{
input: 'Unknown',
expected: 'un',
},
{
input: 'TestCountry',
expected: 'te',
},
{
input: 'AB',
expected: 'ab',
},
{
input: 'X',
expected: 'x',
},
];
testCases.forEach(({ input, expected }) => {
expect(getNormalizedCountry(input)).toEqual(expected);
});
});
});
describe('Hashed country handling', () => {
it('should return SHA-256 hash as-is when it looks like a hash', () => {
const validHashes = [
'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3',
'ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890',
];
validHashes.forEach((hash) => {
expect(getNormalizedCountry(hash)).toEqual(hash);
});
});
});
});
describe('getNormalizedPII with COUNTRY', () => {
describe('Input validation', () => {
it('should return null for null input', () => {
expect(getNormalizedPII(null, PII_DATA_TYPE.COUNTRY)).toBeNull();
});
it('should return null for undefined input', () => {
expect(getNormalizedPII(undefined, PII_DATA_TYPE.COUNTRY)).toBeNull();
});
it('should return null for non-string input', () => {
const nonStringValues = [123, {}, [], true, false];
nonStringValues.forEach((value) => {
expect(getNormalizedPII(value, PII_DATA_TYPE.COUNTRY)).toBeNull();
});
});
it('should return null for empty string input', () => {
expect(getNormalizedPII('', PII_DATA_TYPE.COUNTRY)).toBeNull();
});
it('should return null for whitespace-only input', () => {
expect(getNormalizedPII(' ', PII_DATA_TYPE.COUNTRY)).toBeNull();
expect(getNormalizedPII('\t\n\r', PII_DATA_TYPE.COUNTRY)).toBeNull();
});
});
describe('Country normalization', () => {
it('should normalize country names using getNormalizedCountry', () => {
const testCases = [
{
input: 'United States',
expected: 'us',
},
{
input: 'CANADA',
expected: 'ca',
},
{
input: ' Germany ',
expected: 'de',
},
{
input: 'France',
expected: 'fr',
},
];
testCases.forEach(({ input, expected }) => {
expect(getNormalizedPII(input, PII_DATA_TYPE.COUNTRY)).toEqual(
expected
);
});
});
it('should handle hashed country names', () => {
const hash =
'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3';
expect(getNormalizedPII(hash, PII_DATA_TYPE.COUNTRY)).toEqual(hash);
});
});
describe('Other PII data types', () => {
it('should return null for invalid email when using EMAIL data type', () => {
expect(getNormalizedPII('United States', PII_DATA_TYPE.EMAIL)).toBeNull();
});
it('should return normalized phone for country when using PHONE data type', () => {
expect(getNormalizedPII('United States', PII_DATA_TYPE.PHONE)).toEqual(
''
);
expect(getNormalizedPII('Country123', PII_DATA_TYPE.PHONE)).toEqual(
'123'
);
});
it('should return null for truly unsupported data types', () => {
const unsupportedTypes = ['invalid_type', 'unknown', 'fake_type'];
unsupportedTypes.forEach((type) => {
expect(getNormalizedPII('United States', type)).toBeNull();
});
});
});
describe('Comparison with direct getNormalizedCountry', () => {
it('should show both functions behave the same way for valid countries', () => {
const testCases = [
{
input: 'United States',
expected: 'us',
},
{
input: ' Germany ',
expected: 'de',
},
{
input: 'France',
expected: 'fr',
},
];
testCases.forEach(({ input, expected }) => {
expect(getNormalizedCountry(input)).toEqual(expected);
expect(getNormalizedPII(input, PII_DATA_TYPE.COUNTRY)).toEqual(
expected
);
});
});
it('should show both handle hashes the same way', () => {
const hash =
'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3';
expect(getNormalizedCountry(hash)).toEqual(hash);
expect(getNormalizedPII(hash, PII_DATA_TYPE.COUNTRY)).toEqual(hash);
});
it('should show different handling for null/invalid inputs due to PII interface validation', () => {
const invalidInputs = [null, undefined];
invalidInputs.forEach((input) => {
expect(getNormalizedCountry(input)).toBeNull();
expect(getNormalizedPII(input, PII_DATA_TYPE.COUNTRY)).toBeNull();
});
});
it('should show different handling for non-string inputs', () => {
const nonStringInputs = [123, {}, [], true, false];
nonStringInputs.forEach((input) => {
// Direct function converts non-strings to strings and processes them
const directResult = getNormalizedCountry(input);
expect(
[null, 'string'].includes(typeof directResult) ||
directResult === null
).toBe(true);
// PII interface returns null for non-string inputs (validates input first)
expect(getNormalizedPII(input, PII_DATA_TYPE.COUNTRY)).toBeNull();
});
});
});
});