@vivianhealth/braze-segment-debounce
Version:
Segment utilities to debounce data before it reaches the Braze destination
342 lines (333 loc) • 10.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _browser = require("./browser");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
describe('debouncePayloadSync', function () {
var storage;
var persistPayload;
var fetchPayload;
beforeEach(function () {
storage = {};
fetchPayload = function fetchPayload(k) {
return storage[k] || null;
};
persistPayload = function persistPayload(k, i) {
storage[k] = i;
};
});
afterEach(function () {
storage = null;
});
test('debounces payload', function () {
var userId = 1;
var key = "".concat(userId, "-previousSegmentPayload");
var payload = {
obj: {
userId: userId,
traits: {
firstName: 'Test',
lastName: 'User'
}
}
};
var debouncedPayload1 = (0, _browser.debouncePayloadSync)(payload, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload2 = (0, _browser.debouncePayloadSync)(payload, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual(payload);
expect(debouncedPayload1).toEqual(payload);
expect(debouncedPayload2).toBe(null);
});
test('debounces payload with anonymousId', function () {
var anonymousId = 1;
var key = "".concat(anonymousId, "-previousSegmentPayload");
var payload = {
obj: {
anonymousId: anonymousId,
traits: {
firstName: 'Test',
lastName: 'User'
}
}
};
var debouncedPayload1 = (0, _browser.debouncePayloadSync)(payload, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload2 = (0, _browser.debouncePayloadSync)(payload, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual(payload);
expect(debouncedPayload1).toEqual(payload);
expect(debouncedPayload2).toBe(null);
});
test('debounces payload with traits', function () {
var key = "no-id-previousSegmentPayload";
var payload = {
obj: {
traits: {
firstName: 'Test',
lastName: 'User'
}
}
};
var debouncedPayload1 = (0, _browser.debouncePayloadSync)(payload, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload2 = (0, _browser.debouncePayloadSync)(payload, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual(payload);
expect(debouncedPayload1).toEqual(payload);
expect(debouncedPayload2).toBe(null);
});
test('debounces payload with new anonymousId', function () {
var userId = 1;
var key = "".concat(userId, "-previousSegmentPayload");
var payload1 = {
obj: {
userId: userId,
traits: {
firstName: 'Test',
lastName: 'User'
}
}
};
var payload2 = {
obj: {
userId: userId,
anonymousId: 2,
traits: {
firstName: 'Test',
lastName: 'User'
}
}
};
var debouncedPayload1 = (0, _browser.debouncePayloadSync)(payload1, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload2 = (0, _browser.debouncePayloadSync)(payload2, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual(payload2);
expect(debouncedPayload1).toEqual(payload1);
expect(debouncedPayload2).toEqual(payload2);
});
test('debounces payload with new traits', function () {
var userId = 1;
var key = "".concat(userId, "-previousSegmentPayload");
var payload1 = {
obj: {
userId: userId,
traits: {
firstName: 'Test',
lastName: 'User'
}
}
};
var payload2 = {
obj: {
userId: userId,
traits: {
phoneNumber: '123-45678',
address: '1 Main St'
}
}
};
var debouncedPayload1 = (0, _browser.debouncePayloadSync)(payload1, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload2 = (0, _browser.debouncePayloadSync)(payload2, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual({
obj: _objectSpread(_objectSpread({}, payload2.obj), {}, {
traits: _objectSpread(_objectSpread({}, payload2.obj.traits), {}, {
firstName: 'Test',
lastName: 'User'
})
})
});
expect(debouncedPayload1).toEqual(payload1);
expect(debouncedPayload2).toEqual(payload2);
});
test('debounces payload with different traits', function () {
var userId = 1;
var key = "".concat(userId, "-previousSegmentPayload");
var payload1 = {
obj: {
userId: userId,
traits: {
firstName: 'Test',
lastName: 'User'
}
}
};
var payload2 = {
obj: {
userId: userId,
traits: {
firstName: 'Test',
lastName: 'Tester'
}
}
};
var payload3 = {
obj: {
userId: userId,
traits: {
lastName: 'Tester'
}
}
};
var debouncedPayload1 = (0, _browser.debouncePayloadSync)(payload1, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload2 = (0, _browser.debouncePayloadSync)(payload2, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual(payload2);
expect(debouncedPayload1).toEqual(payload1);
expect(debouncedPayload2).toEqual(payload3);
});
test('debounces payload with different array traits', function () {
var userId = 1;
var key = "".concat(userId, "-previousSegmentPayload");
var payload1 = {
obj: {
userId: userId,
traits: {
colors: ['blue', 'orange', 'red']
}
}
};
var payload2 = {
obj: {
userId: userId,
traits: {
colors: ['blue', 'orange', 'red', 'green']
}
}
};
var debouncedPayload1 = (0, _browser.debouncePayloadSync)(payload1, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload2 = (0, _browser.debouncePayloadSync)(payload2, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual(payload2);
expect(debouncedPayload1).toEqual(payload1);
expect(debouncedPayload2).toEqual(payload2);
});
it('debounces payload with multiple calls', function () {
var userId = 1;
var key = "".concat(userId, "-previousSegmentPayload");
var payloads = (0, _toConsumableArray2.default)(Array(4)).map(function (_, i) {
return {
obj: {
userId: userId,
traits: {
firstName: 'Test',
lastName: 'Tester',
uniqueId: i
}
}
};
});
var debouncedPayloads = payloads.map(function (payload) {
return (0, _browser.debouncePayloadSync)(payload, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual(payloads[3]);
expect(debouncedPayloads[0]).toEqual({
obj: {
userId: userId,
traits: {
firstName: 'Test',
lastName: 'Tester',
uniqueId: 0
}
}
});
(0, _toConsumableArray2.default)(Array(3)).forEach(function (_, i) {
return expect(debouncedPayloads[i + 1]).toEqual({
obj: {
userId: userId,
traits: {
uniqueId: i + 1
}
}
});
});
});
it('debounces payload with repeated different traits', function () {
var userId = 1;
var key = "".concat(userId, "-previousSegmentPayload");
var payload1 = {
obj: {
userId: userId,
traits: {
color: 'blue'
}
}
};
var payload2 = {
obj: {
userId: userId,
traits: {
color: 'orange'
}
}
};
var debouncedPayload1 = (0, _browser.debouncePayloadSync)(payload1, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload2 = (0, _browser.debouncePayloadSync)(payload2, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload3 = (0, _browser.debouncePayloadSync)(payload1, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
var debouncedPayload4 = (0, _browser.debouncePayloadSync)(payload2, {
fetchPayload: fetchPayload,
persistPayload: persistPayload
});
expect(Object.keys(storage).length).toBe(1);
expect(JSON.parse(storage[key])).toEqual(payload2);
expect(debouncedPayload1).toEqual(payload1);
expect(debouncedPayload2).toEqual(payload2);
expect(debouncedPayload3).toEqual(payload1);
expect(debouncedPayload4).toEqual(payload2);
});
});