From 0fdacd0f20562c4882ec0c43f03b9e3be45f282b Mon Sep 17 00:00:00 2001 From: gentlementlegen Date: Fri, 18 Oct 2024 14:22:50 +0900 Subject: [PATCH 1/6] test: add unit test for handling push event Include test case to verify push event handler behavior. --- src/github/handlers/push-event.ts | 16 ++---- tests/events.test.ts | 89 ++++++++++++++++++++++++++++++- 2 files changed, 90 insertions(+), 15 deletions(-) diff --git a/src/github/handlers/push-event.ts b/src/github/handlers/push-event.ts index 5be0c26..2cf8f77 100644 --- a/src/github/handlers/push-event.ts +++ b/src/github/handlers/push-event.ts @@ -125,18 +125,8 @@ async function checkPluginConfigurations(context: GitHubContext<"push">, config: export default async function handlePushEvent(context: GitHubContext<"push">) { const { payload } = context; const { repository, commits, after } = payload; - const configPaths = [CONFIG_FULL_PATH, DEV_CONFIG_FULL_PATH]; - const didConfigurationFileChange = commits.some((commit) => - configPaths.some((path) => { - if (commit.modified?.includes(path) || commit.added?.includes(path)) { - // Keeps only the config that matched the modified elements - configPaths.length = 0; - configPaths.push(path); - return true; - } - return false; - }) - ); + const configPath = context.eventHandler.environment === "production" ? CONFIG_FULL_PATH : DEV_CONFIG_FULL_PATH; + const didConfigurationFileChange = commits.some((commit) => commit.modified?.includes(configPath) || commit.added?.includes(configPath)); if (!didConfigurationFileChange || !repository.owner) { return; @@ -154,7 +144,7 @@ export default async function handlePushEvent(context: GitHubContext<"push">) { try { if (errors.length) { const body = []; - body.push(...constructErrorBody(errors, rawData, repository, after, configPaths[0])); + body.push(...constructErrorBody(errors, rawData, repository, after, configPath)); await createCommitComment( context, { diff --git a/tests/events.test.ts b/tests/events.test.ts index 49f1eb3..d4d831c 100644 --- a/tests/events.test.ts +++ b/tests/events.test.ts @@ -5,6 +5,7 @@ import { http, HttpResponse } from "msw"; import { GitHubContext } from "../src/github/github-context"; import { GitHubEventHandler } from "../src/github/github-event-handler"; import issueCommentCreated from "../src/github/handlers/issue-comment-created"; +import handlePushEvent from "../src/github/handlers/push-event"; import { CONFIG_FULL_PATH } from "../src/github/utils/config"; import { server } from "./__mocks__/node"; import "./__mocks__/webhooks"; @@ -17,6 +18,8 @@ jest.mock("@octokit/auth-app", () => ({})); config({ path: ".dev.vars" }); +const name = "ubiquity-os-kernel"; + beforeAll(() => { server.listen(); }); @@ -107,7 +110,7 @@ describe("Event related tests", () => { payload: { repository: { owner: { login: "ubiquity" }, - name: "ubiquity-os-kernel", + name, }, issue: { number: 1 }, comment: { @@ -124,9 +127,91 @@ describe("Event related tests", () => { " all available commands. | `/help` |\n| `/action` | action | `/action` |\n| `/bar` | bar command | `/bar foo` |\n| `/foo` | foo command | `/foo bar` |", issue_number: 1, owner: "ubiquity", - repo: "ubiquity-os-kernel", + repo: name, }, ], ]); }); + it("should handle push event correctly", async () => { + const issues = { + createComment(params?: RestEndpointMethodTypes["issues"]["createComment"]["parameters"]) { + return params; + }, + }; + const createCommitComment = jest.fn(); + const context = { + id: "", + key: "issue_comment.created", + octokit: { + rest: { + issues, + repos: { + listCommentsForCommit: jest.fn(() => ({ data: [] })), + createCommitComment: createCommitComment, + getContent(params?: RestEndpointMethodTypes["repos"]["getContent"]["parameters"]) { + if (params?.path === CONFIG_FULL_PATH) { + return { + data: ` + plugins: + - name: "Run on comment created" + uses: + - id: plugin-A + plugin: https://plugin-a.internal + with: + arg: "true" + - name: "Some Action plugin" + uses: + - id: plugin-B + plugin: ubiquity-os/plugin-b + `, + }; + } else if (params?.path === "manifest.json") { + return { + data: { + content: btoa( + JSON.stringify({ + name: "plugin", + commands: { + action: { + description: "action", + "ubiquity:example": "/action", + }, + }, + configuration: { + default: {}, + type: "object", + properties: { + arg: { + type: "number", + }, + }, + required: ["arg"], + }, + }) + ), + }, + }; + } else { + throw new Error("Not found"); + } + }, + }, + }, + }, + eventHandler: eventHandler, + payload: { + repository: { + owner: { login: "ubiquity" }, + name, + }, + issue: { number: 1 }, + comment: { + body: "/help", + }, + commits: [{ modified: [CONFIG_FULL_PATH] }], + } as unknown as GitHubContext<"issue_comment.created">["payload"], + } as unknown as GitHubContext; + await expect(handlePushEvent(context)).resolves.not.toThrow(); + expect(createCommitComment).toBeCalledTimes(1); + }); }); From a3acebff41da8284adaa9669f4ca987969fe506d Mon Sep 17 00:00:00 2001 From: Mentlegen <9807008+gentlementlegen@users.noreply.github.com> Date: Sat, 19 Oct 2024 10:10:25 +0900 Subject: [PATCH 2/6] fix: add error handling to plugin dispatch Wrap the plugin dispatch in a try-catch to handle error. --- src/github/handlers/index.ts | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/github/handlers/index.ts b/src/github/handlers/index.ts index 0c7344e..3905d0e 100644 --- a/src/github/handlers/index.ts +++ b/src/github/handlers/index.ts @@ -98,16 +98,21 @@ async function handleEvent(event: EmitterWebhookEvent, eventHandler: InstanceTyp state.inputs[0] = inputs; await eventHandler.pluginChainState.put(stateId, state); - if (!isGithubPluginObject) { - await dispatchWorker(plugin, await inputs.getWorkerInputs()); - } else { - await dispatchWorkflow(context, { - owner: plugin.owner, - repository: plugin.repo, - workflowId: plugin.workflowId, - ref: plugin.ref, - inputs: await inputs.getWorkflowInputs(), - }); + // We wrap the dispatch so a failing plugin doesn't break the whole execution + try { + if (!isGithubPluginObject) { + await dispatchWorker(plugin, await inputs.getWorkerInputs()); + } else { + await dispatchWorkflow(context, { + owner: plugin.owner, + repository: plugin.repo, + workflowId: plugin.workflowId, + ref: plugin.ref, + inputs: await inputs.getWorkflowInputs(), + }); + } + } catch (e) { + console.error(`An error occurred while processing the plugin chain, will skip plugin ${JSON.stringify(plugin)}`, e); } } } From 4419cf0089dc2a89ed84bb3483cb3d03b59c3a81 Mon Sep 17 00:00:00 2001 From: Mentlegen <9807008+gentlementlegen@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:12:56 +0900 Subject: [PATCH 3/6] test: add dispatch tests for handling plugin chain errors Introduce tests for dispatch handling and plugin chain continuity. --- tests/dispatch.test.ts | 115 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 tests/dispatch.test.ts diff --git a/tests/dispatch.test.ts b/tests/dispatch.test.ts new file mode 100644 index 0000000..8023ad6 --- /dev/null +++ b/tests/dispatch.test.ts @@ -0,0 +1,115 @@ +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, jest } from "@jest/globals"; +import crypto from "crypto"; +import { server } from "./__mocks__/node"; +import { http, HttpResponse } from "msw"; +import { Octokit } from "@octokit/rest"; + +jest.mock("@octokit/plugin-paginate-rest", () => ({})); +jest.mock("@octokit/plugin-rest-endpoint-methods", () => ({})); +jest.mock("@octokit/plugin-retry", () => ({})); +jest.mock("@octokit/plugin-throttling", () => ({})); +jest.mock("@octokit/auth-app", () => ({})); + +function calculateSignature(payload: string, secret: string) { + return `sha256=${crypto.createHmac("sha256", secret).update(payload).digest("hex")}`; +} + +beforeAll(() => { + server.listen(); +}); +afterEach(() => { + server.resetHandlers(); +}); +afterAll(() => { + server.close(); +}); + +describe("handleEvent", () => { + beforeEach(() => { + server.use( + http.get("https://plugin-a.internal/manifest.json", () => + HttpResponse.json({ + name: "plugin", + commands: { + foo: { + description: "foo command", + "ubiquity:example": "/foo bar", + }, + bar: { + description: "bar command", + "ubiquity:example": "/bar foo", + }, + }, + }) + ), + http.get("https://api.github.com/repos/test-user/.ubiquity-os/contents/.github%2F.ubiquity-os.config.yml", () => + HttpResponse.json({ + type: "file", + encoding: "base64", + size: 536, + name: ".ubiquity-os.config.yml", + path: ".github/.ubiquity-os.config.yml", + content: Buffer.from(`plugins:\n - uses:\n - plugin: "https://plugin-a.internal"`).toString("base64"), + sha: "3ffce0fe837a21b1237acd38f7b1c3d2f7d73656", + url: "https://api.github.com/repos/test-user/.ubiquity-os/contents/.github%2F.ubiquity-os.config.yml", + git_url: "https://api.github.com/repos/test-user/.ubiquity-os/git/blobs/3ffce0fe837a21b1237acd38f7b1c3d2f7d73656", + html_url: "https://github.com/test-user/.ubiquity-os/blob/main/.github/.ubiquity-os.config.yml", + download_url: "https://raw.githubusercontent.com/test-user/.ubiquity-os/main/.github/.ubiquity-os.config.yml", + }) + ) + ); + }); + + it("should not stop the plugin chain if dispatch throws an error", async () => { + jest.mock("../src/github/github-client", () => { + return { + customOctokit: jest.fn().mockReturnValue(new Octokit()), + }; + }); + const payload = { + installation: { + id: 1, + }, + sender: { + type: "User", + }, + comment: { + body: "/foo", + }, + repository: { + id: 123456, + name: ".ubiquity-os", + full_name: "test-user/.ubiquity-os", + owner: { + login: "test-user", + id: 654321, + }, + }, + }; + const secret = "1234"; + const payloadString = JSON.stringify(payload); + const signature = calculateSignature(payloadString, secret); + + const req = new Request("http://localhost:8080", { + method: "POST", + headers: { + "x-github-event": "issue_comment.created", + "x-hub-signature-256": signature, + "x-github-delivery": "mocked_delivery_id", + "content-type": "application/json", + }, + body: payloadString, + }); + + const worker = (await import("../src/worker")).default; + const res = await worker.fetch(req, { + ENVIRONMENT: "production", + APP_WEBHOOK_SECRET: secret, + APP_ID: "1", + APP_PRIVATE_KEY: "1234", + PLUGIN_CHAIN_STATE: {} as KVNamespace, + }); + + expect(res).toBeTruthy(); + }); +}); From be6626c7fd9d6621d7ba04c9c8544502a9e80af2 Mon Sep 17 00:00:00 2001 From: Mentlegen <9807008+gentlementlegen@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:52:53 +0900 Subject: [PATCH 4/6] test: enhance mocks and add failure handling in dispatch tests Adjusted mocks for several modules and introduced failure handling for improved test robustness. --- tests/dispatch.test.ts | 81 +++++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 16 deletions(-) diff --git a/tests/dispatch.test.ts b/tests/dispatch.test.ts index 8023ad6..029ea35 100644 --- a/tests/dispatch.test.ts +++ b/tests/dispatch.test.ts @@ -8,7 +8,37 @@ jest.mock("@octokit/plugin-paginate-rest", () => ({})); jest.mock("@octokit/plugin-rest-endpoint-methods", () => ({})); jest.mock("@octokit/plugin-retry", () => ({})); jest.mock("@octokit/plugin-throttling", () => ({})); -jest.mock("@octokit/auth-app", () => ({})); +jest.mock("@octokit/auth-app", () => ({ + createAppAuth: jest.fn(() => () => jest.fn(() => "1234")), +})); + +jest.mock("../src/github/utils/cloudflare-kv", () => ({ + CloudflareKv: jest.fn().mockImplementation(() => ({ + get: jest.fn(), + put: jest.fn(), + })), +})); + +jest.mock("../src/github/types/plugin", () => { + const originalModule: typeof import("../src/github/types/plugin") = jest.requireActual("../src/github/types/plugin"); + + return { + ...originalModule, + PluginInput: class extends originalModule.PluginInput { + async getWorkerInputs() { + return { + stateId: this.stateId, + eventName: this.eventName, + eventPayload: this.eventPayload, + settings: this.settings, + authToken: this.authToken, + ref: this.ref, + signature: "", + }; + } + }, + }; +}); function calculateSignature(payload: string, secret: string) { return `sha256=${crypto.createHmac("sha256", secret).update(payload).digest("hex")}`; @@ -30,6 +60,7 @@ describe("handleEvent", () => { http.get("https://plugin-a.internal/manifest.json", () => HttpResponse.json({ name: "plugin", + "ubiquity:listeners": ["issue_comment.created"], commands: { foo: { description: "foo command", @@ -42,21 +73,27 @@ describe("handleEvent", () => { }, }) ), - http.get("https://api.github.com/repos/test-user/.ubiquity-os/contents/.github%2F.ubiquity-os.config.yml", () => - HttpResponse.json({ - type: "file", - encoding: "base64", - size: 536, - name: ".ubiquity-os.config.yml", - path: ".github/.ubiquity-os.config.yml", - content: Buffer.from(`plugins:\n - uses:\n - plugin: "https://plugin-a.internal"`).toString("base64"), - sha: "3ffce0fe837a21b1237acd38f7b1c3d2f7d73656", - url: "https://api.github.com/repos/test-user/.ubiquity-os/contents/.github%2F.ubiquity-os.config.yml", - git_url: "https://api.github.com/repos/test-user/.ubiquity-os/git/blobs/3ffce0fe837a21b1237acd38f7b1c3d2f7d73656", - html_url: "https://github.com/test-user/.ubiquity-os/blob/main/.github/.ubiquity-os.config.yml", - download_url: "https://raw.githubusercontent.com/test-user/.ubiquity-os/main/.github/.ubiquity-os.config.yml", - }) - ) + http.get("https://api.github.com/repos/test-user/.ubiquity-os/contents/.github%2F.ubiquity-os.config.yml", (req) => { + const acceptHeader = req.request.headers.get("accept"); + const yamlContent = `plugins:\n - uses:\n - plugin: "https://plugin-a.internal"\n - uses:\n - plugin: "https://plugin-a.internal"`; + if (acceptHeader === "application/vnd.github.v3.raw") { + return HttpResponse.text(yamlContent); + } else { + return HttpResponse.json({ + type: "file", + encoding: "base64", + size: 62, + name: ".ubiquity-os.config.yml", + path: ".github/.ubiquity-os.config.yml", + content: Buffer.from(yamlContent).toString("base64"), + sha: "3ffce0fe837a21b1237acd38f7b1c3d2f7d73656", + url: "https://api.github.com/repos/test-user/.ubiquity-os/contents/.github%2F.ubiquity-os.config.yml", + git_url: "https://api.github.com/repos/test-user/.ubiquity-os/git/blobs/3ffce0fe837a21b1237acd38f7b1c3d2f7d73656", + html_url: "https://github.com/test-user/.ubiquity-os/blob/main/.github/.ubiquity-os.config.yml", + download_url: "https://raw.githubusercontent.com/test-user/.ubiquity-os/main/.github/.ubiquity-os.config.yml", + }); + } + }) ); }); @@ -66,6 +103,16 @@ describe("handleEvent", () => { customOctokit: jest.fn().mockReturnValue(new Octokit()), }; }); + const dispatchWorker = jest + .fn() + .mockImplementationOnce(() => { + throw new Error("Test induced first call failure"); + }) + .mockImplementationOnce(() => Promise.resolve("success")); + jest.mock("../src/github/utils/workflow-dispatch", () => ({ + ...(jest.requireActual("../src/github/utils/workflow-dispatch") as object), + dispatchWorker: dispatchWorker, + })); const payload = { installation: { id: 1, @@ -111,5 +158,7 @@ describe("handleEvent", () => { }); expect(res).toBeTruthy(); + // 2 calls means the execution didn't break + expect(dispatchWorker).toHaveBeenCalledTimes(2); }); }); From bbd30c33a86672c02f01450daa895a96c22a0ecf Mon Sep 17 00:00:00 2001 From: Mentlegen <9807008+gentlementlegen@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:54:52 +0900 Subject: [PATCH 5/6] chore: add @octokit/rest dependency Add @octokit/rest version ^21.0.2 to package.json dependencies. --- bun.lockb | Bin 435124 -> 436003 bytes package.json | 1 + 2 files changed, 1 insertion(+) diff --git a/bun.lockb b/bun.lockb index 1cca6face9f25bdb4979a9da203c13bc3e6c93a2..831c287fcc9a93ffa553c4e5c3e6d8629879b07d 100755 GIT binary patch delta 93801 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�d6;rb@uT)Np%KlG~2Id#!r(%8wQa}Gt{)E(y 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 Date: Sat, 19 Oct 2024 12:21:16 +0900 Subject: [PATCH 6/6] test: add push event handling tests and mock reset cleanup Add new tests for push event handling and ensure mock reset in other tests. --- tests/dispatch.test.ts | 1 + tests/events.test.ts | 148 ++++++++++------------------------------- tests/push.test.ts | 140 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+), 114 deletions(-) create mode 100644 tests/push.test.ts diff --git a/tests/dispatch.test.ts b/tests/dispatch.test.ts index 029ea35..afb2b9c 100644 --- a/tests/dispatch.test.ts +++ b/tests/dispatch.test.ts @@ -160,5 +160,6 @@ describe("handleEvent", () => { expect(res).toBeTruthy(); // 2 calls means the execution didn't break expect(dispatchWorker).toHaveBeenCalledTimes(2); + dispatchWorker.mockReset(); }); }); diff --git a/tests/events.test.ts b/tests/events.test.ts index d4d831c..e8fdf6c 100644 --- a/tests/events.test.ts +++ b/tests/events.test.ts @@ -5,7 +5,6 @@ import { http, HttpResponse } from "msw"; import { GitHubContext } from "../src/github/github-context"; import { GitHubEventHandler } from "../src/github/github-event-handler"; import issueCommentCreated from "../src/github/handlers/issue-comment-created"; -import handlePushEvent from "../src/github/handlers/push-event"; import { CONFIG_FULL_PATH } from "../src/github/utils/config"; import { server } from "./__mocks__/node"; import "./__mocks__/webhooks"; @@ -25,6 +24,8 @@ beforeAll(() => { }); afterEach(() => { server.resetHandlers(); + jest.clearAllMocks(); + jest.resetAllMocks(); }); afterAll(() => { server.close(); @@ -61,17 +62,10 @@ describe("Event related tests", () => { }, }; const spy = jest.spyOn(issues, "createComment"); - await issueCommentCreated({ - id: "", - key: "issue_comment.created", - octokit: { - rest: { - issues, - repos: { - getContent(params?: RestEndpointMethodTypes["repos"]["getContent"]["parameters"]) { - if (params?.path === CONFIG_FULL_PATH) { - return { - data: ` + const getContent = jest.fn((params?: RestEndpointMethodTypes["repos"]["getContent"]["parameters"]) => { + if (params?.path === CONFIG_FULL_PATH) { + return { + data: ` plugins: - name: "Run on comment created" uses: @@ -82,27 +76,35 @@ describe("Event related tests", () => { - id: plugin-B plugin: ubiquity-os/plugin-b `, - }; - } else if (params?.path === "manifest.json") { - return { - data: { - content: btoa( - JSON.stringify({ - name: "plugin", - commands: { - action: { - description: "action", - "ubiquity:example": "/action", - }, - }, - }) - ), + }; + } else if (params?.path === "manifest.json") { + return { + data: { + content: btoa( + JSON.stringify({ + name: "plugin", + commands: { + action: { + description: "action", + "ubiquity:example": "/action", }, - }; - } else { - throw new Error("Not found"); - } - }, + }, + }) + ), + }, + }; + } else { + throw new Error("Not found"); + } + }); + await issueCommentCreated({ + id: "", + key: "issue_comment.created", + octokit: { + rest: { + issues, + repos: { + getContent: getContent, }, }, }, @@ -132,86 +134,4 @@ describe("Event related tests", () => { ], ]); }); - it("should handle push event correctly", async () => { - const issues = { - createComment(params?: RestEndpointMethodTypes["issues"]["createComment"]["parameters"]) { - return params; - }, - }; - const createCommitComment = jest.fn(); - const context = { - id: "", - key: "issue_comment.created", - octokit: { - rest: { - issues, - repos: { - listCommentsForCommit: jest.fn(() => ({ data: [] })), - createCommitComment: createCommitComment, - getContent(params?: RestEndpointMethodTypes["repos"]["getContent"]["parameters"]) { - if (params?.path === CONFIG_FULL_PATH) { - return { - data: ` - plugins: - - name: "Run on comment created" - uses: - - id: plugin-A - plugin: https://plugin-a.internal - with: - arg: "true" - - name: "Some Action plugin" - uses: - - id: plugin-B - plugin: ubiquity-os/plugin-b - `, - }; - } else if (params?.path === "manifest.json") { - return { - data: { - content: btoa( - JSON.stringify({ - name: "plugin", - commands: { - action: { - description: "action", - "ubiquity:example": "/action", - }, - }, - configuration: { - default: {}, - type: "object", - properties: { - arg: { - type: "number", - }, - }, - required: ["arg"], - }, - }) - ), - }, - }; - } else { - throw new Error("Not found"); - } - }, - }, - }, - }, - eventHandler: eventHandler, - payload: { - repository: { - owner: { login: "ubiquity" }, - name, - }, - issue: { number: 1 }, - comment: { - body: "/help", - }, - commits: [{ modified: [CONFIG_FULL_PATH] }], - } as unknown as GitHubContext<"issue_comment.created">["payload"], - } as unknown as GitHubContext; - await expect(handlePushEvent(context)).resolves.not.toThrow(); - expect(createCommitComment).toBeCalledTimes(1); - }); }); diff --git a/tests/push.test.ts b/tests/push.test.ts new file mode 100644 index 0000000..808cf6e --- /dev/null +++ b/tests/push.test.ts @@ -0,0 +1,140 @@ +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, jest } from "@jest/globals"; +import { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods"; +import { config } from "dotenv"; +import { http, HttpResponse } from "msw"; +import { GitHubContext } from "../src/github/github-context"; +import { GitHubEventHandler } from "../src/github/github-event-handler"; +import handlePushEvent from "../src/github/handlers/push-event"; +import { CONFIG_FULL_PATH } from "../src/github/utils/config"; +import { server } from "./__mocks__/node"; +import "./__mocks__/webhooks"; + +jest.mock("@octokit/plugin-paginate-rest", () => ({})); +jest.mock("@octokit/plugin-rest-endpoint-methods", () => ({})); +jest.mock("@octokit/plugin-retry", () => ({})); +jest.mock("@octokit/plugin-throttling", () => ({})); +jest.mock("@octokit/auth-app", () => ({})); + +config({ path: ".dev.vars" }); + +const name = "ubiquity-os-kernel"; + +beforeAll(() => { + server.listen(); +}); +afterEach(() => { + server.resetHandlers(); + jest.clearAllMocks(); + jest.resetAllMocks(); +}); +afterAll(() => { + server.close(); +}); + +const eventHandler = { + environment: "production", +} as GitHubEventHandler; + +describe("Push related tests", () => { + beforeEach(() => { + server.use( + http.get("https://plugin-a.internal/manifest.json", () => + HttpResponse.json({ + name: "plugin", + commands: { + foo: { + description: "foo command", + "ubiquity:example": "/foo bar", + }, + bar: { + description: "bar command", + "ubiquity:example": "/bar foo", + }, + }, + }) + ) + ); + }); + it("should handle push event correctly", async () => { + const issues = { + createComment(params?: RestEndpointMethodTypes["issues"]["createComment"]["parameters"]) { + return params; + }, + }; + const createCommitComment = jest.fn(); + const context = { + id: "", + key: "issue_comment.created", + octokit: { + rest: { + issues, + repos: { + listCommentsForCommit: jest.fn(() => ({ data: [] })), + createCommitComment: createCommitComment, + getContent(params?: RestEndpointMethodTypes["repos"]["getContent"]["parameters"]) { + if (params?.path === CONFIG_FULL_PATH) { + return { + data: ` + plugins: + - name: "Run on comment created" + uses: + - id: plugin-A + plugin: https://plugin-a.internal + with: + arg: "true" + - name: "Some Action plugin" + uses: + - id: plugin-B + plugin: ubiquity-os/plugin-b + `, + }; + } else if (params?.path === "manifest.json") { + return { + data: { + content: btoa( + JSON.stringify({ + name: "plugin", + commands: { + action: { + description: "action", + "ubiquity:example": "/action", + }, + }, + configuration: { + default: {}, + type: "object", + properties: { + arg: { + type: "number", + }, + }, + required: ["arg"], + }, + }) + ), + }, + }; + } else { + throw new Error("Not found"); + } + }, + }, + }, + }, + eventHandler: eventHandler, + payload: { + repository: { + owner: { login: "ubiquity" }, + name, + }, + issue: { number: 1 }, + comment: { + body: "/help", + }, + commits: [{ modified: [CONFIG_FULL_PATH] }], + } as unknown as GitHubContext<"issue_comment.created">["payload"], + } as unknown as GitHubContext; + await expect(handlePushEvent(context)).resolves.not.toThrow(); + expect(createCommitComment).toBeCalledTimes(1); + }); +});