UNPKG

@vivianhealth/braze-segment-debounce

Version:

Segment utilities to debounce data before it reaches the Braze destination

342 lines (333 loc) 10.8 kB
"use strict"; 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); }); });