import assert from "node:assert/strict"; import test from "node:test"; import { formatGitHubEvent, getOrganizationLogin } from "../src/githubEvents.js"; test("formats push events with commit summaries", () => { const message = formatGitHubEvent( "push", { ref: "refs/heads/main", repository: { full_name: "acme/app", owner: { login: "acme" } }, pusher: { name: "alice" }, commits: [ { id: "1234567890", message: "Add feature\n\nLong body", author: { name: "Alice" }, added: ["src/new.ts"], modified: ["src/app.ts", "README.md"], removed: ["old.txt"], url: "https://github.com/acme/app/commit/1234567" } ], compare: "https://github.com/acme/app/compare/a...b" }, 3500 ); assert.ok(message); assert.match(message, /^━━━━━━━━━━━━━━\n📦 GitHub-GCC Push/); assert.match(message, /📁 acme\/app/); assert.match(message, /🌿 main/); assert.match(message, /👤 alice/); assert.match(message, /• 1 commit/); assert.match(message, /• 4 files changed/); assert.match(message, /• latest: 1234567 Add feature/); assert.doesNotMatch(message, /https:\/\/github\.com\/acme\/app\/commit\/1234567/); assert.match(message, /🔗 https:\/\/github\.com\/acme\/app\/compare\/a\.\.\.b/); assert.match(message, /━━━━━━━━━━━━━━$/); }); test("formats merged pull requests as merged", () => { const message = formatGitHubEvent( "pull_request", { action: "closed", repository: { full_name: "acme/app" }, sender: { login: "bob" }, pull_request: { merged: true, number: 12, title: "Improve deployment", base: { ref: "main" }, head: { ref: "deploy" }, html_url: "https://github.com/acme/app/pull/12" } }, 3500 ); assert.ok(message); assert.match(message, /📦 GitHub-GCC Pull Request/); assert.match(message, /🔀 #12 Improve deployment/); assert.match(message, /• merged/); assert.match(message, /• deploy -> main/); }); test("ignores ping and non-completed workflow_run events", () => { assert.equal(formatGitHubEvent("ping", {}, 3500), null); assert.equal(formatGitHubEvent("workflow_run", { action: "requested" }, 3500), null); }); test("extracts organization login from organization or repository owner", () => { assert.equal(getOrganizationLogin({ organization: { login: "Acme" } }), "acme"); assert.equal(getOrganizationLogin({ repository: { owner: { login: "Other" } } }), "other"); }); test("formats Gitea-style push payloads with compare_url and pusher login", () => { const message = formatGitHubEvent( "push", { ref: "refs/heads/main", repository: { full_name: "gcc/app", owner: { login: "gcc" } }, pusher: { login: "alice", username: "alice" }, sender: { login: "alice" }, commits: [], total_commits: 0, compare_url: "https://192.168.87.52:18473/gcc/app/compare/a...b" }, 3500 ); assert.ok(message); assert.match(message, /👤 alice/); assert.match(message, /🔗 https:\/\/192\.168\.87\.52:18473\/gcc\/app\/compare\/a\.\.\.b/); }); test("formats Gitea pull_request_comment events like issue comments", () => { const message = formatGitHubEvent( "pull_request_comment", { action: "created", repository: { full_name: "gcc/app" }, issue: { number: 3, title: "Add login" }, comment: { body: "LGTM", html_url: "https://192.168.87.52:18473/gcc/app/pulls/3#issuecomment-1" }, sender: { login: "bob" }, is_pull: true }, 3500 ); assert.ok(message); assert.match(message, /📦 GitHub-GCC Issue Comment/); assert.match(message, /🎫 #3 Add login/); assert.match(message, /• LGTM/); }); test("extracts organization login from Gitea username field", () => { assert.equal(getOrganizationLogin({ organization: { username: "GCC" } }), "gcc"); assert.equal(getOrganizationLogin({ repository: { owner: { username: "GCC" } } }), "gcc"); }); test("formats Gitea payloads that only have sender.username", () => { const message = formatGitHubEvent( "issues", { action: "opened", repository: { full_name: "gcc/app" }, issue: { number: 8, title: "Broken login", html_url: "https://192.168.87.52:18473/gcc/app/issues/8" }, sender: { username: "carol" } }, 3500 ); assert.ok(message); assert.match(message, /👤 carol/); }); test("truncates long messages", () => { const message = formatGitHubEvent( "issue_comment", { repository: { full_name: "acme/app" }, action: "created", issue: { number: 1, title: "Bug" }, comment: { body: "x".repeat(200), html_url: "https://example.test" }, sender: { login: "alice" } }, 120 ); assert.ok(message); assert.ok(message.length <= 120); assert.match(message, /\.\.\. truncated$/); });