(
fixtureFn: (
context: unknown,
useFn: (arg: unknown) => Promise<void>,
) => Promise<void>,
fixtureName: string,
context: unknown,
cleanupFnArray: (() => void | Promise<void>)[],
)
| 497 | } |
| 498 | |
| 499 | async function resolveFixtureFunction( |
| 500 | fixtureFn: ( |
| 501 | context: unknown, |
| 502 | useFn: (arg: unknown) => Promise<void>, |
| 503 | ) => Promise<void>, |
| 504 | fixtureName: string, |
| 505 | context: unknown, |
| 506 | cleanupFnArray: (() => void | Promise<void>)[], |
| 507 | ): Promise<unknown> { |
| 508 | // wait for `use` call to extract fixture value |
| 509 | const useFnArgPromise = createDefer() |
| 510 | const stackTraceError |
| 511 | = FIXTURE_STACK_TRACE_KEY in fixtureFn && fixtureFn[FIXTURE_STACK_TRACE_KEY] instanceof Error |
| 512 | ? fixtureFn[FIXTURE_STACK_TRACE_KEY] |
| 513 | : undefined |
| 514 | let isUseFnArgResolved = false |
| 515 | |
| 516 | const fixtureReturn = fixtureFn(context, async (useFnArg: unknown) => { |
| 517 | // extract `use` argument |
| 518 | isUseFnArgResolved = true |
| 519 | useFnArgPromise.resolve(useFnArg) |
| 520 | |
| 521 | // suspend fixture teardown by holding off `useReturnPromise` resolution until cleanup |
| 522 | const useReturnPromise = createDefer<void>() |
| 523 | cleanupFnArray.push(async () => { |
| 524 | // start teardown by resolving `use` Promise |
| 525 | useReturnPromise.resolve() |
| 526 | // wait for finishing teardown |
| 527 | await fixtureReturn |
| 528 | }) |
| 529 | await useReturnPromise |
| 530 | }).then(() => { |
| 531 | // fixture returned without calling use() |
| 532 | if (!isUseFnArgResolved) { |
| 533 | const error = new Error( |
| 534 | `Fixture "${fixtureName}" returned without calling "use". Make sure to call "use" in every code path of the fixture function.`, |
| 535 | ) |
| 536 | if (stackTraceError?.stack) { |
| 537 | error.stack = error.message + stackTraceError.stack.replace(stackTraceError.message, '') |
| 538 | } |
| 539 | useFnArgPromise.reject(error) |
| 540 | } |
| 541 | }).catch((e: unknown) => { |
| 542 | // treat fixture setup error as test failure |
| 543 | if (!isUseFnArgResolved) { |
| 544 | useFnArgPromise.reject(e) |
| 545 | return |
| 546 | } |
| 547 | // otherwise re-throw to avoid silencing error during cleanup |
| 548 | throw e |
| 549 | }) |
| 550 | |
| 551 | return useFnArgPromise |
| 552 | } |
| 553 | |
| 554 | function resolveDeps( |
| 555 | usedFixtures: TestFixtureItem[], |
no test coverage detected