1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-24 08:09:08 -05:00

feat(test): Add "name", "origin" and "parent" to "Deno.TestContext" (#14007)

This commit adds following fields to "Deno.TestContext" interface:
- name
- origin
- parent

These are prerequisites for supporting snapshot functionality in
"std/testing".
This commit is contained in:
Yongwook Choi 2022-04-06 23:51:38 +09:00 committed by GitHub
parent e33329b47e
commit 0df1854249
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 2 deletions

View file

@ -250,6 +250,19 @@ declare namespace Deno {
} }
export interface TestContext { export interface TestContext {
/**
* The current test name.
*/
name: string;
/**
* File Uri of the current test code.
*/
origin: string;
/**
* Parent test context.
*/
parent?: TestContext;
/** Run a sub step of the parent test or step. Returns a promise /** Run a sub step of the parent test or step. Returns a promise
* that resolves to a boolean signifying if the step completed successfully. * that resolves to a boolean signifying if the step completed successfully.
* The returned promise never rejects unless the arguments are invalid. * The returned promise never rejects unless the arguments are invalid.
@ -270,6 +283,9 @@ declare namespace Deno {
export interface TestStepDefinition { export interface TestStepDefinition {
fn: (t: TestContext) => void | Promise<void>; fn: (t: TestContext) => void | Promise<void>;
/**
* The current test name.
*/
name: string; name: string;
ignore?: boolean; ignore?: boolean;
/** Check that the number of async completed ops after the test step is the same /** Check that the number of async completed ops after the test step is the same
@ -287,6 +303,9 @@ declare namespace Deno {
export interface TestDefinition { export interface TestDefinition {
fn: (t: TestContext) => void | Promise<void>; fn: (t: TestContext) => void | Promise<void>;
/**
* The current test name.
*/
name: string; name: string;
ignore?: boolean; ignore?: boolean;
/** If at least one test has `only` set to true, only run tests that have /** If at least one test has `only` set to true, only run tests that have

View file

@ -1,5 +1,5 @@
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
import { assertRejects, assertThrows } from "./test_util.ts"; import { assertEquals, assertRejects, assertThrows } from "./test_util.ts";
Deno.test(function testWrongOverloads() { Deno.test(function testWrongOverloads() {
assertThrows( assertThrows(
@ -117,3 +117,33 @@ Deno.test(async function invalidStepArguments(t) {
"Expected a test definition or name and function.", "Expected a test definition or name and function.",
); );
}); });
Deno.test(async function nameOnTextContext(t1) {
await assertEquals(t1.name, "nameOnTextContext");
await t1.step("step", async (t2) => {
await assertEquals(t2.name, "step");
await t2.step("nested step", async (t3) => {
await assertEquals(t3.name, "nested step");
});
});
});
Deno.test(async function originOnTextContext(t1) {
await assertEquals(t1.origin, Deno.mainModule);
await t1.step("step", async (t2) => {
await assertEquals(t2.origin, Deno.mainModule);
await t2.step("nested step", async (t3) => {
await assertEquals(t3.origin, Deno.mainModule);
});
});
});
Deno.test(async function parentOnTextContext(t1) {
await assertEquals(t1.parent, undefined);
await t1.step("step", async (t2) => {
await assertEquals(t1, t2.parent);
await t2.step("nested step", async (t3) => {
await assertEquals(t2, t3.parent);
});
});
});

View file

@ -792,6 +792,7 @@
const step = new TestStep({ const step = new TestStep({
name: test.name, name: test.name,
parent: undefined, parent: undefined,
parentContext: undefined,
rootTestDescription: description, rootTestDescription: description,
sanitizeOps: test.sanitizeOps, sanitizeOps: test.sanitizeOps,
sanitizeResources: test.sanitizeResources, sanitizeResources: test.sanitizeResources,
@ -1064,8 +1065,9 @@
* }} TestStepDefinition * }} TestStepDefinition
* *
* @typedef {{ * @typedef {{
* name: string; * name: string,
* parent: TestStep | undefined, * parent: TestStep | undefined,
* parentContext: TestContext | undefined,
* rootTestDescription: { origin: string; name: string }; * rootTestDescription: { origin: string; name: string };
* sanitizeOps: boolean, * sanitizeOps: boolean,
* sanitizeResources: boolean, * sanitizeResources: boolean,
@ -1099,6 +1101,10 @@
return this.#params.parent; return this.#params.parent;
} }
get parentContext() {
return this.#params.parentContext;
}
get rootTestDescription() { get rootTestDescription() {
return this.#params.rootTestDescription; return this.#params.rootTestDescription;
} }
@ -1268,6 +1274,18 @@
function createTestContext(parentStep) { function createTestContext(parentStep) {
return { return {
[SymbolToStringTag]: "TestContext", [SymbolToStringTag]: "TestContext",
/**
* The current test name.
*/
name: parentStep.name,
/**
* Parent test context.
*/
parent: parentStep.parentContext ?? undefined,
/**
* File Uri of the test code.
*/
origin: parentStep.rootTestDescription.origin,
/** /**
* @param nameOrTestDefinition {string | TestStepDefinition} * @param nameOrTestDefinition {string | TestStepDefinition}
* @param fn {(t: TestContext) => void | Promise<void>} * @param fn {(t: TestContext) => void | Promise<void>}
@ -1284,6 +1302,7 @@
const subStep = new TestStep({ const subStep = new TestStep({
name: definition.name, name: definition.name,
parent: parentStep, parent: parentStep,
parentContext: this,
rootTestDescription: parentStep.rootTestDescription, rootTestDescription: parentStep.rootTestDescription,
sanitizeOps: getOrDefault( sanitizeOps: getOrDefault(
definition.sanitizeOps, definition.sanitizeOps,