@t4h.framework/core 0.6.1 → 0.8.0
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/.ai/skills/framework-core/SKILL.md +103 -287
- package/.ai/skills/framework-workflow-creation/SKILL.md +108 -60
- package/.ai/skills/framework-workflow-testing/SKILL.md +165 -111
- package/README.md +123 -37
- package/dist/models/AsyncActivity.d.ts +1 -0
- package/dist/models/AsyncActivity.d.ts.map +1 -1
- package/dist/models/AsyncActivity.js +1 -0
- package/dist/models/AsyncActivity.js.map +1 -1
- package/dist/models/History.d.ts +1 -0
- package/dist/models/History.d.ts.map +1 -1
- package/dist/models/History.js +3 -0
- package/dist/models/History.js.map +1 -1
- package/dist/models/SyncActivity.d.ts +1 -0
- package/dist/models/SyncActivity.d.ts.map +1 -1
- package/dist/models/SyncActivity.js +1 -0
- package/dist/models/SyncActivity.js.map +1 -1
- package/dist/testing/ActivityTesting.d.ts +1 -1
- package/dist/testing/ActivityTesting.d.ts.map +1 -1
- package/dist/testing/ActivityTesting.js.map +1 -1
- package/dist/testing/TestClock.d.ts.map +1 -1
- package/dist/testing/TestClock.js +1 -2
- package/dist/testing/TestClock.js.map +1 -1
- package/dist/testing/TestWorkflowEnvironment.d.ts +6 -18
- package/dist/testing/TestWorkflowEnvironment.d.ts.map +1 -1
- package/dist/testing/TestWorkflowEnvironment.js +35 -93
- package/dist/testing/TestWorkflowEnvironment.js.map +1 -1
- package/dist/testing/WorkflowTesting.d.ts +1 -1
- package/dist/testing/async-activity-results.d.ts +12 -0
- package/dist/testing/async-activity-results.d.ts.map +1 -0
- package/dist/testing/async-activity-results.js +10 -0
- package/dist/testing/async-activity-results.js.map +1 -0
- package/dist/testing/create-mock-claim.d.ts +11 -5
- package/dist/testing/create-mock-claims.d.ts +12 -8
- package/dist/testing/create-test-env.d.ts +10 -4
- package/dist/testing/exceptions/NonDeterministicWorkflowError.d.ts +4 -0
- package/dist/testing/exceptions/NonDeterministicWorkflowError.d.ts.map +1 -0
- package/dist/testing/exceptions/NonDeterministicWorkflowError.js +7 -0
- package/dist/testing/exceptions/NonDeterministicWorkflowError.js.map +1 -0
- package/dist/testing/index.d.ts +8 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +8 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/mock-async.d.ts +48 -0
- package/dist/testing/mock-async.d.ts.map +1 -0
- package/dist/testing/mock-async.js +58 -0
- package/dist/testing/mock-async.js.map +1 -0
- package/dist/testing/outcomes.d.ts +12 -0
- package/dist/testing/outcomes.d.ts.map +1 -0
- package/dist/testing/outcomes.js +10 -0
- package/dist/testing/outcomes.js.map +1 -0
- package/dist/testing/run-workflow.d.ts +22 -21
- package/dist/testing/run-workflow.d.ts.map +1 -1
- package/dist/testing/run-workflow.js +91 -33
- package/dist/testing/run-workflow.js.map +1 -1
- package/dist/testing/tools/create-mock-claim.d.ts +5 -0
- package/dist/testing/tools/create-mock-claim.d.ts.map +1 -0
- package/dist/testing/tools/create-mock-claim.js +26 -0
- package/dist/testing/tools/create-mock-claim.js.map +1 -0
- package/dist/testing/tools/create-mock-claims.d.ts +8 -0
- package/dist/testing/tools/create-mock-claims.d.ts.map +1 -0
- package/dist/testing/tools/create-mock-claims.js +5 -0
- package/dist/testing/tools/create-mock-claims.js.map +1 -0
- package/dist/testing/tools/create-test-env.d.ts +4 -0
- package/dist/testing/tools/create-test-env.d.ts.map +1 -0
- package/dist/testing/tools/create-test-env.js +7 -0
- package/dist/testing/tools/create-test-env.js.map +1 -0
- package/dist/testing/tools/mock-async.d.ts +20 -0
- package/dist/testing/tools/mock-async.d.ts.map +1 -0
- package/dist/testing/tools/mock-async.js +57 -0
- package/dist/testing/tools/mock-async.js.map +1 -0
- package/dist/testing/tools/resolve-activity.d.ts +11 -0
- package/dist/testing/tools/resolve-activity.d.ts.map +1 -0
- package/dist/testing/tools/resolve-activity.js +23 -0
- package/dist/testing/tools/resolve-activity.js.map +1 -0
- package/dist/testing/tools/resolve-async-activity.d.ts +15 -0
- package/dist/testing/tools/resolve-async-activity.d.ts.map +1 -0
- package/dist/testing/tools/resolve-async-activity.js +69 -0
- package/dist/testing/tools/resolve-async-activity.js.map +1 -0
- package/dist/testing/tools/run-with-clock.d.ts +3 -0
- package/dist/testing/tools/run-with-clock.d.ts.map +1 -0
- package/dist/testing/tools/run-with-clock.js +7 -0
- package/dist/testing/tools/run-with-clock.js.map +1 -0
- package/dist/testing/tools/run-workflow-ticks.d.ts +8 -0
- package/dist/testing/tools/run-workflow-ticks.d.ts.map +1 -0
- package/dist/testing/tools/run-workflow-ticks.js +26 -0
- package/dist/testing/tools/run-workflow-ticks.js.map +1 -0
- package/dist/testing/tools/run-workflow.d.ts +25 -0
- package/dist/testing/tools/run-workflow.d.ts.map +1 -0
- package/dist/testing/tools/run-workflow.js +25 -0
- package/dist/testing/tools/run-workflow.js.map +1 -0
- package/dist/testing/types.d.ts +1 -1
- package/dist/testing/types.d.ts.map +1 -1
- package/dist/testing/typings/AsyncActivityResult.d.ts +10 -0
- package/dist/testing/typings/AsyncActivityResult.d.ts.map +1 -0
- package/dist/testing/typings/AsyncActivityResult.js +2 -0
- package/dist/testing/typings/AsyncActivityResult.js.map +1 -0
- package/dist/testing/typings/ClaimConstructor.d.ts +2 -0
- package/dist/testing/typings/ClaimConstructor.d.ts.map +1 -0
- package/dist/testing/typings/ClaimConstructor.js +2 -0
- package/dist/testing/typings/ClaimConstructor.js.map +1 -0
- package/dist/testing/typings/MockAsyncActivity.d.ts +10 -0
- package/dist/testing/typings/MockAsyncActivity.d.ts.map +1 -0
- package/dist/testing/typings/MockAsyncActivity.js +2 -0
- package/dist/testing/typings/MockAsyncActivity.js.map +1 -0
- package/dist/tools/Internals.d.ts +1 -0
- package/dist/tools/Internals.d.ts.map +1 -1
- package/dist/tools/Internals.js +1 -0
- package/dist/tools/Internals.js.map +1 -1
- package/package.json +3 -2
- package/dist/testing/auto-resolve-timeouts.d.ts +0 -3
- package/dist/testing/auto-resolve-timeouts.d.ts.map +0 -1
- package/dist/testing/auto-resolve-timeouts.js +0 -16
- package/dist/testing/auto-resolve-timeouts.js.map +0 -1
- package/dist/testing/mock-async-by-activity.d.ts +0 -10
- package/dist/testing/mock-async-by-activity.d.ts.map +0 -1
- package/dist/testing/mock-async-by-activity.js +0 -15
- package/dist/testing/mock-async-by-activity.js.map +0 -1
- package/dist/testing/resolve-async-activities-in-order.d.ts +0 -3
- package/dist/testing/resolve-async-activities-in-order.d.ts.map +0 -1
- package/dist/testing/resolve-async-activities-in-order.js +0 -10
- package/dist/testing/resolve-async-activities-in-order.js.map +0 -1
- package/dist/tools/runWorkflowToCompletion.d.ts +0 -15
- package/dist/tools/runWorkflowToCompletion.d.ts.map +0 -1
- package/dist/tools/runWorkflowToCompletion.js +0 -61
- package/dist/tools/runWorkflowToCompletion.js.map +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function fulfilled<T>(output?: T): {
|
|
2
|
+
status: 'fulfilled';
|
|
3
|
+
output?: T;
|
|
4
|
+
};
|
|
5
|
+
export declare function rejected(reason?: unknown): {
|
|
6
|
+
status: 'rejected';
|
|
7
|
+
reason?: unknown;
|
|
8
|
+
};
|
|
9
|
+
export declare function timeout(): {
|
|
10
|
+
status: 'timeout';
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=async-activity-results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-activity-results.d.ts","sourceRoot":"","sources":["../../src/testing/async-activity-results.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,CAAA;CAAE,CAE5E;AAED,wBAAgB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG;IAC1C,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAEA;AAED,wBAAgB,OAAO,IAAI;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAE/C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function fulfilled(output) {
|
|
2
|
+
return { status: 'fulfilled', output };
|
|
3
|
+
}
|
|
4
|
+
export function rejected(reason) {
|
|
5
|
+
return { status: 'rejected', reason };
|
|
6
|
+
}
|
|
7
|
+
export function timeout() {
|
|
8
|
+
return { status: 'timeout' };
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=async-activity-results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-activity-results.js","sourceRoot":"","sources":["../../src/testing/async-activity-results.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAI,MAAU;IACrC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAgB;IAIvC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AAC9B,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import type { ClaimProvider } from '
|
|
2
|
-
import type { ClaimConstructor } from '
|
|
3
|
-
export declare function createMockClaim<T extends ClaimConstructor>(
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import type { ClaimProvider } from '../../models/Claim.js'
|
|
2
|
+
import type { ClaimConstructor } from '../types.js'
|
|
3
|
+
export declare function createMockClaim<T extends ClaimConstructor>(
|
|
4
|
+
ClaimClass: T,
|
|
5
|
+
implementation?: Partial<InstanceType<T>>,
|
|
6
|
+
): InstanceType<T>
|
|
7
|
+
export declare function mockClaim<T extends ClaimConstructor>(
|
|
8
|
+
ClaimClass: T,
|
|
9
|
+
implementation?: Partial<InstanceType<T>>,
|
|
10
|
+
): ClaimProvider<InstanceType<T>>
|
|
11
|
+
//# sourceMappingURL=create-mock-claim.d.ts.map
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import type { ClaimConstructor } from '
|
|
2
|
-
import type { ClaimProvider } from '
|
|
3
|
-
export declare function createMockClaims(
|
|
1
|
+
import type { ClaimConstructor } from '../types.js'
|
|
2
|
+
import type { ClaimProvider } from '../../models/Claim.js'
|
|
3
|
+
export declare function createMockClaims(
|
|
4
|
+
...providers: readonly ClaimProvider<any>[]
|
|
5
|
+
): readonly ClaimProvider<any>[]
|
|
4
6
|
export type MockClaimEntry = readonly [
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
]
|
|
8
|
-
export declare function createMockClaimsFromMap(
|
|
9
|
-
|
|
7
|
+
claim: ClaimConstructor,
|
|
8
|
+
implementation?: Partial<InstanceType<ClaimConstructor>>,
|
|
9
|
+
]
|
|
10
|
+
export declare function createMockClaimsFromMap(
|
|
11
|
+
entries: readonly MockClaimEntry[],
|
|
12
|
+
): readonly ClaimProvider<any>[]
|
|
13
|
+
//# sourceMappingURL=create-mock-claims.d.ts.map
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import type { Env } from '
|
|
2
|
-
export declare function createTestEnv(
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type { Env } from '../../models/Env.js'
|
|
2
|
+
export declare function createTestEnv(
|
|
3
|
+
overrides: Record<string, string | undefined>,
|
|
4
|
+
base?: Record<string, string | undefined>,
|
|
5
|
+
): Record<string, string | undefined>
|
|
6
|
+
export declare function createTestEnvEntries(
|
|
7
|
+
overrides: Record<string, string | undefined>,
|
|
8
|
+
base?: Record<string, string | undefined>,
|
|
9
|
+
): Env.Entries
|
|
10
|
+
//# sourceMappingURL=create-test-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NonDeterministicWorkflowError.d.ts","sourceRoot":"","sources":["../../../src/testing/exceptions/NonDeterministicWorkflowError.ts"],"names":[],"mappings":"AAAA,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,OAAO,EAAE,MAAM;CAK5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NonDeterministicWorkflowError.js","sourceRoot":"","sources":["../../../src/testing/exceptions/NonDeterministicWorkflowError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC7C,CAAC;CACF"}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './tools/mock-async.js';
|
|
2
|
+
export * from './tools/create-mock-claim.js';
|
|
3
|
+
export * from './tools/create-mock-claims.js';
|
|
4
|
+
export * from './tools/create-test-env.js';
|
|
5
|
+
export * from './async-activity-results.js';
|
|
6
|
+
export * from './TestClock.js';
|
|
7
|
+
export * from './TestWorkflowEnvironment.js';
|
|
8
|
+
export * from './exceptions/NonDeterministicWorkflowError.js';
|
|
2
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,gBAAgB,CAAA;AAC9B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+CAA+C,CAAA"}
|
package/dist/testing/index.js
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './tools/mock-async.js';
|
|
2
|
+
export * from './tools/create-mock-claim.js';
|
|
3
|
+
export * from './tools/create-mock-claims.js';
|
|
4
|
+
export * from './tools/create-test-env.js';
|
|
5
|
+
export * from './async-activity-results.js';
|
|
6
|
+
export * from './TestClock.js';
|
|
7
|
+
export * from './TestWorkflowEnvironment.js';
|
|
8
|
+
export * from './exceptions/NonDeterministicWorkflowError.js';
|
|
2
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,gBAAgB,CAAA;AAC9B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+CAA+C,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { MockAsyncActivity } from '../types.js'
|
|
2
|
+
import {
|
|
3
|
+
AsyncActivity,
|
|
4
|
+
type AnyAsyncActivity,
|
|
5
|
+
} from '../../models/AsyncActivity.js'
|
|
6
|
+
import type { AsyncActivityResultPending } from '../../models/AsyncActivityAdvanceResult.js'
|
|
7
|
+
type InferSerializableOutput<T extends AnyAsyncActivity> =
|
|
8
|
+
T extends AsyncActivity<any, any, infer TSerializableOutput, any, any, any>
|
|
9
|
+
? TSerializableOutput
|
|
10
|
+
: unknown
|
|
11
|
+
type TypedOutcome<TOutput> =
|
|
12
|
+
| {
|
|
13
|
+
status: 'fulfilled'
|
|
14
|
+
output?: TOutput
|
|
15
|
+
}
|
|
16
|
+
| {
|
|
17
|
+
status: 'rejected'
|
|
18
|
+
reason?: unknown
|
|
19
|
+
}
|
|
20
|
+
| {
|
|
21
|
+
status: 'timeout'
|
|
22
|
+
}
|
|
23
|
+
interface OnContext {
|
|
24
|
+
callCount: number
|
|
25
|
+
input: unknown
|
|
26
|
+
pending: AsyncActivityResultPending
|
|
27
|
+
}
|
|
28
|
+
type OnCallback<T extends AnyAsyncActivity> = (
|
|
29
|
+
activity: T,
|
|
30
|
+
context: OnContext,
|
|
31
|
+
) =>
|
|
32
|
+
| TypedOutcome<InferSerializableOutput<T>>
|
|
33
|
+
| Promise<TypedOutcome<InferSerializableOutput<T>>>
|
|
34
|
+
type OnHandler<T extends AnyAsyncActivity> =
|
|
35
|
+
| TypedOutcome<InferSerializableOutput<T>>
|
|
36
|
+
| TypedOutcome<InferSerializableOutput<T>>[]
|
|
37
|
+
| OnCallback<T>
|
|
38
|
+
export interface MockAsyncBuilder extends MockAsyncActivity {
|
|
39
|
+
on<T extends AnyAsyncActivity>(
|
|
40
|
+
ActivityClass: new () => T,
|
|
41
|
+
handler: OnHandler<T>,
|
|
42
|
+
): MockAsyncBuilder
|
|
43
|
+
timeout(): MockAsyncBuilder
|
|
44
|
+
fallback(handler: MockAsyncActivity): MockAsyncBuilder
|
|
45
|
+
}
|
|
46
|
+
export declare function mockAsync(): MockAsyncBuilder
|
|
47
|
+
export {}
|
|
48
|
+
//# sourceMappingURL=mock-async.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-async.d.ts","sourceRoot":"","sources":["../../src/testing/mock-async.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,EACb,KAAK,gBAAgB,EACtB,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AAEzF,KAAK,uBAAuB,CAAC,CAAC,SAAS,gBAAgB,IACrD,CAAC,SAAS,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GACvE,mBAAmB,GACnB,OAAO,CAAA;AAEb,KAAK,YAAY,CAAC,OAAO,IACrB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AAEzB,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,0BAA0B,CAAA;CACpC;AAED,KAAK,UAAU,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAC5C,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,SAAS,KAEhB,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAErD,KAAK,SAAS,CAAC,CAAC,SAAS,gBAAgB,IACrC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,GACxC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,GAC1C,UAAU,CAAC,CAAC,CAAC,CAAA;AAQjB,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,EAAE,CAAC,CAAC,SAAS,gBAAgB,EAC3B,aAAa,EAAE,UAAU,CAAC,EAC1B,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GACpB,gBAAgB,CAAA;IAEnB,OAAO,IAAI,gBAAgB,CAAA;IAE3B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAAA;CACvD;AAED,wBAAgB,SAAS,IAAI,gBAAgB,CA+E5C"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { TestClock } from './TestClock.js';
|
|
2
|
+
import { AsyncActivity, } from '../models/AsyncActivity.js';
|
|
3
|
+
export function mockAsync() {
|
|
4
|
+
const entries = [];
|
|
5
|
+
let timeoutFallback = false;
|
|
6
|
+
let fallbackHandler;
|
|
7
|
+
const execute = async (activity, context) => {
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
if (!(activity instanceof entry.ActivityClass))
|
|
10
|
+
continue;
|
|
11
|
+
const callCount = entry.callCount++;
|
|
12
|
+
const ctx = {
|
|
13
|
+
callCount,
|
|
14
|
+
input: context.input,
|
|
15
|
+
pending: context.pending,
|
|
16
|
+
};
|
|
17
|
+
if (typeof entry.handler === 'function') {
|
|
18
|
+
return entry.handler(activity, ctx);
|
|
19
|
+
}
|
|
20
|
+
if (Array.isArray(entry.handler)) {
|
|
21
|
+
const outcome = entry.handler[callCount];
|
|
22
|
+
if (outcome === undefined)
|
|
23
|
+
throw new Error(`mockAsync().on(${activity.constructor.name}): no outcome at call ${callCount} (${entry.handler.length} defined)`);
|
|
24
|
+
return outcome;
|
|
25
|
+
}
|
|
26
|
+
return entry.handler;
|
|
27
|
+
}
|
|
28
|
+
if (timeoutFallback && context.pending.timeoutAt) {
|
|
29
|
+
const target = context.pending.timeoutAt.getTime();
|
|
30
|
+
if (TestClock.isActive() && TestClock.now() < target)
|
|
31
|
+
TestClock.advance(target - TestClock.now());
|
|
32
|
+
return { status: 'timeout' };
|
|
33
|
+
}
|
|
34
|
+
if (fallbackHandler)
|
|
35
|
+
return fallbackHandler(activity, context);
|
|
36
|
+
throw new Error(`mockAsync(): no handler registered for "${activity.constructor.name}"`);
|
|
37
|
+
};
|
|
38
|
+
const builder = Object.assign(execute, {
|
|
39
|
+
on(ActivityClass, handler) {
|
|
40
|
+
entries.push({
|
|
41
|
+
ActivityClass: ActivityClass,
|
|
42
|
+
handler: handler,
|
|
43
|
+
callCount: 0,
|
|
44
|
+
});
|
|
45
|
+
return builder;
|
|
46
|
+
},
|
|
47
|
+
timeout() {
|
|
48
|
+
timeoutFallback = true;
|
|
49
|
+
return builder;
|
|
50
|
+
},
|
|
51
|
+
fallback(handler) {
|
|
52
|
+
fallbackHandler = handler;
|
|
53
|
+
return builder;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
return builder;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=mock-async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-async.js","sourceRoot":"","sources":["../../src/testing/mock-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAM1C,OAAO,EACL,aAAa,GAEd,MAAM,4BAA4B,CAAA;AAgDnC,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAc,EAAE,CAAA;IAC7B,IAAI,eAAe,GAAG,KAAK,CAAA;IAC3B,IAAI,eAA8C,CAAA;IAElD,MAAM,OAAO,GAAsB,KAAK,EACtC,QAA0B,EAC1B,OAAiC,EACF,EAAE;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,QAAQ,YAAY,KAAK,CAAC,aAAa,CAAC;gBAAE,SAAQ;YAExD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,CAAA;YACnC,MAAM,GAAG,GAAc;gBACrB,SAAS;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAA;YAED,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACxC,OAAQ,KAAK,CAAC,OAAwC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACvE,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;gBAExC,IAAI,OAAO,KAAK,SAAS;oBACvB,MAAM,IAAI,KAAK,CACb,kBAAkB,QAAQ,CAAC,WAAW,CAAC,IAAI,yBAAyB,SAAS,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,WAAW,CAClH,CAAA;gBAEH,OAAO,OAAO,CAAA;YAChB,CAAC;YAED,OAAO,KAAK,CAAC,OAAO,CAAA;QACtB,CAAC;QAED,IAAI,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;YAElD,IAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAC,GAAG,EAAE,GAAG,MAAM;gBAClD,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAA;YAE7C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC9B,CAAC;QAED,IAAI,eAAe;YAAE,OAAO,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAE9D,MAAM,IAAI,KAAK,CACb,2CAA2C,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CACxE,CAAA;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAAqB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QACvD,EAAE,CACA,aAA0B,EAC1B,OAAqB;YAErB,OAAO,CAAC,IAAI,CAAC;gBACX,aAAa,EAAE,aAA2C;gBAC1D,OAAO,EAAE,OAAsC;gBAC/C,SAAS,EAAE,CAAC;aACb,CAAC,CAAA;YAEF,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,OAAO;YACL,eAAe,GAAG,IAAI,CAAA;YACtB,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,QAAQ,CAAC,OAA0B;YACjC,eAAe,GAAG,OAAO,CAAA;YACzB,OAAO,OAAO,CAAA;QAChB,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function fulfilled<T>(output?: T): {
|
|
2
|
+
status: 'fulfilled';
|
|
3
|
+
output?: T;
|
|
4
|
+
};
|
|
5
|
+
export declare function rejected(reason?: unknown): {
|
|
6
|
+
status: 'rejected';
|
|
7
|
+
reason?: unknown;
|
|
8
|
+
};
|
|
9
|
+
export declare function timeout(): {
|
|
10
|
+
status: 'timeout';
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=outcomes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcomes.d.ts","sourceRoot":"","sources":["../../src/testing/outcomes.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,CAAA;CAAE,CAE5E;AAED,wBAAgB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAEnF;AAED,wBAAgB,OAAO,IAAI;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAE/C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function fulfilled(output) {
|
|
2
|
+
return { status: 'fulfilled', output };
|
|
3
|
+
}
|
|
4
|
+
export function rejected(reason) {
|
|
5
|
+
return { status: 'rejected', reason };
|
|
6
|
+
}
|
|
7
|
+
export function timeout() {
|
|
8
|
+
return { status: 'timeout' };
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=outcomes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcomes.js","sourceRoot":"","sources":["../../src/testing/outcomes.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAI,MAAU;IACrC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAgB;IACvC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AAC9B,CAAC"}
|
|
@@ -1,31 +1,32 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import {
|
|
1
|
+
import { type TestClockRunOptions } from './TestClock.js';
|
|
2
|
+
import type { MockAsyncActivity } from './types.js';
|
|
3
3
|
import type { ClaimProvider } from '../models/Claim.js';
|
|
4
|
-
import { Env } from '../models/Env.js';
|
|
4
|
+
import type { Env } from '../models/Env.js';
|
|
5
|
+
import type { HistoryItem } from '../models/History.js';
|
|
5
6
|
import type { Log } from '../models/Logger.js';
|
|
6
7
|
import type { Workflow, WorkflowInput } from '../models/Workflow.js';
|
|
7
|
-
|
|
8
|
-
input: unknown;
|
|
9
|
-
pending: AsyncActivityResultPending;
|
|
10
|
-
index: number;
|
|
11
|
-
}
|
|
12
|
-
export type AsyncActivityOutcome = {
|
|
13
|
-
status: 'fulfilled';
|
|
14
|
-
output?: unknown;
|
|
15
|
-
} | {
|
|
16
|
-
status: 'rejected';
|
|
17
|
-
reason?: unknown;
|
|
18
|
-
} | {
|
|
19
|
-
status: 'timeout';
|
|
20
|
-
};
|
|
21
|
-
type MockAsyncActivity = (activity: AnyAsyncActivity, context: MockAsyncActivityContext) => AsyncActivityOutcome | Promise<AsyncActivityOutcome>;
|
|
8
|
+
export type { AsyncActivityOutcome, MockAsyncActivity, MockAsyncActivityContext, } from './types.js';
|
|
22
9
|
export interface RunWorkflowOptions {
|
|
23
10
|
claims?: readonly ClaimProvider<any>[];
|
|
24
11
|
env?: Env.Entries;
|
|
25
|
-
mockAsyncActivity?: MockAsyncActivity
|
|
12
|
+
mockAsyncActivity?: MockAsyncActivity;
|
|
26
13
|
maxTicks?: number;
|
|
27
14
|
logs?: Log[];
|
|
15
|
+
history?: HistoryItem[];
|
|
16
|
+
clock?: TestClockRunOptions | false;
|
|
17
|
+
strict?: boolean;
|
|
18
|
+
autoResolveTimeouts?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface RunWorkflowResult<TOutput = unknown> {
|
|
21
|
+
output: TOutput;
|
|
22
|
+
history: readonly HistoryItem[];
|
|
23
|
+
logs: readonly Log[];
|
|
24
|
+
clockNow?: number;
|
|
28
25
|
}
|
|
29
|
-
export declare function runWorkflow<T extends Workflow<any, any>>(workflow: T, input: WorkflowInput<T>, options?: RunWorkflowOptions): Promise<
|
|
30
|
-
export
|
|
26
|
+
export declare function runWorkflow<T extends Workflow<any, any>>(workflow: T, input: WorkflowInput<T>, options?: RunWorkflowOptions): Promise<unknown>;
|
|
27
|
+
export declare function runWorkflowDetailed<T extends Workflow<any, any>>(workflow: T, input: WorkflowInput<T>, options?: RunWorkflowOptions): Promise<RunWorkflowResult>;
|
|
28
|
+
export declare function runWorkflowTicks<T extends Workflow<any, any>>(workflow: T, input: WorkflowInput<T>, options: RunWorkflowOptions & {
|
|
29
|
+
history: HistoryItem[];
|
|
30
|
+
logs: Log[];
|
|
31
|
+
}): Promise<any>;
|
|
31
32
|
//# sourceMappingURL=run-workflow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-workflow.d.ts","sourceRoot":"","sources":["../../src/testing/run-workflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-workflow.d.ts","sourceRoot":"","sources":["../../src/testing/run-workflow.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,KAAK,EAAwB,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAWzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAG9C,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGpE,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAA;IACtC,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACjB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACZ,OAAO,CAAC,EAAE,WAAW,EAAE,CAAA;IACvB,KAAK,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAA;IACnC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,OAAO;IAClD,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;IAC/B,IAAI,EAAE,SAAS,GAAG,EAAE,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAqBD,wBAAsB,WAAW,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAC5D,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,OAAO,GAAE,kBAAuB,oBAKjC;AAED,wBAAsB,mBAAmB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EACpE,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAwB5B;AAED,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EACjE,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,OAAO,EAAE,kBAAkB,GAAG;IAC5B,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,IAAI,EAAE,GAAG,EAAE,CAAA;CACZ,gBAkCF"}
|
|
@@ -1,33 +1,57 @@
|
|
|
1
|
+
import { mockAsync } from './mock-async.js';
|
|
2
|
+
import { StrictGuard } from './StrictGuard.js';
|
|
3
|
+
import { TestClock } from './TestClock.js';
|
|
1
4
|
import { AsyncActivity, } from '../models/AsyncActivity.js';
|
|
2
5
|
import { AsyncActivityResultFulfilled, AsyncActivityResultPending, AsyncActivityResultRejected, } from '../models/AsyncActivityAdvanceResult.js';
|
|
3
|
-
import { Env } from '../models/Env.js';
|
|
4
6
|
import { PushActivity } from '../models/PushActivity.js';
|
|
5
7
|
import { SyncActivity } from '../models/SyncActivity.js';
|
|
6
8
|
import { Internals } from '../tools/Internals.js';
|
|
7
|
-
function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return next;
|
|
14
|
-
};
|
|
9
|
+
function resolveMockAsyncActivity(options) {
|
|
10
|
+
if (options.mockAsyncActivity !== undefined)
|
|
11
|
+
return options.mockAsyncActivity;
|
|
12
|
+
if (options.autoResolveTimeouts)
|
|
13
|
+
return mockAsync().timeout();
|
|
14
|
+
return undefined;
|
|
15
15
|
}
|
|
16
|
-
function
|
|
17
|
-
if (
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
-
return mockAsyncActivities(mock);
|
|
21
|
-
return mock;
|
|
16
|
+
function runWithClock(clock, fn) {
|
|
17
|
+
if (clock === false || clock === undefined)
|
|
18
|
+
return fn();
|
|
19
|
+
return TestClock.run(clock, fn);
|
|
22
20
|
}
|
|
23
21
|
export async function runWorkflow(workflow, input, options = {}) {
|
|
22
|
+
const { output } = await runWorkflowDetailed(workflow, input, options);
|
|
23
|
+
return output;
|
|
24
|
+
}
|
|
25
|
+
export async function runWorkflowDetailed(workflow, input, options = {}) {
|
|
26
|
+
const history = options.history ?? [];
|
|
27
|
+
const logs = options.logs ?? [];
|
|
28
|
+
const restoreStrict = options.strict ? StrictGuard.install() : undefined;
|
|
29
|
+
let clockNow;
|
|
30
|
+
try {
|
|
31
|
+
const output = await runWithClock(options.clock, async () => {
|
|
32
|
+
const result = await runWorkflowTicks(workflow, input, {
|
|
33
|
+
...options,
|
|
34
|
+
history,
|
|
35
|
+
logs,
|
|
36
|
+
mockAsyncActivity: resolveMockAsyncActivity(options),
|
|
37
|
+
});
|
|
38
|
+
if (TestClock.isActive())
|
|
39
|
+
clockNow = TestClock.now();
|
|
40
|
+
return result;
|
|
41
|
+
});
|
|
42
|
+
return { output, history, logs, clockNow };
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
restoreStrict?.();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function runWorkflowTicks(workflow, input, options) {
|
|
24
49
|
const claims = options.claims ?? [];
|
|
25
50
|
const env = options.env ?? {};
|
|
26
51
|
const maxTicks = options.maxTicks ?? 10_000;
|
|
27
|
-
const history =
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
const resolutionState = { index: 0 };
|
|
52
|
+
const { history, logs } = options;
|
|
53
|
+
const mock = options.mockAsyncActivity;
|
|
54
|
+
const resolutionState = { callCount: 0 };
|
|
31
55
|
for (let tick = 0; tick < maxTicks; tick++) {
|
|
32
56
|
try {
|
|
33
57
|
return await Internals.runWorkflow(workflow, {
|
|
@@ -41,7 +65,7 @@ export async function runWorkflow(workflow, input, options = {}) {
|
|
|
41
65
|
catch (pushOrError) {
|
|
42
66
|
if (!(pushOrError instanceof PushActivity))
|
|
43
67
|
throw pushOrError;
|
|
44
|
-
const item = await resolveActivity(pushOrError, { claims, env },
|
|
68
|
+
const item = await resolveActivity(pushOrError, { claims, env }, mock, resolutionState);
|
|
45
69
|
history.push(item);
|
|
46
70
|
}
|
|
47
71
|
}
|
|
@@ -49,50 +73,84 @@ export async function runWorkflow(workflow, input, options = {}) {
|
|
|
49
73
|
}
|
|
50
74
|
async function resolveActivity(push, context, mockAsyncActivity, resolutionState) {
|
|
51
75
|
const activity = push.activity;
|
|
76
|
+
const activityContext = {
|
|
77
|
+
...context,
|
|
78
|
+
id: activity.id,
|
|
79
|
+
};
|
|
52
80
|
if (activity instanceof SyncActivity) {
|
|
53
|
-
const output = await Internals.runActivity(activity,
|
|
54
|
-
return { type: 'sync', output };
|
|
81
|
+
const output = await Internals.runActivity(activity, activityContext, instance => instance.run(push.input));
|
|
82
|
+
return { id: activity.id, type: 'sync', output };
|
|
55
83
|
}
|
|
56
84
|
if (activity instanceof AsyncActivity) {
|
|
57
|
-
const bootstrap = await Internals.runActivity(activity,
|
|
58
|
-
return resolveAsyncActivity(activity, bootstrap,
|
|
85
|
+
const bootstrap = await Internals.runActivity(activity, activityContext, instance => instance.bootstrap(push.input));
|
|
86
|
+
return resolveAsyncActivity(activity, bootstrap, activityContext, push.input, mockAsyncActivity, resolutionState);
|
|
59
87
|
}
|
|
60
88
|
throw new Error('Unknown activity type');
|
|
61
89
|
}
|
|
62
90
|
async function resolveAsyncActivity(activity, bootstrap, context, input, mockAsyncActivity, resolutionState) {
|
|
63
91
|
if (bootstrap instanceof AsyncActivityResultFulfilled)
|
|
64
|
-
return {
|
|
92
|
+
return {
|
|
93
|
+
id: activity.id,
|
|
94
|
+
type: 'async',
|
|
95
|
+
status: 'fulfilled',
|
|
96
|
+
output: bootstrap.payload,
|
|
97
|
+
};
|
|
65
98
|
if (bootstrap instanceof AsyncActivityResultRejected)
|
|
66
|
-
return {
|
|
99
|
+
return {
|
|
100
|
+
id: activity.id,
|
|
101
|
+
type: 'async',
|
|
102
|
+
status: 'rejected',
|
|
103
|
+
output: bootstrap.payload,
|
|
104
|
+
};
|
|
67
105
|
if (!(bootstrap instanceof AsyncActivityResultPending))
|
|
68
106
|
throw new Error('Unknown async activity result');
|
|
69
107
|
const name = activity.constructor.name;
|
|
70
108
|
if (!mockAsyncActivity)
|
|
71
|
-
throw new Error(`Async activity "${name}" is pending and no
|
|
109
|
+
throw new Error(`Async activity "${name}" is pending and no mockAsyncActivity was provided`);
|
|
72
110
|
const outcome = await mockAsyncActivity(activity, {
|
|
73
111
|
input,
|
|
74
112
|
pending: bootstrap,
|
|
75
|
-
|
|
113
|
+
callCount: resolutionState?.callCount ?? 0,
|
|
76
114
|
});
|
|
77
115
|
if (resolutionState)
|
|
78
|
-
resolutionState.
|
|
116
|
+
resolutionState.callCount++;
|
|
79
117
|
return outcomeToHistoryItem(activity, outcome, bootstrap, context, name);
|
|
80
118
|
}
|
|
81
119
|
async function outcomeToHistoryItem(activity, outcome, pending, context, name) {
|
|
82
120
|
switch (outcome.status) {
|
|
83
121
|
case 'fulfilled':
|
|
84
|
-
return {
|
|
122
|
+
return {
|
|
123
|
+
id: activity.id,
|
|
124
|
+
type: 'async',
|
|
125
|
+
status: 'fulfilled',
|
|
126
|
+
output: outcome.output,
|
|
127
|
+
};
|
|
85
128
|
case 'rejected':
|
|
86
|
-
return {
|
|
129
|
+
return {
|
|
130
|
+
id: activity.id,
|
|
131
|
+
type: 'async',
|
|
132
|
+
status: 'rejected',
|
|
133
|
+
output: outcome.reason,
|
|
134
|
+
};
|
|
87
135
|
case 'timeout': {
|
|
88
136
|
const onTimeout = activity.onTimeout?.bind(activity);
|
|
89
137
|
if (!onTimeout)
|
|
90
138
|
throw new Error(`Async activity "${name}" timed out but defines no onTimeout handler`);
|
|
91
139
|
const result = await Internals.runActivity(activity, context, () => onTimeout(pending));
|
|
92
140
|
if (result instanceof AsyncActivityResultFulfilled)
|
|
93
|
-
return {
|
|
141
|
+
return {
|
|
142
|
+
id: activity.id,
|
|
143
|
+
type: 'async',
|
|
144
|
+
status: 'fulfilled',
|
|
145
|
+
output: result.payload,
|
|
146
|
+
};
|
|
94
147
|
if (result instanceof AsyncActivityResultRejected)
|
|
95
|
-
return {
|
|
148
|
+
return {
|
|
149
|
+
id: activity.id,
|
|
150
|
+
type: 'async',
|
|
151
|
+
status: 'rejected',
|
|
152
|
+
output: result.payload,
|
|
153
|
+
};
|
|
96
154
|
throw new Error(`Async activity "${name}" stayed pending after onTimeout`);
|
|
97
155
|
}
|
|
98
156
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-workflow.js","sourceRoot":"","sources":["../../src/testing/run-workflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-workflow.js","sourceRoot":"","sources":["../../src/testing/run-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ClaimProvider } from '../../models/Claim.js';
|
|
2
|
+
import type { ClaimConstructor } from '../typings/ClaimConstructor.js';
|
|
3
|
+
export declare function createMockClaim<T extends ClaimConstructor>(ClaimClass: T, implementation?: Partial<InstanceType<T>>): InstanceType<T>;
|
|
4
|
+
export declare function mockClaim<T extends ClaimConstructor>(ClaimClass: T, implementation?: Partial<InstanceType<T>>): ClaimProvider<InstanceType<T>>;
|
|
5
|
+
//# sourceMappingURL=create-mock-claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-mock-claim.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/create-mock-claim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,wBAAgB,eAAe,CAAC,CAAC,SAAS,gBAAgB,EACxD,UAAU,EAAE,CAAC,EACb,cAAc,GAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAM,GAC5C,YAAY,CAAC,CAAC,CAAC,CAuBjB;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,gBAAgB,EAClD,UAAU,EAAE,CAAC,EACb,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACxC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAKhC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function createMockClaim(ClaimClass, implementation = {}) {
|
|
2
|
+
const name = ClaimClass.name;
|
|
3
|
+
return new Proxy(implementation, {
|
|
4
|
+
get(target, propertyKey, receiver) {
|
|
5
|
+
if (propertyKey in target) {
|
|
6
|
+
const value = Reflect.get(target, propertyKey, receiver);
|
|
7
|
+
if (typeof value === 'function')
|
|
8
|
+
return value.bind(target);
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
if (propertyKey === 'then')
|
|
12
|
+
return undefined;
|
|
13
|
+
return () => {
|
|
14
|
+
throw new Error(`Mock ${name}.${String(propertyKey)} was not implemented. ` +
|
|
15
|
+
`Provide it via mockClaim(${name}, { ${String(propertyKey)}: ... }).`);
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function mockClaim(ClaimClass, implementation) {
|
|
21
|
+
return {
|
|
22
|
+
provide: ClaimClass,
|
|
23
|
+
value: createMockClaim(ClaimClass, implementation ?? {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=create-mock-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-mock-claim.js","sourceRoot":"","sources":["../../../src/testing/tools/create-mock-claim.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAC7B,UAAa,EACb,iBAA2C,EAAE;IAE7C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;IAE5B,OAAO,IAAI,KAAK,CAAC,cAAwB,EAAE;QACzC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ;YAC/B,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;gBAExD,IAAI,OAAO,KAAK,KAAK,UAAU;oBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAE1D,OAAO,KAAK,CAAA;YACd,CAAC;YAED,IAAI,WAAW,KAAK,MAAM;gBAAE,OAAO,SAAS,CAAA;YAE5C,OAAO,GAAG,EAAE;gBACV,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,IAAI,MAAM,CAAC,WAAW,CAAC,wBAAwB;oBACzD,4BAA4B,IAAI,OAAO,MAAM,CAAC,WAAW,CAAC,WAAW,CACxE,CAAA;YACH,CAAC,CAAA;QACH,CAAC;KACF,CAAoB,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,UAAa,EACb,cAAyC;IAEzC,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,eAAe,CAAC,UAAU,EAAE,cAAc,IAAI,EAAE,CAAC;KACzD,CAAA;AACH,CAAC"}
|