feat(FN-2625): merge fusion/fn-2625
This commit is contained in:
@@ -1059,6 +1059,19 @@ describe.skip("fn pi extension", () => {
|
|||||||
"api",
|
"api",
|
||||||
"repos/acme/demo/issues?state=open&per_page=5",
|
"repos/acme/demo/issues?state=open&per_page=5",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const store = new TaskStore(tmpDir, join(tmpDir, ".fusion-global-settings"));
|
||||||
|
await store.init();
|
||||||
|
const tasks = await store.listTasks({ includeArchived: true });
|
||||||
|
expect(tasks).toHaveLength(2);
|
||||||
|
const issueOneTask = tasks.find((task) => task.sourceIssue?.issueNumber === 1);
|
||||||
|
expect(issueOneTask?.sourceIssue).toEqual({
|
||||||
|
provider: "github",
|
||||||
|
repository: "acme/demo",
|
||||||
|
externalIssueId: "1",
|
||||||
|
issueNumber: 1,
|
||||||
|
url: "https://github.com/acme/demo/issues/1",
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("fn_task_browse_github_issues lists issues via gh api", async () => {
|
it("fn_task_browse_github_issues lists issues via gh api", async () => {
|
||||||
|
|||||||
@@ -922,12 +922,26 @@ describe("runTaskImportGitHubInteractive", () => {
|
|||||||
description: "Description 1\n\nSource: https://github.com/owner/repo/issues/1",
|
description: "Description 1\n\nSource: https://github.com/owner/repo/issues/1",
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "1",
|
||||||
|
issueNumber: 1,
|
||||||
|
url: "https://github.com/owner/repo/issues/1",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
expect(mockCreateTask).toHaveBeenCalledWith({
|
expect(mockCreateTask).toHaveBeenCalledWith({
|
||||||
title: "Third Issue",
|
title: "Third Issue",
|
||||||
description: "Description 3\n\nSource: https://github.com/owner/repo/issues/3",
|
description: "Description 3\n\nSource: https://github.com/owner/repo/issues/3",
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "3",
|
||||||
|
issueNumber: 3,
|
||||||
|
url: "https://github.com/owner/repo/issues/3",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -978,6 +992,13 @@ describe("runTaskImportGitHubInteractive", () => {
|
|||||||
description: "Description 2\n\nSource: https://github.com/owner/repo/issues/2",
|
description: "Description 2\n\nSource: https://github.com/owner/repo/issues/2",
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "2",
|
||||||
|
issueNumber: 2,
|
||||||
|
url: "https://github.com/owner/repo/issues/2",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const skipLine = logSpy.mock.calls.find(
|
const skipLine = logSpy.mock.calls.find(
|
||||||
@@ -1224,6 +1245,13 @@ describe("runTaskImportFromGitHub", () => {
|
|||||||
description: "Description 1\n\nSource: https://github.com/owner/repo/issues/1",
|
description: "Description 1\n\nSource: https://github.com/owner/repo/issues/1",
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "1",
|
||||||
|
issueNumber: 1,
|
||||||
|
url: "https://github.com/owner/repo/issues/1",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const successLine = logSpy.mock.calls.find(
|
const successLine = logSpy.mock.calls.find(
|
||||||
@@ -1299,6 +1327,13 @@ describe("runTaskImportFromGitHub", () => {
|
|||||||
description: "(no description)\n\nSource: https://github.com/owner/repo/issues/1",
|
description: "(no description)\n\nSource: https://github.com/owner/repo/issues/1",
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "1",
|
||||||
|
issueNumber: 1,
|
||||||
|
url: "https://github.com/owner/repo/issues/1",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1313,6 +1348,13 @@ describe("runTaskImportFromGitHub", () => {
|
|||||||
description: expect.stringContaining("Body"),
|
description: expect.stringContaining("Body"),
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "1",
|
||||||
|
issueNumber: 1,
|
||||||
|
url: "https://github.com/owner/repo/issues/1",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -820,6 +820,13 @@ export async function runTaskImportGitHubInteractive(
|
|||||||
description,
|
description,
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: `${owner}/${repo}`,
|
||||||
|
externalIssueId: String(issue.number),
|
||||||
|
issueNumber: issue.number,
|
||||||
|
url: issue.html_url,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const label = task.title || task.description.slice(0, 60) + (task.description.length > 60 ? "…" : "");
|
const label = task.title || task.description.slice(0, 60) + (task.description.length > 60 ? "…" : "");
|
||||||
@@ -956,6 +963,13 @@ export async function runTaskImportFromGitHub(
|
|||||||
description,
|
description,
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: `${owner}/${repo}`,
|
||||||
|
externalIssueId: String(issue.number),
|
||||||
|
issueNumber: issue.number,
|
||||||
|
url: issue.html_url,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const label = task.title || task.description.slice(0, 60) + (task.description.length > 60 ? "…" : "");
|
const label = task.title || task.description.slice(0, 60) + (task.description.length > 60 ? "…" : "");
|
||||||
|
|||||||
@@ -801,6 +801,13 @@ export default function kbExtension(pi: ExtensionAPI) {
|
|||||||
description,
|
description,
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: `${owner}/${repo}`,
|
||||||
|
externalIssueId: String(issue.number),
|
||||||
|
issueNumber: issue.number,
|
||||||
|
url: issue.html_url,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await store.logEntry(task.id, "Imported from GitHub", sourceUrl);
|
await store.logEntry(task.id, "Imported from GitHub", sourceUrl);
|
||||||
@@ -887,6 +894,13 @@ export default function kbExtension(pi: ExtensionAPI) {
|
|||||||
description,
|
description,
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: `${owner}/${repo}`,
|
||||||
|
externalIssueId: String(issue.number),
|
||||||
|
issueNumber: issue.number,
|
||||||
|
url: issue.html_url,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await store.logEntry(task.id, "Imported from GitHub", sourceUrl);
|
await store.logEntry(task.id, "Imported from GitHub", sourceUrl);
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
"types": ["node", "vitest/globals"],
|
"types": ["node", "vitest/globals"],
|
||||||
"jsx": "react-jsx",
|
"jsx": "react-jsx",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@fusion/test-utils": ["../core/src/__test-utils__/workspace.ts"]
|
"@fusion/test-utils": ["../core/src/__test-utils__/workspace.ts"],
|
||||||
|
"node-pty": ["../dashboard/src/types/node-pty/index.d.ts"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"],
|
"include": ["src/**/*"],
|
||||||
|
|||||||
@@ -6146,6 +6146,13 @@ describe("POST /github/issues/import", () => {
|
|||||||
description: "Test body\n\nSource: https://github.com/owner/repo/issues/1",
|
description: "Test body\n\nSource: https://github.com/owner/repo/issues/1",
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "1",
|
||||||
|
issueNumber: 1,
|
||||||
|
url: "https://github.com/owner/repo/issues/1",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -6240,6 +6247,13 @@ describe("POST /github/issues/import", () => {
|
|||||||
description: expect.stringContaining("Source:"),
|
description: expect.stringContaining("Source:"),
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "1",
|
||||||
|
issueNumber: 1,
|
||||||
|
url: "https://github.com/owner/repo/issues/1",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -6317,6 +6331,33 @@ describe("POST /github/issues/batch-import", () => {
|
|||||||
expect(res.body.results.every((r: { success: boolean }) => r.success)).toBe(true);
|
expect(res.body.results.every((r: { success: boolean }) => r.success)).toBe(true);
|
||||||
expect(throttledSpy).toHaveBeenCalledTimes(3);
|
expect(throttledSpy).toHaveBeenCalledTimes(3);
|
||||||
expect(store.createTask).toHaveBeenCalledTimes(3);
|
expect(store.createTask).toHaveBeenCalledTimes(3);
|
||||||
|
expect(store.createTask).toHaveBeenNthCalledWith(1, expect.objectContaining({
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "1",
|
||||||
|
issueNumber: 1,
|
||||||
|
url: "https://github.com/owner/repo/issues/1",
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
expect(store.createTask).toHaveBeenNthCalledWith(2, expect.objectContaining({
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "2",
|
||||||
|
issueNumber: 2,
|
||||||
|
url: "https://github.com/owner/repo/issues/2",
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
expect(store.createTask).toHaveBeenNthCalledWith(3, expect.objectContaining({
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: "owner/repo",
|
||||||
|
externalIssueId: "3",
|
||||||
|
issueNumber: 3,
|
||||||
|
url: "https://github.com/owner/repo/issues/3",
|
||||||
|
},
|
||||||
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
it("skips already-imported issues", async () => {
|
it("skips already-imported issues", async () => {
|
||||||
|
|||||||
@@ -2079,6 +2079,13 @@ export function registerGitGitHubRoutes(ctx: ApiRoutesContext): void {
|
|||||||
description,
|
description,
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: `${owner}/${repo}`,
|
||||||
|
externalIssueId: String(issue.number),
|
||||||
|
issueNumber: issue.number,
|
||||||
|
url: issue.html_url,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// Log the import action
|
// Log the import action
|
||||||
@@ -2208,6 +2215,13 @@ export function registerGitGitHubRoutes(ctx: ApiRoutesContext): void {
|
|||||||
description,
|
description,
|
||||||
column: "triage",
|
column: "triage",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
sourceIssue: {
|
||||||
|
provider: "github",
|
||||||
|
repository: `${owner}/${repo}`,
|
||||||
|
externalIssueId: String(issue.number),
|
||||||
|
issueNumber: issue.number,
|
||||||
|
url: issue.html_url,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// Log the import action
|
// Log the import action
|
||||||
|
|||||||
Reference in New Issue
Block a user