From a619cfe8b3d4bf0c402b5392423c78b044eb57c5 Mon Sep 17 00:00:00 2001 From: Dmitrii Evreinov Date: Thu, 16 Jul 2026 16:16:58 +0400 Subject: [PATCH] fix tr fileName duplicating --- packages/core/src/store/store.ts | 25 +++++++++++++- packages/core/test/store/store.test.ts | 47 ++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/packages/core/src/store/store.ts b/packages/core/src/store/store.ts index 086b7cc70fe..3e9d62458cb 100644 --- a/packages/core/src/store/store.ts +++ b/packages/core/src/store/store.ts @@ -82,6 +82,12 @@ const index = (indexMap: Map, key: string | undefined, ...items: } }; +const originalFileNameFromMetadata = (metadata: ReaderContext["metadata"]): string | undefined => { + const { originalFileName } = metadata ?? {}; + + return typeof originalFileName === "string" && originalFileName.length > 0 ? originalFileName : undefined; +}; + export const mapToObject = (map: Map): Record => { const result: Record = {}; @@ -535,6 +541,23 @@ export class DefaultAllureStore implements AllureStore, ResultsVisitor { return md5(environmentId ? `${environmentId}:${originalFileName}` : originalFileName); } + #deduplicateTestResultId(testResult: TestResult, raw: RawTestResult, context: ReaderContext) { + const existing = this.#testResults.get(testResult.id); + + if (!existing || !raw.uuid) { + return; + } + + const incomingFileName = originalFileNameFromMetadata(context.metadata); + const existingFileName = originalFileNameFromMetadata(existing.sourceMetadata.metadata); + + if (!incomingFileName || incomingFileName === existingFileName) { + return; + } + + testResult.id = md5(`${raw.uuid}:${incomingFileName}`); + } + #indexGlobalError(error: PluginGlobalError) { const resolvedEnvironment = this.#resolveGlobalEnvironmentIdentity(error.environment); @@ -791,7 +814,7 @@ export class DefaultAllureStore implements AllureStore, ResultsVisitor { testResult.environment = environmentIdentity.name; this.#addEnvironments([environmentIdentity]); - + this.#deduplicateTestResultId(testResult, raw, context); const parametersHash = typeof raw.parametersHash === "string" && raw.parametersHash.length > 0 ? raw.parametersHash diff --git a/packages/core/test/store/store.test.ts b/packages/core/test/store/store.test.ts index adea0fcb8a8..56af6955d66 100644 --- a/packages/core/test/store/store.test.ts +++ b/packages/core/test/store/store.test.ts @@ -683,6 +683,53 @@ describe("test results", () => { expect(retries.map(({ name }) => name)).toEqual([retrySecond.name, retryFirst.name]); }); + it("keeps retry attempts with the same uuid from different result files", async () => { + const store = new DefaultAllureStore(); + const latest: RawTestResult = { + uuid: "same-raw-uuid", + name: "latest broken attempt", + fullName: "sample test", + status: "broken", + start: 2000, + }; + const retry: RawTestResult = { + uuid: "same-raw-uuid", + name: "older passed attempt", + fullName: "sample test", + status: "passed", + start: 1000, + }; + + await store.visitTestResult(latest, { readerId, metadata: { originalFileName: "latest-result.json" } }); + await store.visitTestResult(retry, { readerId, metadata: { originalFileName: "retry-result.json" } }); + + const visibleResults = await store.allTestResults(); + const allResults = await store.allTestResults({ includeRetries: true }); + const retries = await store.retriesByTrId(visibleResults[0].id); + const statistic = await store.testsStatistic(); + + expect(allResults).toHaveLength(2); + expect(visibleResults).toEqual([ + expect.objectContaining({ + name: latest.name, + status: "broken", + isRetry: false, + }), + ]); + expect(retries).toEqual([ + expect.objectContaining({ + name: retry.name, + status: "passed", + isRetry: true, + }), + ]); + expect(statistic).toMatchObject({ + total: 1, + retries: 1, + broken: 1, + }); + }); + it("should return retries only for the same retryHash and environment", async () => { const store = new DefaultAllureStore({ environmentsConfig: {