"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.restore = exports.serialize = exports.flatten = exports.isFixture = exports.isTest = void 0; const lodash_1 = require("lodash"); const protocol_1 = require("../compiler/protocol"); const unit_type_1 = __importDefault(require("../../api/structure/unit-type")); const RECURSIVE_PROPERTIES = ['testFile', 'fixture', 'currentFixture', 'collectedTests']; function isProperty(object, property) { return object.hasOwnProperty(property); } function isTest(value) { return value.unitType === unit_type_1.default.test; } exports.isTest = isTest; function isFixture(value) { return value.unitType === unit_type_1.default.fixture; } exports.isFixture = isFixture; function mapProperties(object, properties, mapper) { for (const property of properties) { if (!isProperty(object, property)) continue; const value = object[property]; if (Array.isArray(value)) object[property] = value.map(item => mapper({ item, property, object })); else object[property] = mapper({ item: object[property], property, object }); } } function replaceFunctionProperties(unit) { mapProperties(unit, protocol_1.FUNCTION_PROPERTIES, ({ item }) => !!item); } function restoreFunctionProperties(unit, mapper) { mapProperties(unit, protocol_1.FUNCTION_PROPERTIES, ({ item, object, property }) => item ? mapper(object.id, property) : item); } function flattenRecursiveProperties(unit) { mapProperties(unit, RECURSIVE_PROPERTIES, ({ item }) => item.id); } function restoreRecursiveProperties(unit, units) { mapProperties(unit, RECURSIVE_PROPERTIES, ({ item }) => units[item]); } function restorePredicateInRequestFilterRules(test, mapper) { test.requestHooks.forEach(hook => { for (let i = 0; i < hook._requestFilterRules.length; i++) { const targetRule = hook._requestFilterRules[i]; if (!targetRule.isPredicate) continue; targetRule.options = mapper({ testId: test.id, hookId: hook.id, ruleId: targetRule.id, }); } }); } function flatten(tests) { const testFiles = (0, lodash_1.uniq)(tests.map(test => test.testFile)); const fixtures = (0, lodash_1.uniq)(tests.map(test => test.fixture)); return (0, lodash_1.keyBy)([...tests, ...fixtures, ...testFiles], unit => unit.id); } exports.flatten = flatten; function serialize(units) { const result = {}; for (const unit of Object.values(units)) { // @ts-ignore const copy = Object.assign({}, unit); replaceFunctionProperties(copy); flattenRecursiveProperties(copy); result[copy.id] = copy; } return result; } exports.serialize = serialize; function restore(units, testFunctionMapper, ruleMapper) { const list = Object.values(units); const result = []; for (const unit of list) { restoreRecursiveProperties(unit, units); restoreFunctionProperties(unit, testFunctionMapper); if (isTest(unit)) { restorePredicateInRequestFilterRules(unit, ruleMapper); result.push(unit); } } return result; } exports.restore = restore; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1zdHJ1Y3R1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvc2VyaWFsaXphdGlvbi90ZXN0LXN0cnVjdHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtQ0FBcUM7QUFDckMsbURBQTJEO0FBSzNELDhFQUFxRDtBQUlyRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBVSxDQUFDO0FBMEJsRyxTQUFTLFVBQVUsQ0FBb0IsTUFBUyxFQUFFLFFBQWdCO0lBQzlELE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBZ0IsTUFBTSxDQUFFLEtBQVc7SUFDL0IsT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLG1CQUFRLENBQUMsSUFBSSxDQUFDO0FBQzVDLENBQUM7QUFGRCx3QkFFQztBQUVELFNBQWdCLFNBQVMsQ0FBRSxLQUFXO0lBQ2xDLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxtQkFBUSxDQUFDLE9BQU8sQ0FBQztBQUMvQyxDQUFDO0FBRkQsOEJBRUM7QUFFRCxTQUFTLGFBQWEsQ0FBNEQsTUFBUyxFQUFFLFVBQWEsRUFBRSxNQUE0QjtJQUNwSSxLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsRUFBRTtRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7WUFDN0IsU0FBUztRQUViLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUvQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFN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QUFjLElBQUksQ0FBRSxDQUFDO1FBRS9CLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQzFCO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQWRELDhCQWNDO0FBRUQsU0FBZ0IsT0FBTyxDQUFFLEtBQVksRUFBRSxrQkFBa0MsRUFBRSxVQUFtQztJQUMxRyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFXLEVBQUUsQ0FBQztJQUUxQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRTtRQUNyQiwwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMseUJBQXlCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFcEQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDZCxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQjtLQUNKO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQWpCRCwwQkFpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1bmlxLCBrZXlCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBGVU5DVElPTl9QUk9QRVJUSUVTIH0gZnJvbSAnLi4vY29tcGlsZXIvcHJvdG9jb2wnO1xuaW1wb3J0IHsgUmVxdWVzdEZpbHRlclJ1bGVMb2NhdG9yIH0gZnJvbSAnLi4vY29tcGlsZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgVGVzdCBmcm9tICcuLi8uLi9hcGkvc3RydWN0dXJlL3Rlc3QnO1xuaW1wb3J0IEZpeHR1cmUgZnJvbSAnLi4vLi4vYXBpL3N0cnVjdHVyZS9maXh0dXJlJztcbmltcG9ydCBUZXN0RmlsZSBmcm9tICcuLi8uLi9hcGkvc3RydWN0dXJlL3Rlc3QtZmlsZSc7XG5pbXBvcnQgVW5pdFR5cGUgZnJvbSAnLi4vLi4vYXBpL3N0cnVjdHVyZS91bml0LXR5cGUnO1xuaW1wb3J0IHsgUmVxdWVzdEluZm8gfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuXG5jb25zdCBSRUNVUlNJVkVfUFJPUEVSVElFUyA9IFsndGVzdEZpbGUnLCAnZml4dHVyZScsICdjdXJyZW50Rml4dHVyZScsICdjb2xsZWN0ZWRUZXN0cyddIGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgRnVuY3Rpb25NYXBwZXIge1xuICAgIChpZDogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHR5cGVvZiBGVU5DVElPTl9QUk9QRVJUSUVTW251bWJlcl0pOiBGdW5jdGlvbjtcbn1cblxuaW50ZXJmYWNlIFJlcXVlc3RGaWx0ZXJSdWxlTWFwcGVyIHtcbiAgICAocnVsZUxvY2F0b3I6IFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvcik6IChyZXF1ZXN0SW5mbzogUmVxdWVzdEluZm8pID0+IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmludGVyZmFjZSBNYXBwZXJBcmd1bWVudHM8VCwgUD4ge1xuICAgIG9iamVjdDogVDtcbiAgICBwcm9wZXJ0eTogUDtcbiAgICBpdGVtOiBhbnk7XG59XG5cbmludGVyZmFjZSBNYXBwZXI8VCwgUD4ge1xuICAgICh7IGl0ZW0sIHByb3BlcnR5LCBvYmplY3QgfTogTWFwcGVyQXJndW1lbnRzPFQsIFA+KTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBVbml0ID0gVGVzdCB8IEZpeHR1cmUgfCBUZXN0RmlsZTtcblxuZXhwb3J0IGludGVyZmFjZSBVbml0cyB7XG4gICAgW2lkOiBzdHJpbmddOiBVbml0O1xufVxuXG5mdW5jdGlvbiBpc1Byb3BlcnR5PFQgZXh0ZW5kcyBvYmplY3Q+IChvYmplY3Q6IFQsIHByb3BlcnR5OiBzdHJpbmcpOiBwcm9wZXJ0eSBpcyBFeHRyYWN0PGtleW9mIFQsIHN0cmluZz4ge1xuICAgIHJldHVybiBvYmplY3QuaGFzT3duUHJvcGVydHkocHJvcGVydHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZXN0ICh2YWx1ZTogVW5pdCk6IHZhbHVlIGlzIFRlc3Qge1xuICAgIHJldHVybiB2YWx1ZS51bml0VHlwZSA9PT0gVW5pdFR5cGUudGVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRml4dHVyZSAodmFsdWU6IFVuaXQpOiB2YWx1ZSBpcyBGaXh0dXJlIHtcbiAgICByZXR1cm4gdmFsdWUudW5pdFR5cGUgPT09IFVuaXRUeXBlLmZpeHR1cmU7XG59XG5cbmZ1bmN0aW9uIG1hcFByb3BlcnRpZXM8VCBleHRlbmRzIFJlYWRvbmx5PG9iamVjdD4sIFAgZXh0ZW5kcyBSZWFkb25seTxzdHJpbmdbXT4+IChvYmplY3Q6IFQsIHByb3BlcnRpZXM6IFAsIG1hcHBlcjogTWFwcGVyPFQsIFBbbnVtYmVyXT4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKCFpc1Byb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmplY3RbcHJvcGVydHldO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSB2YWx1ZS5tYXAoaXRlbSA9PiBtYXBwZXIoeyBpdGVtLCBwcm9wZXJ0eSwgb2JqZWN0IH0pKSBhcyBhbnk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBtYXBwZXIoeyBpdGVtOiBvYmplY3RbcHJvcGVydHldLCBwcm9wZXJ0eSwgb2JqZWN0IH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUZ1bmN0aW9uUHJvcGVydGllcyAodW5pdDogVW5pdCk6IHZvaWQge1xuICAgIG1hcFByb3BlcnRpZXModW5pdCwgRlVOQ1RJT05fUFJPUEVSVElFUywgKHsgaXRlbSB9KSA9PiAhIWl0ZW0pO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlRnVuY3Rpb25Qcm9wZXJ0aWVzICh1bml0OiBVbml0LCBtYXBwZXI6IEZ1bmN0aW9uTWFwcGVyKTogdm9pZCB7XG4gICAgbWFwUHJvcGVydGllcyh1bml0LCBGVU5DVElPTl9QUk9QRVJUSUVTLCAoeyBpdGVtLCBvYmplY3QsIHByb3BlcnR5IH0pID0+IGl0ZW0gPyBtYXBwZXIob2JqZWN0LmlkLCBwcm9wZXJ0eSkgOiBpdGVtKTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlblJlY3Vyc2l2ZVByb3BlcnRpZXMgKHVuaXQ6IFVuaXQpOiB2b2lkIHtcbiAgICBtYXBQcm9wZXJ0aWVzKHVuaXQsIFJFQ1VSU0lWRV9QUk9QRVJUSUVTLCAoeyBpdGVtIH0pID0+IGl0ZW0uaWQpO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlUmVjdXJzaXZlUHJvcGVydGllcyAodW5pdDogVW5pdCwgdW5pdHM6IFVuaXRzKTogdm9pZCB7XG4gICAgbWFwUHJvcGVydGllcyh1bml0LCBSRUNVUlNJVkVfUFJPUEVSVElFUywgKHsgaXRlbSB9KSA9PiB1bml0c1tpdGVtXSk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVQcmVkaWNhdGVJblJlcXVlc3RGaWx0ZXJSdWxlcyAodGVzdDogVGVzdCwgbWFwcGVyOiBSZXF1ZXN0RmlsdGVyUnVsZU1hcHBlcik6IHZvaWQge1xuICAgIHRlc3QucmVxdWVzdEhvb2tzLmZvckVhY2goaG9vayA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaG9vay5fcmVxdWVzdEZpbHRlclJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRSdWxlID0gaG9vay5fcmVxdWVzdEZpbHRlclJ1bGVzW2ldO1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldFJ1bGUuaXNQcmVkaWNhdGUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIHRhcmdldFJ1bGUub3B0aW9ucyA9IG1hcHBlcih7XG4gICAgICAgICAgICAgICAgdGVzdElkOiB0ZXN0LmlkLFxuICAgICAgICAgICAgICAgIGhvb2tJZDogaG9vay5pZCxcbiAgICAgICAgICAgICAgICBydWxlSWQ6IHRhcmdldFJ1bGUuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbiAodGVzdHM6IFRlc3RbXSk6IFVuaXRzIHtcbiAgICBjb25zdCB0ZXN0RmlsZXMgPSB1bmlxKHRlc3RzLm1hcCh0ZXN0ID0+IHRlc3QudGVzdEZpbGUpKTtcbiAgICBjb25zdCBmaXh0dXJlcyAgPSB1bmlxKHRlc3RzLm1hcCh0ZXN0ID0+IHRlc3QuZml4dHVyZSBhcyBGaXh0dXJlKSk7XG5cbiAgICByZXR1cm4ga2V5QnkoWy4uLnRlc3RzLCAuLi5maXh0dXJlcywgLi4udGVzdEZpbGVzXSwgdW5pdCA9PiB1bml0LmlkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZSAodW5pdHM6IFVuaXRzKTogVW5pdHMge1xuICAgIGNvbnN0IHJlc3VsdDogVW5pdHMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgdW5pdCBvZiBPYmplY3QudmFsdWVzKHVuaXRzKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGNvcHk6IFVuaXQgPSB7IC4uLnVuaXQgfTtcblxuICAgICAgICByZXBsYWNlRnVuY3Rpb25Qcm9wZXJ0aWVzKGNvcHkpO1xuICAgICAgICBmbGF0dGVuUmVjdXJzaXZlUHJvcGVydGllcyhjb3B5KTtcblxuICAgICAgICByZXN1bHRbY29weS5pZF0gPSBjb3B5O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlICh1bml0czogVW5pdHMsIHRlc3RGdW5jdGlvbk1hcHBlcjogRnVuY3Rpb25NYXBwZXIsIHJ1bGVNYXBwZXI6IFJlcXVlc3RGaWx0ZXJSdWxlTWFwcGVyKTogVGVzdFtdIHtcbiAgICBjb25zdCBsaXN0ID0gT2JqZWN0LnZhbHVlcyh1bml0cyk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFRlc3RbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB1bml0IG9mIGxpc3QpIHtcbiAgICAgICAgcmVzdG9yZVJlY3Vyc2l2ZVByb3BlcnRpZXModW5pdCwgdW5pdHMpO1xuICAgICAgICByZXN0b3JlRnVuY3Rpb25Qcm9wZXJ0aWVzKHVuaXQsIHRlc3RGdW5jdGlvbk1hcHBlcik7XG5cbiAgICAgICAgaWYgKGlzVGVzdCh1bml0KSkge1xuICAgICAgICAgICAgcmVzdG9yZVByZWRpY2F0ZUluUmVxdWVzdEZpbHRlclJ1bGVzKHVuaXQsIHJ1bGVNYXBwZXIpO1xuXG4gICAgICAgICAgICByZXN1bHQucHVzaCh1bml0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iXX0=