This commit is contained in:
Tiara Rodney 2026-03-15 03:02:41 +01:00
commit 932d4ad420
No known key found for this signature in database
GPG key ID: 5CD8EC1D46106723
46 changed files with 5800 additions and 0 deletions

View file

@ -0,0 +1,87 @@
import { describe, it, expect } from "vitest"
import {
statusToBugzilla,
priorityToBugzilla,
typeToBugzilla,
issueToBugzillaCreate,
resolveProductComponent,
} from "../../../lib/bugzilla/fieldmap"
import type { Issue } from "../../../lib/issue"
import type { BugzillaTracker } from "../../../lib/tracker"
describe("status mapping", () => {
it("maps TODO statuses to Bugzilla", () => {
expect(statusToBugzilla("open")).toEqual({ status: "CONFIRMED" })
expect(statusToBugzilla("in-progress")).toEqual({ status: "IN_PROGRESS" })
expect(statusToBugzilla("done")).toEqual({ status: "RESOLVED", resolution: "FIXED" })
expect(statusToBugzilla("hold")).toEqual({ status: "RESOLVED", resolution: "LATER" })
expect(statusToBugzilla("cancelled")).toEqual({ status: "RESOLVED", resolution: "WONTFIX" })
})
})
describe("priority mapping", () => {
it("maps TODO priorities to Bugzilla", () => {
expect(priorityToBugzilla("low")).toBe("Low")
expect(priorityToBugzilla("medium")).toBe("Normal")
expect(priorityToBugzilla("high")).toBe("Highest")
})
})
describe("type/severity mapping", () => {
it("maps TODO types to Bugzilla severity", () => {
expect(typeToBugzilla("feature")).toBe("enhancement")
expect(typeToBugzilla("bugfix")).toBe("normal")
expect(typeToBugzilla("hotfix")).toBe("critical")
})
})
describe("issueToBugzillaCreate", () => {
it("converts a TODO issue to a Bugzilla create payload", () => {
const issue: Issue = {
id: 1,
type: "feature",
title: "Add streaming parser",
status: "open",
priority: "high",
created: "2026-02-05",
relationships: { dependsOn: [3] },
description: "Implement streaming JSON parser.",
body: "",
}
const payload = issueToBugzillaCreate(issue, "MyProduct", "MyComponent", "https://example.com/TODO#1")
expect(payload.product).toBe("MyProduct")
expect(payload.component).toBe("MyComponent")
expect(payload.summary).toBe("Add streaming parser")
expect(payload.url).toBe("https://example.com/TODO#1")
expect(payload.priority).toBe("Highest")
expect(payload.severity).toBe("enhancement")
expect(payload.depends_on).toEqual([3])
})
})
describe("resolveProductComponent", () => {
const tracker: BugzillaTracker = {
url: "https://bugzilla.example.com",
mappings: [
{ module: "General", product: "MyProject", component: "General" },
{ module: "Frontend", product: "MyProject", component: "Frontend" },
],
}
it("resolves product/component from issue module", () => {
const issue = { module: "Frontend" } as Issue
const result = resolveProductComponent(issue, tracker)
expect(result).toEqual({ product: "MyProject", component: "Frontend" })
})
it("falls back to first mapping when no module set", () => {
const issue = {} as Issue
const result = resolveProductComponent(issue, tracker)
expect(result).toEqual({ product: "MyProject", component: "General" })
})
it("returns null when no tracker", () => {
expect(resolveProductComponent({} as Issue, undefined)).toBeNull()
})
})