@forgehive/task 0.1.5 → 0.1.7
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 +50 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -80
- package/dist/index.js.map +1 -1
- package/dist/test/safe-run.test.d.ts +2 -0
- package/dist/test/safe-run.test.d.ts.map +1 -0
- package/dist/test/safe-run.test.js +185 -0
- package/dist/test/safe-run.test.js.map +1 -0
- package/dist/test/task-boundary-mocking.test.d.ts +2 -0
- package/dist/test/task-boundary-mocking.test.d.ts.map +1 -0
- package/dist/test/task-boundary-mocking.test.js +87 -0
- package/dist/test/task-boundary-mocking.test.js.map +1 -0
- package/dist/test/task-with-boundaries.test.js +135 -0
- package/dist/test/task-with-boundaries.test.js.map +1 -1
- package/dist/utils/mock.d.ts +17 -0
- package/dist/utils/mock.d.ts.map +1 -0
- package/dist/utils/mock.js +34 -0
- package/dist/utils/mock.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +206 -100
- package/src/test/safe-run.test.ts +241 -0
- package/src/test/task-boundary-mocking.test.ts +116 -0
- package/src/test/task-with-boundaries.test.ts +198 -1
- package/src/utils/mock.ts +45 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema, type SchemaType, type InferSchema, type SchemaDescription } from '@forgehive/schema';
|
|
2
|
-
import { type Mode, type Boundaries, type WrappedBoundaries } from './utils/boundary';
|
|
2
|
+
import { type Mode, type Boundaries, type WrappedBoundaries, type WrappedBoundaryFunction } from './utils/boundary';
|
|
3
3
|
export interface Task {
|
|
4
4
|
id: string;
|
|
5
5
|
title: string;
|
|
@@ -27,7 +27,29 @@ export interface TaskRecord<InputType = unknown, OutputType = unknown> {
|
|
|
27
27
|
/** Boundary execution data */
|
|
28
28
|
boundaries?: Record<string, unknown>;
|
|
29
29
|
}
|
|
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 BoundaryLogsFor<B extends Boundaries> = {
|
|
36
|
+
[K in keyof B]: B[K] extends (...args: infer I) => Promise<infer O> ? BoundaryLog<I, O>[] : BoundaryLog[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Represents the execution record of a task, including input, output, error, and boundary data
|
|
40
|
+
*/
|
|
41
|
+
export interface ExecutionRecord<InputType = unknown, OutputType = unknown, B extends Boundaries = Boundaries> {
|
|
42
|
+
/** The input arguments passed to the task */
|
|
43
|
+
input: InputType;
|
|
44
|
+
/** The output returned by the task (if successful) */
|
|
45
|
+
output?: OutputType | null;
|
|
46
|
+
/** The error message if the task failed */
|
|
47
|
+
error?: string;
|
|
48
|
+
/** Boundary execution data */
|
|
49
|
+
boundaries: BoundaryLogsFor<B>;
|
|
50
|
+
}
|
|
30
51
|
export interface TaskInstanceType<Func extends BaseFunction = BaseFunction, B extends Boundaries = Boundaries> {
|
|
52
|
+
version: string;
|
|
31
53
|
getMode: () => Mode;
|
|
32
54
|
setMode: (mode: Mode) => void;
|
|
33
55
|
setSchema: (base: Schema<Record<string, SchemaType>>) => void;
|
|
@@ -44,21 +66,29 @@ export interface TaskInstanceType<Func extends BaseFunction = BaseFunction, B ex
|
|
|
44
66
|
getBoundaries: () => WrappedBoundaries<B>;
|
|
45
67
|
setBoundariesData: (boundariesData: Record<string, unknown>) => void;
|
|
46
68
|
getBondariesData: () => Record<string, unknown>;
|
|
47
|
-
|
|
48
|
-
|
|
69
|
+
mockBoundary: <K extends keyof B>(name: K, mockFn: WrappedBoundaryFunction) => void;
|
|
70
|
+
resetMock: <K extends keyof B>(name: K) => void;
|
|
71
|
+
resetMocks: () => void;
|
|
49
72
|
run: (argv?: Parameters<Func>[0]) => Promise<ReturnType<Func>>;
|
|
73
|
+
safeRun: (argv?: Parameters<Func>[0]) => Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>;
|
|
50
74
|
}
|
|
51
75
|
export type InferSchemaType<S> = S extends Schema<any> ? InferSchema<S> : Record<string, unknown>;
|
|
52
76
|
export type TaskFunction<S, B extends Boundaries> = (argv: InferSchemaType<S>, boundaries: WrappedBoundaries<B>) => Promise<any>;
|
|
77
|
+
type BoundaryData = Array<{
|
|
78
|
+
input: unknown[];
|
|
79
|
+
output?: unknown;
|
|
80
|
+
}>;
|
|
53
81
|
export declare const Task: {
|
|
54
82
|
new <B extends Boundaries = Boundaries, Func extends BaseFunction = BaseFunction>(fn: Func, conf?: TaskConfig<B>): {
|
|
83
|
+
version: string;
|
|
55
84
|
_fn: Func;
|
|
56
85
|
_mode: Mode;
|
|
57
86
|
_coolDown: number;
|
|
58
87
|
_description?: string;
|
|
59
88
|
_boundariesDefinition: B;
|
|
60
|
-
_boundaries: WrappedBoundaries<B>;
|
|
61
89
|
_boundariesData: Record<string, unknown> | null;
|
|
90
|
+
_accumulatedBoundariesData: Record<string, BoundaryData>;
|
|
91
|
+
_boundaryMocks: Record<string, WrappedBoundaryFunction>;
|
|
62
92
|
_schema: Schema<Record<string, SchemaType>> | undefined;
|
|
63
93
|
_listener?: ((record: TaskRecord<Parameters<Func>[0], ReturnType<Func>>) => void) | undefined;
|
|
64
94
|
getMode(): Mode;
|
|
@@ -76,14 +106,28 @@ export declare const Task: {
|
|
|
76
106
|
getBoundaries(): WrappedBoundaries<B>;
|
|
77
107
|
setBoundariesData(boundariesData: Record<string, unknown>): void;
|
|
78
108
|
getBondariesData(): Record<string, unknown>;
|
|
109
|
+
/**
|
|
110
|
+
* Mocks a specific boundary function for testing
|
|
111
|
+
* @param name The name of the boundary to mock
|
|
112
|
+
* @param mockFn The mock function to use
|
|
113
|
+
*/
|
|
114
|
+
mockBoundary<K extends keyof B>(name: K, mockFn: WrappedBoundaryFunction): void;
|
|
115
|
+
/**
|
|
116
|
+
* Resets a specific mocked boundary back to its original function
|
|
117
|
+
* @param name The name of the boundary to reset
|
|
118
|
+
*/
|
|
119
|
+
resetMock<K extends keyof B>(name: K): void;
|
|
120
|
+
/**
|
|
121
|
+
* Resets all mocked boundaries back to their original functions
|
|
122
|
+
*/
|
|
123
|
+
resetMocks(): void;
|
|
79
124
|
_createBounderies({ definition, baseData, mode }: {
|
|
80
125
|
definition: B;
|
|
81
126
|
baseData: Record<string, unknown> | null;
|
|
82
127
|
mode?: Mode;
|
|
83
128
|
}): WrappedBoundaries<B>;
|
|
84
|
-
getBondariesRunLog(): Record<string, unknown>;
|
|
85
|
-
startRunLog(): void;
|
|
86
129
|
asBoundary(): (args: Parameters<Func>[0]) => Promise<ReturnType<Func>>;
|
|
130
|
+
safeRun(argv?: Parameters<Func>[0]): Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>;
|
|
87
131
|
run(argv?: Parameters<Func>[0]): Promise<ReturnType<Func>>;
|
|
88
132
|
};
|
|
89
133
|
};
|
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,EAAkB,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,10 @@ const Task = class Task {
|
|
|
13
13
|
boundariesData: undefined
|
|
14
14
|
}) {
|
|
15
15
|
var _a, _b, _c;
|
|
16
|
+
this.version = '0.1.7';
|
|
17
|
+
this._accumulatedBoundariesData = {};
|
|
18
|
+
// For storing mocks
|
|
19
|
+
this._boundaryMocks = {};
|
|
16
20
|
this._fn = fn;
|
|
17
21
|
this._schema = undefined;
|
|
18
22
|
if (typeof conf.schema !== 'undefined') {
|
|
@@ -23,22 +27,29 @@ const Task = class Task {
|
|
|
23
27
|
this._listener = undefined;
|
|
24
28
|
// Cool down time before killing the process on cli runner
|
|
25
29
|
this._coolDown = 1000;
|
|
26
|
-
//
|
|
30
|
+
// Initialize boundaries data
|
|
27
31
|
this._boundariesData = (_c = conf.boundariesData) !== null && _c !== void 0 ? _c : null;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
// Initialize empty accumulated boundaries data structure
|
|
33
|
+
for (const name in this._boundariesDefinition) {
|
|
34
|
+
this._accumulatedBoundariesData[name] = [];
|
|
35
|
+
}
|
|
36
|
+
// Initialize accumulated boundaries data from initial boundaries data
|
|
37
|
+
if (this._boundariesData) {
|
|
38
|
+
// Type assertion to handle initial data safely
|
|
39
|
+
for (const name in this._boundariesData) {
|
|
40
|
+
if (Array.isArray(this._boundariesData[name])) {
|
|
41
|
+
this._accumulatedBoundariesData[name] = this._boundariesData[name];
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this._accumulatedBoundariesData[name] = [];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
33
48
|
}
|
|
34
49
|
getMode() {
|
|
35
50
|
return this._mode;
|
|
36
51
|
}
|
|
37
52
|
setMode(mode) {
|
|
38
|
-
for (const name in this._boundaries) {
|
|
39
|
-
const boundary = this._boundaries[name];
|
|
40
|
-
boundary.setMode(mode);
|
|
41
|
-
}
|
|
42
53
|
this._mode = mode;
|
|
43
54
|
}
|
|
44
55
|
setSchema(schema) {
|
|
@@ -87,37 +98,64 @@ const Task = class Task {
|
|
|
87
98
|
if (typeof this._listener === 'undefined') {
|
|
88
99
|
return;
|
|
89
100
|
}
|
|
90
|
-
|
|
91
|
-
this._listener(event);
|
|
101
|
+
this._listener(data);
|
|
92
102
|
}
|
|
93
103
|
getBoundaries() {
|
|
94
|
-
|
|
104
|
+
// Create fresh boundaries when requested
|
|
105
|
+
return this._createBounderies({
|
|
106
|
+
definition: this._boundariesDefinition,
|
|
107
|
+
baseData: this._boundariesData,
|
|
108
|
+
mode: this._mode
|
|
109
|
+
});
|
|
95
110
|
}
|
|
96
111
|
setBoundariesData(boundariesData) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
112
|
+
this._boundariesData = boundariesData;
|
|
113
|
+
// Update accumulated data as well
|
|
114
|
+
// Type assertion to handle provided data safely
|
|
115
|
+
for (const name in boundariesData) {
|
|
116
|
+
if (Array.isArray(boundariesData[name])) {
|
|
117
|
+
this._accumulatedBoundariesData[name] = boundariesData[name];
|
|
102
118
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
boundary.setTape(tape);
|
|
119
|
+
else {
|
|
120
|
+
this._accumulatedBoundariesData[name] = [];
|
|
106
121
|
}
|
|
107
122
|
}
|
|
108
123
|
}
|
|
109
124
|
getBondariesData() {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
125
|
+
return this._accumulatedBoundariesData;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Mocks a specific boundary function for testing
|
|
129
|
+
* @param name The name of the boundary to mock
|
|
130
|
+
* @param mockFn The mock function to use
|
|
131
|
+
*/
|
|
132
|
+
mockBoundary(name, mockFn) {
|
|
133
|
+
this._boundaryMocks[name] = mockFn;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Resets a specific mocked boundary back to its original function
|
|
137
|
+
* @param name The name of the boundary to reset
|
|
138
|
+
*/
|
|
139
|
+
resetMock(name) {
|
|
140
|
+
if (this._boundaryMocks[name]) {
|
|
141
|
+
delete this._boundaryMocks[name];
|
|
115
142
|
}
|
|
116
|
-
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Resets all mocked boundaries back to their original functions
|
|
146
|
+
*/
|
|
147
|
+
resetMocks() {
|
|
148
|
+
this._boundaryMocks = {};
|
|
117
149
|
}
|
|
118
150
|
_createBounderies({ definition, baseData, mode = 'proxy' }) {
|
|
119
151
|
const boundariesFns = {};
|
|
120
152
|
for (const name in definition) {
|
|
153
|
+
// Check if we have a mock for this boundary
|
|
154
|
+
if (this._boundaryMocks[name]) {
|
|
155
|
+
boundariesFns[name] = this._boundaryMocks[name];
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
// Otherwise create the normal boundary
|
|
121
159
|
const boundary = (0, boundary_1.createBoundary)(definition[name]);
|
|
122
160
|
if (baseData !== null && typeof baseData[name] !== 'undefined') {
|
|
123
161
|
const tape = baseData[name];
|
|
@@ -129,66 +167,90 @@ const Task = class Task {
|
|
|
129
167
|
}
|
|
130
168
|
return boundariesFns;
|
|
131
169
|
}
|
|
132
|
-
getBondariesRunLog() {
|
|
133
|
-
const boundaries = this._boundaries;
|
|
134
|
-
const boundariesRunLog = {};
|
|
135
|
-
for (const name in boundaries) {
|
|
136
|
-
const boundary = boundaries[name];
|
|
137
|
-
boundariesRunLog[name] = boundary.getRunData();
|
|
138
|
-
}
|
|
139
|
-
return boundariesRunLog;
|
|
140
|
-
}
|
|
141
|
-
startRunLog() {
|
|
142
|
-
const boundaries = this._boundaries;
|
|
143
|
-
for (const name in boundaries) {
|
|
144
|
-
const boundary = boundaries[name];
|
|
145
|
-
boundary.startRun();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
170
|
asBoundary() {
|
|
149
171
|
return async (args) => {
|
|
150
172
|
return await this.run(args);
|
|
151
173
|
};
|
|
152
174
|
}
|
|
153
|
-
async
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
175
|
+
async safeRun(argv) {
|
|
176
|
+
var _a;
|
|
177
|
+
// Initialize log item
|
|
178
|
+
const logItem = {
|
|
179
|
+
input: argv,
|
|
180
|
+
boundaries: {}
|
|
181
|
+
};
|
|
182
|
+
// Create fresh boundaries for this execution
|
|
183
|
+
const executionBoundaries = this._createBounderies({
|
|
184
|
+
definition: this._boundariesDefinition,
|
|
185
|
+
baseData: this._boundariesData,
|
|
186
|
+
mode: this._mode
|
|
187
|
+
});
|
|
188
|
+
// Start run for each boundary
|
|
189
|
+
for (const name in executionBoundaries) {
|
|
190
|
+
const boundary = executionBoundaries[name];
|
|
191
|
+
boundary.startRun();
|
|
192
|
+
}
|
|
193
|
+
// Handle schema validation
|
|
194
|
+
if (this._schema) {
|
|
195
|
+
const validation = this._schema.safeParse(argv);
|
|
196
|
+
if (!validation.success) {
|
|
197
|
+
const errorDetails = (_a = validation.error) === null || _a === void 0 ? void 0 : _a.errors.map(err => `${err.path.join('.')}: ${err.message}`).join(', ');
|
|
198
|
+
const errorMessage = errorDetails
|
|
199
|
+
? `Invalid input on: ${errorDetails}`
|
|
200
|
+
: 'Invalid input';
|
|
201
|
+
logItem.error = errorMessage;
|
|
202
|
+
logItem.boundaries = {};
|
|
203
|
+
// Add boundary elements empty
|
|
204
|
+
for (const name in executionBoundaries) {
|
|
205
|
+
logItem.boundaries[name] = [];
|
|
171
206
|
}
|
|
207
|
+
this.emit(logItem);
|
|
208
|
+
return [null, new Error(errorMessage), logItem];
|
|
172
209
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
210
|
+
}
|
|
211
|
+
let output = null;
|
|
212
|
+
let error = null;
|
|
213
|
+
try {
|
|
214
|
+
// Execute the task function
|
|
215
|
+
output = await this._fn(argv, executionBoundaries);
|
|
216
|
+
logItem.output = output;
|
|
217
|
+
}
|
|
218
|
+
catch (caughtError) {
|
|
219
|
+
const errorMessage = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
|
220
|
+
logItem.error = errorMessage;
|
|
221
|
+
error = new Error(errorMessage);
|
|
222
|
+
}
|
|
223
|
+
// Process boundary data after execution (both success and error cases)
|
|
224
|
+
const boundariesRunLog = {};
|
|
225
|
+
for (const name in executionBoundaries) {
|
|
226
|
+
const boundary = executionBoundaries[name];
|
|
227
|
+
const runData = boundary.getRunData();
|
|
228
|
+
// Add to the run log
|
|
229
|
+
boundariesRunLog[name] = runData;
|
|
230
|
+
// Accumulate in the task's total boundaries data
|
|
231
|
+
if (!this._accumulatedBoundariesData[name]) {
|
|
232
|
+
this._accumulatedBoundariesData[name] = [];
|
|
233
|
+
}
|
|
234
|
+
// Get the current accumulated data for this boundary
|
|
235
|
+
const currentData = this._accumulatedBoundariesData[name];
|
|
236
|
+
// Add the new run data
|
|
237
|
+
if (Array.isArray(runData) && runData.length > 0) {
|
|
238
|
+
// Cast the run data to the correct type
|
|
239
|
+
this._accumulatedBoundariesData[name] = [...currentData, ...runData];
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Set boundaries in log item before emitting
|
|
243
|
+
logItem.boundaries = boundariesRunLog;
|
|
244
|
+
// Emit the log item
|
|
245
|
+
this.emit(logItem);
|
|
246
|
+
// Return the error, output and log item
|
|
247
|
+
return [output, error, logItem];
|
|
248
|
+
}
|
|
249
|
+
async run(argv) {
|
|
250
|
+
const [result, error] = await this.safeRun(argv);
|
|
251
|
+
if (error) {
|
|
252
|
+
throw error;
|
|
253
|
+
}
|
|
192
254
|
return result;
|
|
193
255
|
}
|
|
194
256
|
};
|
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-run.test.d.ts","sourceRoot":"","sources":["../../src/test/safe-run.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("../index");
|
|
4
|
+
describe('Task safeRun tests', () => {
|
|
5
|
+
it('returns [result, null, record] on successful execution', async () => {
|
|
6
|
+
// Create a simple schema
|
|
7
|
+
const schema = new index_1.Schema({
|
|
8
|
+
value: index_1.Schema.number()
|
|
9
|
+
});
|
|
10
|
+
// Define the boundaries
|
|
11
|
+
const boundaries = {
|
|
12
|
+
fetchData: async (value) => {
|
|
13
|
+
return value * 2;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
// Create the task
|
|
17
|
+
const successTask = (0, index_1.createTask)(schema, boundaries, async function ({ value }, { fetchData }) {
|
|
18
|
+
const result = await fetchData(value);
|
|
19
|
+
return { result, success: true };
|
|
20
|
+
});
|
|
21
|
+
// Call safeRun with valid input
|
|
22
|
+
const [result, error, record] = await successTask.safeRun({ value: 5 });
|
|
23
|
+
// Verify success case
|
|
24
|
+
expect(error).toBeNull();
|
|
25
|
+
expect(result).toEqual({ result: 10, success: true });
|
|
26
|
+
expect(record).not.toBeNull();
|
|
27
|
+
expect(record).toHaveProperty('boundaries.fetchData');
|
|
28
|
+
expect(record.boundaries.fetchData).toHaveLength(1);
|
|
29
|
+
// useful to check types on record
|
|
30
|
+
const data = record.boundaries.fetchData[0];
|
|
31
|
+
expect(data.input).toEqual([5]);
|
|
32
|
+
expect(data.output).toEqual(10);
|
|
33
|
+
expect(data.error).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
it('returns [null, error, record] on failed execution', async () => {
|
|
36
|
+
// Create a simple schema
|
|
37
|
+
const schema = new index_1.Schema({
|
|
38
|
+
value: index_1.Schema.number()
|
|
39
|
+
});
|
|
40
|
+
// Define the boundaries with a function that will throw an error
|
|
41
|
+
const boundaries = {
|
|
42
|
+
fetchData: async (value) => {
|
|
43
|
+
if (value < 0) {
|
|
44
|
+
throw new Error('Value cannot be negative');
|
|
45
|
+
}
|
|
46
|
+
return value * 2;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
// Create the task
|
|
50
|
+
const errorTask = (0, index_1.createTask)(schema, boundaries, async function ({ value }, { fetchData }) {
|
|
51
|
+
const result = await fetchData(value);
|
|
52
|
+
return { result, success: true };
|
|
53
|
+
});
|
|
54
|
+
// Call safeRun with problematic input that will cause an error
|
|
55
|
+
const [result, error, record] = await errorTask.safeRun({ value: -5 });
|
|
56
|
+
// Verify error case
|
|
57
|
+
expect(error).not.toBeNull();
|
|
58
|
+
expect(error instanceof Error).toBe(true);
|
|
59
|
+
if (error instanceof Error) {
|
|
60
|
+
expect(error.message).toContain('Value cannot be negative');
|
|
61
|
+
}
|
|
62
|
+
expect(result).toBeNull();
|
|
63
|
+
expect(record).not.toBeNull();
|
|
64
|
+
expect(record).toHaveProperty('boundaries.fetchData');
|
|
65
|
+
expect(record.boundaries.fetchData).toHaveLength(1);
|
|
66
|
+
const data = record.boundaries.fetchData[0];
|
|
67
|
+
expect(data.input).toEqual([-5]);
|
|
68
|
+
expect(data.error).toContain('Value cannot be negative');
|
|
69
|
+
expect(data.output).toBeUndefined();
|
|
70
|
+
});
|
|
71
|
+
it('returns [null, error, record] on schema validation failure', async () => {
|
|
72
|
+
// Create a schema that requires a positive number
|
|
73
|
+
const schema = new index_1.Schema({
|
|
74
|
+
value: index_1.Schema.number().min(1, 'Value must be positive')
|
|
75
|
+
});
|
|
76
|
+
// Define the boundaries
|
|
77
|
+
const boundaries = {
|
|
78
|
+
fetchData: async (value) => {
|
|
79
|
+
return value * 2;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
// Create the task
|
|
83
|
+
const validationTask = (0, index_1.createTask)(schema, boundaries, async function ({ value }, { fetchData }) {
|
|
84
|
+
const result = await fetchData(value);
|
|
85
|
+
return { result, success: true };
|
|
86
|
+
});
|
|
87
|
+
// Call safeRun with invalid input that will fail schema validation
|
|
88
|
+
const [result, error, record] = await validationTask.safeRun({ value: 0 });
|
|
89
|
+
// Verify validation error case
|
|
90
|
+
expect(error).toBeInstanceOf(Error);
|
|
91
|
+
expect(error instanceof Error).toBe(true);
|
|
92
|
+
if (error instanceof Error) {
|
|
93
|
+
expect(error.message).toContain('Value must be positive');
|
|
94
|
+
}
|
|
95
|
+
expect(result).toBeNull();
|
|
96
|
+
expect(record).not.toBeNull();
|
|
97
|
+
expect(record.input).toEqual({ value: 0 });
|
|
98
|
+
expect(record.error).toContain('Value must be positive');
|
|
99
|
+
expect(record.boundaries).toEqual({
|
|
100
|
+
fetchData: []
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
it('properly calls the listener with safeRun and run', async () => {
|
|
104
|
+
// Create a schema
|
|
105
|
+
const schema = new index_1.Schema({
|
|
106
|
+
value: index_1.Schema.number()
|
|
107
|
+
});
|
|
108
|
+
// Define the boundaries
|
|
109
|
+
const boundaries = {
|
|
110
|
+
fetchData: async (value) => {
|
|
111
|
+
return value * 2;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
// Create the task
|
|
115
|
+
const listenerTask = (0, index_1.createTask)(schema, boundaries, async function ({ value }, { fetchData }) {
|
|
116
|
+
const result = await fetchData(value);
|
|
117
|
+
return result;
|
|
118
|
+
});
|
|
119
|
+
// Create a mock listener
|
|
120
|
+
const originalListener = jest.fn();
|
|
121
|
+
listenerTask.addListener(originalListener);
|
|
122
|
+
// Call safeRun - this should call the listener once
|
|
123
|
+
await listenerTask.safeRun({ value: 10 });
|
|
124
|
+
// Run the task normally - this should call the listener again through safeRun
|
|
125
|
+
await listenerTask.run({ value: 20 });
|
|
126
|
+
// The original listener should have been called for both runs
|
|
127
|
+
expect(originalListener).toHaveBeenCalledTimes(2);
|
|
128
|
+
// First call should be for safeRun with value 10
|
|
129
|
+
expect(originalListener).toHaveBeenNthCalledWith(1, expect.objectContaining({
|
|
130
|
+
input: { value: 10 },
|
|
131
|
+
output: 20,
|
|
132
|
+
boundaries: {
|
|
133
|
+
fetchData: expect.any(Array)
|
|
134
|
+
}
|
|
135
|
+
}));
|
|
136
|
+
// Second call should be for run with value 20
|
|
137
|
+
expect(originalListener).toHaveBeenNthCalledWith(2, expect.objectContaining({
|
|
138
|
+
input: { value: 20 },
|
|
139
|
+
output: 40,
|
|
140
|
+
boundaries: {
|
|
141
|
+
fetchData: expect.any(Array)
|
|
142
|
+
}
|
|
143
|
+
}));
|
|
144
|
+
});
|
|
145
|
+
it('handles multiple boundary calls correctly', async () => {
|
|
146
|
+
// Create a schema
|
|
147
|
+
const schema = new index_1.Schema({
|
|
148
|
+
values: index_1.Schema.array(index_1.Schema.number())
|
|
149
|
+
});
|
|
150
|
+
// Define multiple boundaries
|
|
151
|
+
const boundaries = {
|
|
152
|
+
doubleValue: async (value) => {
|
|
153
|
+
return value * 2;
|
|
154
|
+
},
|
|
155
|
+
sumValues: async (values) => {
|
|
156
|
+
return values.reduce((sum, val) => sum + val, 0);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
// Create a task that uses multiple boundaries
|
|
160
|
+
const multiBoundaryTask = (0, index_1.createTask)(schema, boundaries, async function ({ values }, { doubleValue, sumValues }) {
|
|
161
|
+
const doubled = await Promise.all(values.map(value => doubleValue(value)));
|
|
162
|
+
const total = await sumValues(doubled);
|
|
163
|
+
return { doubled, total };
|
|
164
|
+
});
|
|
165
|
+
// Call safeRun
|
|
166
|
+
const [result, error, record] = await multiBoundaryTask.safeRun({ values: [1, 2, 3] });
|
|
167
|
+
// Verify success
|
|
168
|
+
expect(error).toBeNull();
|
|
169
|
+
expect(result).toEqual({
|
|
170
|
+
doubled: [2, 4, 6],
|
|
171
|
+
total: 12
|
|
172
|
+
});
|
|
173
|
+
// Verify record structure
|
|
174
|
+
expect(record).not.toBeNull();
|
|
175
|
+
expect(record).toHaveProperty('boundaries.doubleValue');
|
|
176
|
+
expect(record).toHaveProperty('boundaries.sumValues');
|
|
177
|
+
expect(record.boundaries.doubleValue).toHaveLength(3);
|
|
178
|
+
expect(record.boundaries.sumValues).toHaveLength(1);
|
|
179
|
+
expect(record.boundaries.doubleValue[0]).toEqual({ input: [1], output: 2 });
|
|
180
|
+
expect(record.boundaries.doubleValue[1]).toEqual({ input: [2], output: 4 });
|
|
181
|
+
expect(record.boundaries.doubleValue[2]).toEqual({ input: [3], output: 6 });
|
|
182
|
+
expect(record.boundaries.sumValues[0]).toEqual({ input: [[2, 4, 6]], output: 12 });
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
//# sourceMappingURL=safe-run.test.js.map
|