Skip to content

Commit

Permalink
Merge pull request #166 from bitovi/refactor/TR-75-ts-tests-blocked-s…
Browse files Browse the repository at this point in the history
…tatus-issues

Add ts and tests to blocked-status-issues
  • Loading branch information
DavidNic11 authored Oct 4, 2024
2 parents ce0a0d5 + 9f2aafd commit dc0e80c
Show file tree
Hide file tree
Showing 12 changed files with 917 additions and 216 deletions.
28 changes: 0 additions & 28 deletions public/jira/rollup/blocked-status-issues/blocked-status-issues.js

This file was deleted.

This file was deleted.

210 changes: 210 additions & 0 deletions public/jira/rollup/blocked-status-issues/blocked-status-issues.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
// sum.test.js
import { expect, test, describe, it } from "vitest";
import {
rollupBlockedIssuesForGroupedHierarchy,
rollupBlockedStatusIssues,
} from "./blocked-status-issues";
import { IssueOrRelease } from "../rollup";

describe("rollupBlockedIssuesForGroupedHierarchy", () => {
// due, dueTo {message, reference} .... {start,startFrom}
// alt: {start, end, startedFrom, endedBy}

it("does the basics", () => {
let i7;

const issuesAndReleases = (
[
[
{
key: "o-1",
parentKey: null,
derivedStatus: { statusType: "dev", workType: "dev" },
},
],
[
{
key: "m-2",
parentKey: "o-1",
derivedStatus: { statusType: "dev", workType: "dev" },
},
{
key: "m-3",
parentKey: "o-1",
derivedStatus: { statusType: "dev", workType: "dev" },
},
],
[
{
key: "i-4",
parentKey: "m-2",
derivedStatus: { statusType: "dev", workType: "dev" },
},
{
key: "i-5",
parentKey: "m-2",
derivedStatus: { statusType: "dev", workType: "dev" },
},
{
key: "i-6",
parentKey: "m-3",
derivedStatus: { statusType: "dev", workType: "dev" },
},
(i7 = {
key: "i-7",
parentKey: "m-3",
derivedStatus: { statusType: "blocked", workType: "dev" },
}),
],
] as IssueOrRelease[][]
).reverse();

const i7ReportingHierarchy = {
reportingHierarchy: {
childKeys: [],
depth: 2,
parentKeys: ["m-3"],
},
};

const results = rollupBlockedIssuesForGroupedHierarchy(issuesAndReleases);
expect(results).toStrictEqual([
{
rollupData: [
[],
[],
[],
[
{
...i7,
...i7ReportingHierarchy,
},
],
],
metadata: {},
},
{
rollupData: [
[],
[
{
...i7,
...i7ReportingHierarchy,
},
],
],
metadata: {},
},
{
rollupData: [
[
{
...i7,
...i7ReportingHierarchy,
},
],
],
metadata: {},
},
]);
});
});
describe("rollupBlockedStatusIssues", () => {
it("should correctly roll up blocked status issues", () => {
const i7 = {
key: "i-7",
type: "Epic",
hierarchyLevel: 1,
parentKey: "m-3",
derivedStatus: { statusType: "blocked", workType: "dev" },
};

const issuesAndReleases = [
{
key: "o-1",
type: "Release",
parentKey: null,
derivedStatus: { statusType: "dev", workType: "dev" },
},
{
key: "m-2",
type: "Initiative",
hierarchyLevel: 2,
parentKey: "o-1",
derivedStatus: { statusType: "dev", workType: "dev" },
},
{
key: "m-3",
type: "Initiative",
hierarchyLevel: 2,
parentKey: "o-1",
derivedStatus: { statusType: "dev", workType: "dev" },
},
{
key: "i-4",
type: "Epic",
hierarchyLevel: 1,
parentKey: "m-2",
derivedStatus: { statusType: "dev", workType: "dev" },
},
{
key: "i-5",
type: "Epic",
hierarchyLevel: 1,
parentKey: "m-2",
derivedStatus: { statusType: "dev", workType: "dev" },
},
{
key: "i-6",
type: "Epic",
hierarchyLevel: 1,
parentKey: "m-3",
derivedStatus: { statusType: "dev", workType: "dev" },
},
i7,
] as IssueOrRelease<{ blockedStatusIssues: IssueOrRelease[] }>[];

const rollupTimingLevelsAndCalculations = [
{ type: "Release" },
{ type: "Initiative", hierarchyLevel: 2 },
{ type: "Epic", hierarchyLevel: 1 },
];

const result = rollupBlockedStatusIssues(
issuesAndReleases,
rollupTimingLevelsAndCalculations
);
const issueMap = result.reduce((map, issue) => {
map[issue.key] = issue;
return map;
}, {} as { [key: string]: IssueOrRelease<{ blockedStatusIssues: IssueOrRelease[] }> });

const o1 = issueMap["o-1"];
const m2 = issueMap["m-2"];
const m3 = issueMap["m-3"];
const i4 = issueMap["i-4"];
const i5 = issueMap["i-5"];
const i6 = issueMap["i-6"];
const _i7 = issueMap["i-7"];

const blockedStatusIssues = [
{
...i7,
reportingHierarchy: {
childKeys: [],
depth: 2,
parentKeys: ["m-3"],
},
},
];
expect(i4?.blockedStatusIssues).toEqual([]);
expect(i5?.blockedStatusIssues).toEqual([]);
expect(i6?.blockedStatusIssues).toEqual([]);
expect(_i7?.blockedStatusIssues).toEqual(blockedStatusIssues);

expect(m2?.blockedStatusIssues).toEqual([]);
expect(m3?.blockedStatusIssues).toEqual(blockedStatusIssues);

expect(o1?.blockedStatusIssues).toEqual(blockedStatusIssues);
});
});
72 changes: 72 additions & 0 deletions public/jira/rollup/blocked-status-issues/blocked-status-issues.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/**
* This module provides functions to roll up blocked issues within a hierarchical structure.
* It identifies issues with a 'blocked' status and aggregates them up through the hierarchy levels.
**/
import {
rollupGroupedHierarchy,
groupIssuesByHierarchyLevelOrType,
zipRollupDataOntoGroupedData,
IssueOrRelease,
RollupResponse,
ReportingHierarchyIssueOrRelease,
isDerivedIssue,
} from "../rollup";
/** *
* @param {IssueOrRelease<CustomFields>[][]} groupedHierarchy - The grouped hierarchy of issues or releases, from low to high levels.
* @returns {RollupResponse<IssueOrRelease<CustomFields>[], Meta>} - The rolled-up blocked issues for each hierarchy level.
*/
export function rollupBlockedIssuesForGroupedHierarchy<CustomFields, Meta>(
groupedHierarchy: IssueOrRelease<CustomFields>[][]
): RollupResponse<IssueOrRelease<CustomFields>[], Meta> {
return rollupGroupedHierarchy<
CustomFields,
IssueOrRelease<CustomFields>[],
Meta
>(groupedHierarchy, {
createRollupDataFromParentAndChild(
issueOrRelease: ReportingHierarchyIssueOrRelease<CustomFields>,
children: IssueOrRelease<CustomFields>[][],
hierarchyLevel: number,
metadata: Meta
): IssueOrRelease<CustomFields>[] {
const blockedIssues = children.flat(1);
// releases don't have a status
if (
isDerivedIssue(issueOrRelease) &&
issueOrRelease?.derivedStatus?.statusType === "blocked"
) {
blockedIssues.push(issueOrRelease);
}
return blockedIssues;
},
});
}
/** *
* @param {IssueOrRelease<CustomFields>[]} issuesOrReleases
* @param {Array<{ type: string; hierarchyLevel: number }>} rollupTimingLevelsAndCalculations
* @returns {IssueOrRelease<CustomFields>[]} - The list of issues or releases with rolled-up blocked status issues added.
*/
// these functions shouldn't be used eventually for performance ...
export function rollupBlockedStatusIssues<CustomFields, Meta>(
issuesOrReleases: IssueOrRelease<CustomFields>[],
rollupTimingLevelsAndCalculations: Array<{
type: string;
hierarchyLevel?: number;
}>
): IssueOrRelease<CustomFields>[] {
const groupedIssues = groupIssuesByHierarchyLevelOrType(
issuesOrReleases,
rollupTimingLevelsAndCalculations
);
const rolledUpBlockers = rollupBlockedIssuesForGroupedHierarchy<
CustomFields,
Meta
>(groupedIssues);

const zipped = zipRollupDataOntoGroupedData<
CustomFields,
IssueOrRelease<CustomFields>[],
Meta
>(groupedIssues, rolledUpBlockers, "blockedStatusIssues");
return zipped.flat();
}
Loading

0 comments on commit dc0e80c

Please sign in to comment.