UNPKG

@allurereport/web-awesome

Version:

The static files for Allure Awesome Report

183 lines (156 loc) 5.15 kB
import type { FlatTreeNode } from "@allurereport/web-commons"; import type { TrBodyItem } from "@/components/TestResult/bodyItems"; import { hasTestLevelErrorContent } from "@/components/TestResult/bodyItems"; import { getStepTreeExpansionPolicy, hasStepContent, isStepOpenedByDefault, type StepTreeExpansion, } from "@/components/TestResult/TrSteps/stepTreeExpansion"; export type FlattenTestResultOverviewInput = { testResultId: string; hasSetup: boolean; setupBodyItems: TrBodyItem[]; bodyItems: TrBodyItem[]; hasTeardown: boolean; teardownBodyItems: TrBodyItem[]; isGroupOpened: (id: string, openedByDefault: boolean) => boolean; stepExpansionPolicy?: StepTreeExpansion; }; const sectionId = (testResultId: string, section: string) => `${testResultId}-${section}`; const pushSection = ( result: FlatTreeNode[], options: { id: string; depth: number; parentId?: string; openedByDefault?: boolean; isGroupOpened: FlattenTestResultOverviewInput["isGroupOpened"]; }, ) => { const openedByDefault = options.openedByDefault ?? true; const isExpanded = options.isGroupOpened(options.id, openedByDefault); result.push({ kind: "group", id: options.id, nodeId: options.id, depth: options.depth, parentId: options.parentId, hasChildren: true, isExpanded, openedByDefault, }); }; const flattenBodyItems = ( bodyItems: TrBodyItem[], depth: number, parentId: string, policy: StepTreeExpansion, isGroupOpened: FlattenTestResultOverviewInput["isGroupOpened"], ): FlatTreeNode[] => { const result: FlatTreeNode[] = []; for (const bodyItem of bodyItems) { if (bodyItem.type === "step") { const stepId = bodyItem.item.stepId; const openedByDefault = isStepOpenedByDefault(policy, bodyItem.item.status, bodyItem.bodyItems); const hasContent = hasStepContent(bodyItem); const isExpanded = isGroupOpened(stepId, openedByDefault); result.push({ kind: hasContent ? "group" : "leaf", id: stepId, nodeId: stepId, depth, parentId, hasChildren: hasContent, isExpanded: hasContent ? isExpanded : undefined, openedByDefault, }); if (hasContent && isExpanded) { result.push(...flattenBodyItems(bodyItem.bodyItems, depth + 1, stepId, policy, isGroupOpened)); } continue; } if (bodyItem.type === "error" && hasTestLevelErrorContent(bodyItem.error)) { const openedByDefault = policy !== "collapsed"; const isExpanded = isGroupOpened(bodyItem.id, openedByDefault); result.push({ kind: "group", id: bodyItem.id, nodeId: bodyItem.id, depth, parentId, hasChildren: true, isExpanded, openedByDefault, }); continue; } if (bodyItem.type === "attachment") { const attachmentTreeId = `attachment-${bodyItem.link.id}`; result.push({ kind: "leaf", id: bodyItem.link.id, nodeId: attachmentTreeId, depth, parentId, openedByDefault: false, }); } } return result; }; export const flattenTestResultOverview = (input: FlattenTestResultOverviewInput): FlatTreeNode[] => { const { testResultId, hasSetup, setupBodyItems, bodyItems, hasTeardown, teardownBodyItems, isGroupOpened } = input; const policy = input.stepExpansionPolicy ?? getStepTreeExpansionPolicy(); const result: FlatTreeNode[] = []; let lastSectionId: string | undefined; const appendSection = (section: string, openedByDefault = true) => { const id = sectionId(testResultId, section); pushSection(result, { id, depth: 0, parentId: lastSectionId, openedByDefault, isGroupOpened, }); lastSectionId = id; return id; }; if (hasSetup) { const setupId = appendSection("setup"); if (isGroupOpened(setupId, true) && setupBodyItems.length > 0) { const setupSteps = flattenBodyItems(setupBodyItems, 1, setupId, policy, isGroupOpened); result.push(...setupSteps); if (setupSteps.length > 0) { lastSectionId = setupSteps[setupSteps.length - 1]!.id; } } } if (bodyItems.length > 0) { const stepsId = sectionId(testResultId, "steps"); const stepsOpenedByDefault = policy !== "collapsed"; const stepsExpanded = isGroupOpened(stepsId, stepsOpenedByDefault); pushSection(result, { id: stepsId, depth: 0, parentId: lastSectionId, openedByDefault: stepsOpenedByDefault, isGroupOpened, }); lastSectionId = stepsId; if (stepsExpanded) { const stepNodes = flattenBodyItems(bodyItems, 1, stepsId, policy, isGroupOpened); result.push(...stepNodes); if (stepNodes.length > 0) { lastSectionId = stepNodes[stepNodes.length - 1]!.id; } } } if (hasTeardown) { const teardownId = appendSection("teardown"); if (isGroupOpened(teardownId, true) && teardownBodyItems.length > 0) { result.push(...flattenBodyItems(teardownBodyItems, 1, teardownId, policy, isGroupOpened)); } } return result; };