From e87421add6d820ad723f2f50536280107bdf5bdd Mon Sep 17 00:00:00 2001 From: epszaw Date: Wed, 29 Jan 2025 13:08:23 +0100 Subject: [PATCH] support links in string metadata for mocha and codeceptjs --- .../test/spec/titleMetadata.test.ts | 10 +++++- .../allure-mocha/src/AllureMochaReporter.ts | 5 +++ packages/allure-mocha/src/types.ts | 3 +- packages/allure-mocha/src/utils.ts | 7 ++++ .../samples/spec/links/meta/multiple.spec.js | 4 +++ .../samples/spec/links/meta/single.spec.js | 4 +++ .../test/spec/api/metadata.test.ts | 34 +++++++++++++++++++ packages/allure-mocha/test/utils.ts | 1 + .../test/spec/titleMetadata.spec.ts | 4 +-- .../test/spec/titleMetadata.test.ts | 4 +-- .../test/spec/simple.test.ts | 4 +-- 11 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 packages/allure-mocha/test/samples/spec/links/meta/multiple.spec.js create mode 100644 packages/allure-mocha/test/samples/spec/links/meta/single.spec.js diff --git a/packages/allure-codeceptjs/test/spec/titleMetadata.test.ts b/packages/allure-codeceptjs/test/spec/titleMetadata.test.ts index 9c0955bf9..a6da64e18 100644 --- a/packages/allure-codeceptjs/test/spec/titleMetadata.test.ts +++ b/packages/allure-codeceptjs/test/spec/titleMetadata.test.ts @@ -6,7 +6,7 @@ it("handles title metadata", async () => { const { tests } = await runCodeceptJsInlineTest({ "sample.test.js": ` Feature("sample feature"); - Scenario("some strange name to test @allure.id=228 @allure.label.tag=slow @allure.label.labelName=labelValue", async () => {}); + Scenario("some strange name to test @allure.id=228 @allure.label.tag=slow @allure.label.labelName=labelValue @allure.link.my_link=https://allurereport.org", async () => {}); `, }); @@ -28,4 +28,12 @@ it("handles title metadata", async () => { }, ]), ); + expect(tests[0].links).toEqual( + expect.arrayContaining([ + { + type: "my_link", + url: "https://allurereport.org", + }, + ]), + ); }); diff --git a/packages/allure-mocha/src/AllureMochaReporter.ts b/packages/allure-mocha/src/AllureMochaReporter.ts index 83b65fe4b..3be9d5e56 100644 --- a/packages/allure-mocha/src/AllureMochaReporter.ts +++ b/packages/allure-mocha/src/AllureMochaReporter.ts @@ -25,6 +25,7 @@ import { getAllureDisplayName, getAllureFullName, getAllureMetaLabels, + getAllureMetaLinks, getHookType, getSuitesOfMochaTest, getTestCaseId, @@ -187,14 +188,17 @@ export class AllureMochaReporter extends Mocha.reporters.Base { getThreadLabel(this.getWorkerId()), ]; const metaLabels = getAllureMetaLabels(test); + const links = getAllureMetaLinks(test); const labels = globalLabels.concat(initialLabels, metaLabels); if (test.file) { const packageLabel: Label = getPackageLabel(test.file); + labels.push(packageLabel); } const scopeUuid = this.runtime.startScope(); + setTestScope(test, scopeUuid); // @ts-ignore @@ -207,6 +211,7 @@ export class AllureMochaReporter extends Mocha.reporters.Base { stage: Stage.RUNNING, fullName: getAllureFullName(test), labels, + links: [...links], testCaseId: getTestCaseId(test), parameters: parameters, }, diff --git a/packages/allure-mocha/src/types.ts b/packages/allure-mocha/src/types.ts index 7b8581b7a..db3ed1e22 100644 --- a/packages/allure-mocha/src/types.ts +++ b/packages/allure-mocha/src/types.ts @@ -1,5 +1,5 @@ import type { ReporterConstructor } from "mocha"; -import type { Label } from "allure-js-commons"; +import type { Label, Link } from "allure-js-commons"; import type { ReporterConfig } from "allure-js-commons/sdk/reporter"; export type TestPlanIndices = { @@ -11,6 +11,7 @@ export type AllureMochaTestData = { isIncludedInTestRun: boolean; fullName: string; labels: readonly Label[]; + links: readonly Link[]; displayName: string; scope?: string; }; diff --git a/packages/allure-mocha/src/utils.ts b/packages/allure-mocha/src/utils.ts index e87ec0229..3b81010e2 100644 --- a/packages/allure-mocha/src/utils.ts +++ b/packages/allure-mocha/src/utils.ts @@ -13,17 +13,22 @@ const allureMochaDataKey = Symbol("Used to access Allure extra data in Mocha obj const getAllureData = (item: Mocha.Test): AllureMochaTestData => { const data = (item as any)[allureMochaDataKey]; + if (!data) { const meta = extractMetadataFromString(item.title); const defaultData: AllureMochaTestData = { isIncludedInTestRun: true, fullName: createAllureFullName(item), labels: meta.labels, + links: meta.links, displayName: meta.cleanTitle, }; + (item as any)[allureMochaDataKey] = defaultData; + return defaultData; } + return data; }; @@ -55,6 +60,8 @@ export const isIncludedInTestRun = (test: Mocha.Test) => getAllureData(test).isI export const getAllureMetaLabels = (test: Mocha.Test) => getAllureData(test).labels; +export const getAllureMetaLinks = (test: Mocha.Test) => getAllureData(test).links; + export const getAllureId = (data: AllureMochaTestData) => { const values = data.labels.filter((l) => l.name === LabelName.ALLURE_ID).map((l) => l.value); if (values.length) { diff --git a/packages/allure-mocha/test/samples/spec/links/meta/multiple.spec.js b/packages/allure-mocha/test/samples/spec/links/meta/multiple.spec.js new file mode 100644 index 000000000..65e8d376e --- /dev/null +++ b/packages/allure-mocha/test/samples/spec/links/meta/multiple.spec.js @@ -0,0 +1,4 @@ +// cjs: const { it } = require("mocha"); +// esm: import { it } from "mocha"; + +it("a test two embedded custom link @allure.link.foo=bar @allure.link.baz:qux", async () => {}); diff --git a/packages/allure-mocha/test/samples/spec/links/meta/single.spec.js b/packages/allure-mocha/test/samples/spec/links/meta/single.spec.js new file mode 100644 index 000000000..fae0b8ff7 --- /dev/null +++ b/packages/allure-mocha/test/samples/spec/links/meta/single.spec.js @@ -0,0 +1,4 @@ +// cjs: const { it } = require("mocha"); +// esm: import { it } from "mocha"; + +it("a test with an embedded custom link @allure.link.foo:bar", async () => {}); diff --git a/packages/allure-mocha/test/spec/api/metadata.test.ts b/packages/allure-mocha/test/spec/api/metadata.test.ts index c131419af..cac31048f 100644 --- a/packages/allure-mocha/test/spec/api/metadata.test.ts +++ b/packages/allure-mocha/test/spec/api/metadata.test.ts @@ -10,6 +10,8 @@ describe("embedded metadata", () => { ["labels", "meta", "single"], ["labels", "meta", "multiple"], ["labels", "meta", "change"], + ["links", "meta", "single"], + ["links", "meta", "multiple"], )); }); @@ -68,4 +70,36 @@ describe("embedded metadata", () => { expect(testCaseIdBefore).toBe(testCaseIdAfter); expect(historyIdBefore).toBe(historyIdAfter); }); + + it("may apply a custom link", () => { + expect(tests).toContainEqual( + expect.objectContaining({ + name: "a test with an embedded custom link", + links: expect.arrayContaining([ + { + type: "foo", + url: "bar", + }, + ]), + }), + ); + }); + + it("may apply multiple links", () => { + expect(tests).toContainEqual( + expect.objectContaining({ + name: "a test two embedded custom link", + links: expect.arrayContaining([ + { + type: "foo", + url: "bar", + }, + { + type: "baz", + url: "qux", + }, + ]), + }), + ); + }); }); diff --git a/packages/allure-mocha/test/utils.ts b/packages/allure-mocha/test/utils.ts index 809c9a068..a7fb6e13d 100644 --- a/packages/allure-mocha/test/utils.ts +++ b/packages/allure-mocha/test/utils.ts @@ -350,6 +350,7 @@ export const runMochaInlineTest = async ( ...samples: (string | string[])[] ) => { let options: MochaRunOptions; + if (typeof sampleOrConfig === "object" && !(sampleOrConfig instanceof Array)) { options = sampleOrConfig; } else { diff --git a/packages/allure-playwright/test/spec/titleMetadata.spec.ts b/packages/allure-playwright/test/spec/titleMetadata.spec.ts index 3ced68b25..199afda66 100644 --- a/packages/allure-playwright/test/spec/titleMetadata.spec.ts +++ b/packages/allure-playwright/test/spec/titleMetadata.spec.ts @@ -21,9 +21,7 @@ it("has metadata from title", async () => { { name: LabelName.TAG, value: "slow" }, { name: "labelName", value: "labelValue" }, ]), - links: expect.arrayContaining([ - { type: "my_link", url: "https://allurereport.org" }, - ]), + links: expect.arrayContaining([{ type: "my_link", url: "https://allurereport.org" }]), }), ]); }); diff --git a/packages/allure-vitest/test/spec/titleMetadata.test.ts b/packages/allure-vitest/test/spec/titleMetadata.test.ts index 7c4f845dd..2d9169a61 100644 --- a/packages/allure-vitest/test/spec/titleMetadata.test.ts +++ b/packages/allure-vitest/test/spec/titleMetadata.test.ts @@ -20,9 +20,7 @@ describe("title metadata", () => { { name: LabelName.ALLURE_ID, value: "1" }, { name: "bar", value: "2" }, ]), - links: expect.arrayContaining([ - { type: "my_link", url: "https://allurereport.org" }, - ]) + links: expect.arrayContaining([{ type: "my_link", url: "https://allurereport.org" }]), }); }); }); diff --git a/packages/newman-reporter-allure/test/spec/simple.test.ts b/packages/newman-reporter-allure/test/spec/simple.test.ts index e3e4c6a17..ba3017572 100644 --- a/packages/newman-reporter-allure/test/spec/simple.test.ts +++ b/packages/newman-reporter-allure/test/spec/simple.test.ts @@ -91,9 +91,7 @@ test("complex test overview", async () => { { name: LabelName.ALLURE_ID, value: "228" }, { name: "custom", value: "test" }, ]), - links: expect.arrayContaining([ - { type: "my_link", url: "https://allurereport.org" }, - ]), + links: expect.arrayContaining([{ type: "my_link", url: "https://allurereport.org" }]), parameters: expect.arrayContaining([ expect.objectContaining({ name: "Request", value: "GET - http://example.com/test?dfgdfg" }), expect.objectContaining({ name: "Response Code", value: "200", excluded: true }),