@forgehive/task 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +19 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -6
- package/dist/index.js.map +1 -1
- package/dist/test/safe-replay-complex-boundary.test.d.ts +2 -0
- package/dist/test/safe-replay-complex-boundary.test.d.ts.map +1 -0
- package/dist/test/safe-replay-complex-boundary.test.js +314 -0
- package/dist/test/safe-replay-complex-boundary.test.js.map +1 -0
- package/dist/test/safe-replay.test.d.ts +2 -0
- package/dist/test/safe-replay.test.d.ts.map +1 -0
- package/dist/test/safe-replay.test.js +194 -0
- package/dist/test/safe-replay.test.js.map +1 -0
- package/dist/test/task-with-boundaries.test.js.map +1 -1
- package/dist/utils/boundary.d.ts +24 -5
- package/dist/utils/boundary.d.ts.map +1 -1
- package/dist/utils/boundary.js +16 -10
- package/dist/utils/boundary.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +168 -22
- package/src/test/safe-replay-complex-boundary.test.ts +385 -0
- package/src/test/safe-replay.test.ts +231 -0
- package/src/test/task-with-boundaries.test.ts +2 -2
- package/src/utils/boundary.ts +44 -17
package/dist/index.d.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { Schema, type SchemaType, type InferSchema, type SchemaDescription } from '@forgehive/schema';
|
|
2
|
-
import { type Mode, type Boundaries, type WrappedBoundaries, type WrappedBoundaryFunction } from './utils/boundary';
|
|
2
|
+
import { type Mode, type Boundaries, type WrappedBoundaries, type WrappedBoundaryFunction, type BoundaryRecord, type BoundaryTapeData } from './utils/boundary';
|
|
3
3
|
export interface Task {
|
|
4
4
|
id: string;
|
|
5
5
|
title: string;
|
|
6
6
|
completed: boolean;
|
|
7
7
|
}
|
|
8
8
|
export type BaseFunction = (...args: any[]) => any;
|
|
9
|
-
export type { BoundaryFunction, WrappedBoundaryFunction, Boundaries, WrappedBoundaries, Mode } from './utils/boundary';
|
|
9
|
+
export type { BoundaryFunction, WrappedBoundaryFunction, Boundaries, WrappedBoundaries, Mode, BoundarySuccessRecord, BoundaryErrorRecord, BoundaryRecord, BoundaryTapeData } from './utils/boundary';
|
|
10
10
|
export { Schema };
|
|
11
11
|
export interface TaskConfig<B extends Boundaries = Boundaries> {
|
|
12
12
|
schema?: Schema<Record<string, SchemaType>>;
|
|
13
13
|
mode?: Mode;
|
|
14
14
|
boundaries?: B;
|
|
15
|
-
boundariesData?:
|
|
15
|
+
boundariesData?: BoundaryTapeData;
|
|
16
|
+
}
|
|
17
|
+
export interface ReplayConfig<B extends Boundaries = Boundaries> {
|
|
18
|
+
boundaries: {
|
|
19
|
+
[K in keyof B]?: Mode;
|
|
20
|
+
};
|
|
16
21
|
}
|
|
17
22
|
/**
|
|
18
23
|
* Represents the record passed to task listeners
|
|
@@ -27,11 +32,7 @@ export interface TaskRecord<InputType = unknown, OutputType = unknown> {
|
|
|
27
32
|
/** Boundary execution data */
|
|
28
33
|
boundaries?: Record<string, unknown>;
|
|
29
34
|
}
|
|
30
|
-
export type BoundaryLog<I extends unknown[] = unknown[], O = unknown> =
|
|
31
|
-
input: I;
|
|
32
|
-
output: O | null;
|
|
33
|
-
error: string | null;
|
|
34
|
-
};
|
|
35
|
+
export type BoundaryLog<I extends unknown[] = unknown[], O = unknown> = BoundaryRecord<I, O>;
|
|
35
36
|
export type BoundaryLogsFor<B extends Boundaries> = {
|
|
36
37
|
[K in keyof B]: B[K] extends (...args: infer I) => Promise<infer O> ? BoundaryLog<I, O>[] : BoundaryLog[];
|
|
37
38
|
};
|
|
@@ -64,20 +65,21 @@ export interface TaskInstanceType<Func extends BaseFunction = BaseFunction, B ex
|
|
|
64
65
|
emit: (data: Partial<TaskRecord>) => void;
|
|
65
66
|
asBoundary: () => (args: Parameters<Func>[0]) => Promise<ReturnType<Func>>;
|
|
66
67
|
getBoundaries: () => WrappedBoundaries<B>;
|
|
67
|
-
setBoundariesData: (boundariesData:
|
|
68
|
+
setBoundariesData: (boundariesData: BoundaryTapeData) => void;
|
|
68
69
|
getBondariesData: () => Record<string, unknown>;
|
|
69
70
|
mockBoundary: <K extends keyof B>(name: K, mockFn: WrappedBoundaryFunction) => void;
|
|
70
71
|
resetMock: <K extends keyof B>(name: K) => void;
|
|
71
72
|
resetMocks: () => void;
|
|
72
73
|
run: (argv?: Parameters<Func>[0]) => Promise<ReturnType<Func>>;
|
|
73
74
|
safeRun: (argv?: Parameters<Func>[0]) => Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>;
|
|
75
|
+
safeReplay: (executionLog: ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>, config: ReplayConfig<B>) => Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>;
|
|
74
76
|
}
|
|
75
|
-
export type InferSchemaType<S> = S extends Schema<any> ? InferSchema<S> : Record<string, unknown>;
|
|
76
|
-
export type TaskFunction<S, B extends Boundaries> = (argv: InferSchemaType<S>, boundaries: WrappedBoundaries<B>) => Promise<any>;
|
|
77
77
|
type BoundaryData = Array<{
|
|
78
78
|
input: unknown[];
|
|
79
79
|
output?: unknown;
|
|
80
80
|
}>;
|
|
81
|
+
export type InferSchemaType<S> = S extends Schema<any> ? InferSchema<S> : Record<string, unknown>;
|
|
82
|
+
export type TaskFunction<S, B extends Boundaries> = (argv: InferSchemaType<S>, boundaries: WrappedBoundaries<B>) => Promise<any>;
|
|
81
83
|
export declare const Task: {
|
|
82
84
|
new <B extends Boundaries = Boundaries, Func extends BaseFunction = BaseFunction>(fn: Func, conf?: TaskConfig<B>): {
|
|
83
85
|
version: string;
|
|
@@ -86,7 +88,7 @@ export declare const Task: {
|
|
|
86
88
|
_coolDown: number;
|
|
87
89
|
_description?: string;
|
|
88
90
|
_boundariesDefinition: B;
|
|
89
|
-
_boundariesData:
|
|
91
|
+
_boundariesData: BoundaryTapeData | null;
|
|
90
92
|
_accumulatedBoundariesData: Record<string, BoundaryData>;
|
|
91
93
|
_boundaryMocks: Record<string, WrappedBoundaryFunction>;
|
|
92
94
|
_schema: Schema<Record<string, SchemaType>> | undefined;
|
|
@@ -104,7 +106,7 @@ export declare const Task: {
|
|
|
104
106
|
removeListener(): void;
|
|
105
107
|
emit(data: Partial<TaskRecord>): void;
|
|
106
108
|
getBoundaries(): WrappedBoundaries<B>;
|
|
107
|
-
setBoundariesData(boundariesData:
|
|
109
|
+
setBoundariesData(boundariesData: BoundaryTapeData): void;
|
|
108
110
|
getBondariesData(): Record<string, unknown>;
|
|
109
111
|
/**
|
|
110
112
|
* Mocks a specific boundary function for testing
|
|
@@ -121,13 +123,15 @@ export declare const Task: {
|
|
|
121
123
|
* Resets all mocked boundaries back to their original functions
|
|
122
124
|
*/
|
|
123
125
|
resetMocks(): void;
|
|
124
|
-
_createBounderies({ definition, baseData, mode }: {
|
|
126
|
+
_createBounderies({ definition, baseData, mode, boundaryModes }: {
|
|
125
127
|
definition: B;
|
|
126
|
-
baseData:
|
|
128
|
+
baseData: BoundaryTapeData | null;
|
|
127
129
|
mode?: Mode;
|
|
130
|
+
boundaryModes?: Record<string, Mode | undefined>;
|
|
128
131
|
}): WrappedBoundaries<B>;
|
|
129
132
|
asBoundary(): (args: Parameters<Func>[0]) => Promise<ReturnType<Func>>;
|
|
130
133
|
safeRun(argv?: Parameters<Func>[0]): Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>;
|
|
134
|
+
safeReplay(executionLog: ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>, config?: ReplayConfig<B>): Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>;
|
|
131
135
|
run(argv?: Parameters<Func>[0]): Promise<ReturnType<Func>>;
|
|
132
136
|
};
|
|
133
137
|
};
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrG,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -147,22 +147,24 @@ const Task = class Task {
|
|
|
147
147
|
resetMocks() {
|
|
148
148
|
this._boundaryMocks = {};
|
|
149
149
|
}
|
|
150
|
-
_createBounderies({ definition, baseData, mode = 'proxy' }) {
|
|
150
|
+
_createBounderies({ definition, baseData, mode = 'proxy', boundaryModes = {} }) {
|
|
151
151
|
const boundariesFns = {};
|
|
152
152
|
for (const name in definition) {
|
|
153
|
+
// Get the configured mode for this boundary or use default
|
|
154
|
+
const boundaryMode = boundaryModes[name] || mode;
|
|
153
155
|
// Check if we have a mock for this boundary
|
|
154
156
|
if (this._boundaryMocks[name]) {
|
|
155
157
|
boundariesFns[name] = this._boundaryMocks[name];
|
|
156
158
|
continue;
|
|
157
159
|
}
|
|
158
|
-
//
|
|
160
|
+
// Create the boundary
|
|
159
161
|
const boundary = (0, boundary_1.createBoundary)(definition[name]);
|
|
160
162
|
if (baseData !== null && typeof baseData[name] !== 'undefined') {
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
boundary.setTape(tape);
|
|
163
|
+
const boundaryData = baseData[name];
|
|
164
|
+
boundary.setTape(boundaryData);
|
|
164
165
|
}
|
|
165
|
-
|
|
166
|
+
// Set the mode after setting the tape
|
|
167
|
+
boundary.setMode(boundaryMode);
|
|
166
168
|
boundariesFns[name] = boundary;
|
|
167
169
|
}
|
|
168
170
|
return boundariesFns;
|
|
@@ -246,6 +248,90 @@ const Task = class Task {
|
|
|
246
248
|
// Return the error, output and log item
|
|
247
249
|
return [output, error, logItem];
|
|
248
250
|
}
|
|
251
|
+
async safeReplay(executionLog, config = {
|
|
252
|
+
boundaries: {}
|
|
253
|
+
}) {
|
|
254
|
+
var _a;
|
|
255
|
+
// Extract the input from the execution log
|
|
256
|
+
const argv = executionLog.input;
|
|
257
|
+
// Initialize log item for this replay
|
|
258
|
+
const logItem = {
|
|
259
|
+
input: argv,
|
|
260
|
+
boundaries: {}
|
|
261
|
+
};
|
|
262
|
+
// Create boundaries for this replay execution with custom modes based on config
|
|
263
|
+
const boundariesConfig = {};
|
|
264
|
+
// Setup boundary data for replay mode boundaries
|
|
265
|
+
for (const name in this._boundariesDefinition) {
|
|
266
|
+
// Check if this boundary is configured for replay mode
|
|
267
|
+
const mode = config.boundaries[name] || 'proxy';
|
|
268
|
+
if (mode === 'replay' && executionLog.boundaries[name]) {
|
|
269
|
+
// Add boundary data from the execution log for replay mode
|
|
270
|
+
boundariesConfig[name] = executionLog.boundaries[name];
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Create fresh boundaries for this execution
|
|
274
|
+
const executionBoundaries = this._createBounderies({
|
|
275
|
+
definition: this._boundariesDefinition,
|
|
276
|
+
baseData: boundariesConfig,
|
|
277
|
+
mode: 'proxy',
|
|
278
|
+
boundaryModes: config.boundaries
|
|
279
|
+
});
|
|
280
|
+
// Start run for each boundary
|
|
281
|
+
for (const name in executionBoundaries) {
|
|
282
|
+
const boundary = executionBoundaries[name];
|
|
283
|
+
boundary.startRun();
|
|
284
|
+
}
|
|
285
|
+
// Handle schema validation - reusing the input from the execution log
|
|
286
|
+
if (this._schema) {
|
|
287
|
+
const validation = this._schema.safeParse(argv);
|
|
288
|
+
if (!validation.success) {
|
|
289
|
+
const errorDetails = (_a = validation.error) === null || _a === void 0 ? void 0 : _a.errors.map(err => `${err.path.join('.')}: ${err.message}`).join(', ');
|
|
290
|
+
const errorMessage = errorDetails
|
|
291
|
+
? `Invalid input on: ${errorDetails}`
|
|
292
|
+
: 'Invalid input';
|
|
293
|
+
logItem.error = errorMessage;
|
|
294
|
+
logItem.output = executionLog.output; // Keep the original output
|
|
295
|
+
// Copy the boundary data from the execution log
|
|
296
|
+
logItem.boundaries = executionLog.boundaries;
|
|
297
|
+
this.emit(logItem);
|
|
298
|
+
return [null, new Error(errorMessage), logItem];
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
let output = null;
|
|
302
|
+
let error = null;
|
|
303
|
+
try {
|
|
304
|
+
// Execute the task function with replay boundaries
|
|
305
|
+
output = await this._fn(argv, executionBoundaries);
|
|
306
|
+
logItem.output = output;
|
|
307
|
+
}
|
|
308
|
+
catch (caughtError) {
|
|
309
|
+
const errorMessage = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
|
310
|
+
logItem.error = errorMessage;
|
|
311
|
+
error = new Error(errorMessage);
|
|
312
|
+
}
|
|
313
|
+
// Process boundary data after execution
|
|
314
|
+
const boundariesRunLog = {};
|
|
315
|
+
for (const name in executionBoundaries) {
|
|
316
|
+
const boundary = executionBoundaries[name];
|
|
317
|
+
const runData = boundary.getRunData();
|
|
318
|
+
// For boundaries in replay mode, use the original log data instead
|
|
319
|
+
const mode = config.boundaries[name] || 'proxy';
|
|
320
|
+
if (mode === 'replay' && executionLog.boundaries[name]) {
|
|
321
|
+
boundariesRunLog[name] = executionLog.boundaries[name];
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
// For other modes, use the actual run data
|
|
325
|
+
boundariesRunLog[name] = runData;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Set boundaries in log item before emitting
|
|
329
|
+
logItem.boundaries = boundariesRunLog;
|
|
330
|
+
// Emit the log item
|
|
331
|
+
this.emit(logItem);
|
|
332
|
+
// Return the output, error, and log item
|
|
333
|
+
return [output, error, logItem];
|
|
334
|
+
}
|
|
249
335
|
async run(argv) {
|
|
250
336
|
const [result, error] = await this.safeRun(argv);
|
|
251
337
|
if (error) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-replay-complex-boundary.test.d.ts","sourceRoot":"","sources":["../../src/test/safe-replay-complex-boundary.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const schema_1 = require("@forgehive/schema");
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
describe('Complex boundary replay tests', () => {
|
|
6
|
+
// Test data
|
|
7
|
+
let priceData;
|
|
8
|
+
let portfolioData;
|
|
9
|
+
// Boundaries for the portfolio task
|
|
10
|
+
let boundaries;
|
|
11
|
+
// The task - using eslint-disable to allow any type for this test
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
let calculatePortfolioValue;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
// Setup mock data
|
|
16
|
+
priceData = {
|
|
17
|
+
'AAPL': 182.63,
|
|
18
|
+
'MSFT': 421.90,
|
|
19
|
+
'GOOGL': 171.04,
|
|
20
|
+
'AMZN': 184.72
|
|
21
|
+
};
|
|
22
|
+
portfolioData = {
|
|
23
|
+
'user1': {
|
|
24
|
+
id: 'portfolio1',
|
|
25
|
+
userId: 'user1',
|
|
26
|
+
stocks: [
|
|
27
|
+
{ ticker: 'AAPL', quantity: 10 },
|
|
28
|
+
{ ticker: 'MSFT', quantity: 5 },
|
|
29
|
+
{ ticker: 'GOOGL', quantity: 8 }
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
'user2': {
|
|
33
|
+
id: 'portfolio2',
|
|
34
|
+
userId: 'user2',
|
|
35
|
+
stocks: [
|
|
36
|
+
{ ticker: 'AMZN', quantity: 15 },
|
|
37
|
+
{ ticker: 'MSFT', quantity: 3 }
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// Define boundaries with realistic functions
|
|
42
|
+
boundaries = {
|
|
43
|
+
fetchPrice: async (ticker) => {
|
|
44
|
+
// Check if we have a price for this ticker
|
|
45
|
+
if (!priceData[ticker]) {
|
|
46
|
+
throw new Error(`Price data not available for ticker: ${ticker}`);
|
|
47
|
+
}
|
|
48
|
+
return priceData[ticker];
|
|
49
|
+
},
|
|
50
|
+
fetchPortfolio: async (userId) => {
|
|
51
|
+
// Check if we have a portfolio for this user
|
|
52
|
+
if (!portfolioData[userId]) {
|
|
53
|
+
throw new Error(`Portfolio not found for user: ${userId}`);
|
|
54
|
+
}
|
|
55
|
+
return portfolioData[userId];
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
// Create a schema for the task
|
|
59
|
+
const schema = new schema_1.Schema({
|
|
60
|
+
userId: schema_1.Schema.string()
|
|
61
|
+
});
|
|
62
|
+
// Create the portfolio value calculation task
|
|
63
|
+
calculatePortfolioValue = (0, index_1.createTask)(schema, boundaries, async ({ userId }, { fetchPortfolio, fetchPrice }) => {
|
|
64
|
+
// First fetch the portfolio for the user
|
|
65
|
+
const portfolio = await fetchPortfolio(userId);
|
|
66
|
+
// Then calculate the value of each stock and the total portfolio value
|
|
67
|
+
const stocksWithValue = await Promise.all(portfolio.stocks.map(async (stock) => {
|
|
68
|
+
const price = await fetchPrice(stock.ticker);
|
|
69
|
+
const value = price * stock.quantity;
|
|
70
|
+
return {
|
|
71
|
+
ticker: stock.ticker,
|
|
72
|
+
quantity: stock.quantity,
|
|
73
|
+
price,
|
|
74
|
+
value
|
|
75
|
+
};
|
|
76
|
+
}));
|
|
77
|
+
// Calculate total value
|
|
78
|
+
const totalValue = stocksWithValue.reduce((sum, stock) => sum + stock.value, 0);
|
|
79
|
+
// Return portfolio value information
|
|
80
|
+
return {
|
|
81
|
+
id: portfolio.id,
|
|
82
|
+
userId: portfolio.userId,
|
|
83
|
+
totalValue,
|
|
84
|
+
stocks: stocksWithValue
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
it('Should calculate portfolio value using multiple boundaries', async () => {
|
|
89
|
+
// Run the task for user1
|
|
90
|
+
const result = await calculatePortfolioValue.run({ userId: 'user1' });
|
|
91
|
+
// Verify the structure of the result
|
|
92
|
+
expect(result).toHaveProperty('id', 'portfolio1');
|
|
93
|
+
expect(result).toHaveProperty('userId', 'user1');
|
|
94
|
+
expect(result).toHaveProperty('totalValue');
|
|
95
|
+
expect(result).toHaveProperty('stocks');
|
|
96
|
+
// Verify portfolio calculations
|
|
97
|
+
expect(result.stocks).toHaveLength(3);
|
|
98
|
+
// Calculate expected values
|
|
99
|
+
const expectedTotalValue = (priceData['AAPL'] * 10) +
|
|
100
|
+
(priceData['MSFT'] * 5) +
|
|
101
|
+
(priceData['GOOGL'] * 8);
|
|
102
|
+
// Verify total value matches expected
|
|
103
|
+
expect(result.totalValue).toBeCloseTo(expectedTotalValue);
|
|
104
|
+
// Verify each stock's value
|
|
105
|
+
const applStock = result.stocks.find((s) => s.ticker === 'AAPL');
|
|
106
|
+
expect(applStock).toBeDefined();
|
|
107
|
+
expect(applStock === null || applStock === void 0 ? void 0 : applStock.price).toBe(priceData['AAPL']);
|
|
108
|
+
expect(applStock === null || applStock === void 0 ? void 0 : applStock.value).toBeCloseTo(priceData['AAPL'] * 10);
|
|
109
|
+
const msftStock = result.stocks.find((s) => s.ticker === 'MSFT');
|
|
110
|
+
expect(msftStock).toBeDefined();
|
|
111
|
+
expect(msftStock === null || msftStock === void 0 ? void 0 : msftStock.price).toBe(priceData['MSFT']);
|
|
112
|
+
expect(msftStock === null || msftStock === void 0 ? void 0 : msftStock.value).toBeCloseTo(priceData['MSFT'] * 5);
|
|
113
|
+
const googlStock = result.stocks.find((s) => s.ticker === 'GOOGL');
|
|
114
|
+
expect(googlStock).toBeDefined();
|
|
115
|
+
expect(googlStock === null || googlStock === void 0 ? void 0 : googlStock.price).toBe(priceData['GOOGL']);
|
|
116
|
+
expect(googlStock === null || googlStock === void 0 ? void 0 : googlStock.value).toBeCloseTo(priceData['GOOGL'] * 8);
|
|
117
|
+
});
|
|
118
|
+
it('Should replay portfolio calculation from an execution log', async () => {
|
|
119
|
+
// First create a portfolio value calculation execution log
|
|
120
|
+
const executionLog = {
|
|
121
|
+
input: { userId: 'user1' },
|
|
122
|
+
output: {
|
|
123
|
+
id: 'portfolio1',
|
|
124
|
+
userId: 'user1',
|
|
125
|
+
totalValue: 4363.02,
|
|
126
|
+
stocks: [
|
|
127
|
+
{ ticker: 'AAPL', quantity: 10, price: 190.50, value: 1905.00 },
|
|
128
|
+
{ ticker: 'MSFT', quantity: 5, price: 405.75, value: 2028.75 },
|
|
129
|
+
{ ticker: 'GOOGL', quantity: 8, price: 161.16, value: 429.27 }
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
boundaries: {
|
|
133
|
+
fetchPortfolio: [
|
|
134
|
+
{
|
|
135
|
+
input: ['user1'],
|
|
136
|
+
output: {
|
|
137
|
+
id: 'portfolio1',
|
|
138
|
+
userId: 'user1',
|
|
139
|
+
stocks: [
|
|
140
|
+
{ ticker: 'AAPL', quantity: 10 },
|
|
141
|
+
{ ticker: 'MSFT', quantity: 5 },
|
|
142
|
+
{ ticker: 'GOOGL', quantity: 8 }
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
],
|
|
147
|
+
fetchPrice: [
|
|
148
|
+
{
|
|
149
|
+
input: ['AAPL'],
|
|
150
|
+
output: 190.50
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
input: ['MSFT'],
|
|
154
|
+
output: 405.75
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
input: ['GOOGL'],
|
|
158
|
+
output: 161.16
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
// Use replay mode for all boundaries
|
|
164
|
+
const [replayResult, replayError, replayLog] = await calculatePortfolioValue.safeReplay(executionLog, {
|
|
165
|
+
boundaries: {
|
|
166
|
+
fetchPortfolio: 'replay',
|
|
167
|
+
fetchPrice: 'replay'
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
// Verify there was no error
|
|
171
|
+
expect(replayError).toBeNull();
|
|
172
|
+
// Verify the replayed result
|
|
173
|
+
expect(replayResult).toHaveProperty('id', 'portfolio1');
|
|
174
|
+
expect(replayResult).toHaveProperty('userId', 'user1');
|
|
175
|
+
expect(replayResult).toHaveProperty('totalValue', 5223.03);
|
|
176
|
+
expect(replayResult).toHaveProperty('stocks');
|
|
177
|
+
expect(replayResult.stocks).toHaveLength(3);
|
|
178
|
+
// Check values match the execution log exactly
|
|
179
|
+
const applStock = replayResult.stocks.find((s) => s.ticker === 'AAPL');
|
|
180
|
+
expect(applStock === null || applStock === void 0 ? void 0 : applStock.price).toBe(190.50);
|
|
181
|
+
expect(applStock === null || applStock === void 0 ? void 0 : applStock.value).toBe(1905.00);
|
|
182
|
+
// Verify that boundary calls were properly replayed
|
|
183
|
+
expect(replayLog.boundaries.fetchPortfolio).toHaveLength(1);
|
|
184
|
+
expect(replayLog.boundaries.fetchPrice).toHaveLength(3);
|
|
185
|
+
});
|
|
186
|
+
it('Should handle errors during replay', async () => {
|
|
187
|
+
// Create an execution log with an error in one of the price fetches
|
|
188
|
+
const executionLog = {
|
|
189
|
+
input: { userId: 'user1' },
|
|
190
|
+
error: 'Price data not available for ticker: GOOGL',
|
|
191
|
+
boundaries: {
|
|
192
|
+
fetchPortfolio: [
|
|
193
|
+
{
|
|
194
|
+
input: ['user1'],
|
|
195
|
+
output: {
|
|
196
|
+
id: 'portfolio1',
|
|
197
|
+
userId: 'user1',
|
|
198
|
+
stocks: [
|
|
199
|
+
{ ticker: 'AAPL', quantity: 10 },
|
|
200
|
+
{ ticker: 'MSFT', quantity: 5 },
|
|
201
|
+
{ ticker: 'GOOGL', quantity: 8 }
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
fetchPrice: [
|
|
207
|
+
{
|
|
208
|
+
input: ['AAPL'],
|
|
209
|
+
output: 190.50
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
input: ['MSFT'],
|
|
213
|
+
output: 405.75
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
input: ['GOOGL'],
|
|
217
|
+
error: 'Price data not available for ticker: GOOGL'
|
|
218
|
+
}
|
|
219
|
+
]
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
// Use replay mode for all boundaries
|
|
223
|
+
const [replayResult, replayError, replayLog] = await calculatePortfolioValue.safeReplay(executionLog, {
|
|
224
|
+
boundaries: {
|
|
225
|
+
fetchPortfolio: 'replay',
|
|
226
|
+
fetchPrice: 'replay'
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
// Verify error was properly replayed
|
|
230
|
+
expect(replayResult).toBeNull();
|
|
231
|
+
expect(replayError).not.toBeNull();
|
|
232
|
+
expect(replayError === null || replayError === void 0 ? void 0 : replayError.message).toBe('Price data not available for ticker: GOOGL');
|
|
233
|
+
// Verify that boundary calls were properly replayed up to the error
|
|
234
|
+
expect(replayLog.boundaries.fetchPortfolio).toHaveLength(1);
|
|
235
|
+
expect(replayLog.boundaries.fetchPrice).toHaveLength(3);
|
|
236
|
+
// Check the error in the boundary
|
|
237
|
+
const googPriceCall = replayLog.boundaries.fetchPrice.find((call) => call.input && call.input[0] === 'GOOGL');
|
|
238
|
+
expect(googPriceCall).toBeDefined();
|
|
239
|
+
expect(googPriceCall === null || googPriceCall === void 0 ? void 0 : googPriceCall.error).toBe('Price data not available for ticker: GOOGL');
|
|
240
|
+
});
|
|
241
|
+
it('Should support mixed replay with some boundaries in replay mode and others in proxy mode', async () => {
|
|
242
|
+
// Update prices for the test
|
|
243
|
+
priceData['AAPL'] = 195.00; // Different from replay data
|
|
244
|
+
// Create an execution log with historical data
|
|
245
|
+
const executionLog = {
|
|
246
|
+
input: { userId: 'user1' },
|
|
247
|
+
output: {
|
|
248
|
+
id: 'portfolio1',
|
|
249
|
+
userId: 'user1',
|
|
250
|
+
totalValue: 4363.02,
|
|
251
|
+
stocks: [
|
|
252
|
+
{ ticker: 'AAPL', quantity: 10, price: 190.50, value: 1905.00 },
|
|
253
|
+
{ ticker: 'MSFT', quantity: 5, price: 405.75, value: 2028.75 },
|
|
254
|
+
{ ticker: 'GOOGL', quantity: 8, price: 161.16, value: 429.27 }
|
|
255
|
+
]
|
|
256
|
+
},
|
|
257
|
+
boundaries: {
|
|
258
|
+
fetchPortfolio: [
|
|
259
|
+
{
|
|
260
|
+
input: ['user1'],
|
|
261
|
+
output: {
|
|
262
|
+
id: 'portfolio1',
|
|
263
|
+
userId: 'user1',
|
|
264
|
+
stocks: [
|
|
265
|
+
{ ticker: 'AAPL', quantity: 10 },
|
|
266
|
+
{ ticker: 'MSFT', quantity: 5 },
|
|
267
|
+
{ ticker: 'GOOGL', quantity: 8 }
|
|
268
|
+
]
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
],
|
|
272
|
+
fetchPrice: [
|
|
273
|
+
{
|
|
274
|
+
input: ['AAPL'],
|
|
275
|
+
output: 190.50
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
input: ['MSFT'],
|
|
279
|
+
output: 405.75
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
input: ['GOOGL'],
|
|
283
|
+
output: 161.16
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
// Use replay mode for portfolio but proxy mode for prices
|
|
289
|
+
const [replayResult, replayError, replayLog] = await calculatePortfolioValue.safeReplay(executionLog, {
|
|
290
|
+
boundaries: {
|
|
291
|
+
fetchPortfolio: 'replay', // Use replay for portfolio
|
|
292
|
+
fetchPrice: 'proxy' // Use proxy (real execution) for prices
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
// Verify there was no error
|
|
296
|
+
expect(replayError).toBeNull();
|
|
297
|
+
// The result should reflect the updated AAPL price of 195.00
|
|
298
|
+
expect(replayResult).toHaveProperty('id', 'portfolio1');
|
|
299
|
+
expect(replayResult).toHaveProperty('userId', 'user1');
|
|
300
|
+
// Calculate expected value with current prices
|
|
301
|
+
const expectedValue = (priceData['AAPL'] * 10) + // AAPL: 195.00 * 10
|
|
302
|
+
(priceData['MSFT'] * 5) + // MSFT: 421.90 * 5
|
|
303
|
+
(priceData['GOOGL'] * 8); // GOOGL: 171.04 * 8
|
|
304
|
+
expect(replayResult.totalValue).toBeCloseTo(expectedValue);
|
|
305
|
+
// Check AAPL price reflects the current price, not the replay data
|
|
306
|
+
const applStock = replayResult.stocks.find((s) => s.ticker === 'AAPL');
|
|
307
|
+
expect(applStock === null || applStock === void 0 ? void 0 : applStock.price).toBe(195.00);
|
|
308
|
+
expect(applStock === null || applStock === void 0 ? void 0 : applStock.value).toBeCloseTo(195.00 * 10);
|
|
309
|
+
// Verify the log shows the mixed sources correctly
|
|
310
|
+
expect(replayLog.boundaries.fetchPortfolio).toHaveLength(1);
|
|
311
|
+
expect(replayLog.boundaries.fetchPrice).toHaveLength(3);
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
//# sourceMappingURL=safe-replay-complex-boundary.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-replay-complex-boundary.test.js","sourceRoot":"","sources":["../../src/test/safe-replay-complex-boundary.test.ts"],"names":[],"mappings":"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"}
|