From 0a3426493b8eb94fb07b0b1ca7405adb2570324c Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Wed, 5 Oct 2022 03:30:31 +0000 Subject: [PATCH 01/13] fix: PR previews for new frontmatter types --- README.md | 3 + docs/02-create-twitter-together-workflow.md | 3 + lib/pull-request/create-check-run.js | 29 ++++- .../event.json | 22 ++++ .../media/cat.jpg | Bin 0 -> 154981 bytes .../media/dog.jpg | Bin 0 -> 75044 bytes .../test.js | 102 +++++++++++++++ .../event.json | 22 ++++ .../test.js | 100 +++++++++++++++ .../event.json | 22 ++++ .../test.js | 93 ++++++++++++++ .../event.json | 22 ++++ .../test.js | 86 +++++++++++++ .../event.json | 22 ++++ .../test.js | 86 +++++++++++++ .../event.json | 22 ++++ .../test.js | 82 ++++++++++++ .../event.json | 22 ++++ .../test.js | 120 ++++++++++++++++++ 19 files changed, 854 insertions(+), 4 deletions(-) create mode 100644 test/pull-request-has-tweet-with-front-matter-media/event.json create mode 100644 test/pull-request-has-tweet-with-front-matter-media/media/cat.jpg create mode 100644 test/pull-request-has-tweet-with-front-matter-media/media/dog.jpg create mode 100644 test/pull-request-has-tweet-with-front-matter-media/test.js create mode 100644 test/pull-request-has-tweet-with-front-matter-poll-5-options/event.json create mode 100644 test/pull-request-has-tweet-with-front-matter-poll-5-options/test.js create mode 100644 test/pull-request-has-tweet-with-front-matter-poll/event.json create mode 100644 test/pull-request-has-tweet-with-front-matter-poll/test.js create mode 100644 test/pull-request-has-tweet-with-front-matter-quote/event.json create mode 100644 test/pull-request-has-tweet-with-front-matter-quote/test.js create mode 100644 test/pull-request-has-tweet-with-front-matter-reply/event.json create mode 100644 test/pull-request-has-tweet-with-front-matter-reply/test.js create mode 100644 test/pull-request-has-tweet-with-front-matter-retweet/event.json create mode 100644 test/pull-request-has-tweet-with-front-matter-retweet/test.js create mode 100644 test/pull-request-has-tweet-with-thread/event.json create mode 100644 test/pull-request-has-tweet-with-thread/test.js diff --git a/README.md b/README.md index 73a1f081..f86f4bdb 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,9 @@ Unless you wish to contribute to this project, you don't need to fork this repos runs-on: ubuntu-latest if: github.event_name == 'pull_request' steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} - uses: twitter-together/action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/docs/02-create-twitter-together-workflow.md b/docs/02-create-twitter-together-workflow.md index 6c71e331..b1e9130f 100644 --- a/docs/02-create-twitter-together-workflow.md +++ b/docs/02-create-twitter-together-workflow.md @@ -21,6 +21,9 @@ jobs: runs-on: ubuntu-latest if: github.event_name == 'pull_request' steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} - uses: twitter-together/action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/lib/pull-request/create-check-run.js b/lib/pull-request/create-check-run.js index 966c4182..fd901f36 100644 --- a/lib/pull-request/create-check-run.js +++ b/lib/pull-request/create-check-run.js @@ -1,6 +1,7 @@ module.exports = createCheckRun; const { autoLink } = require("twitter-text"); +const path = require("path"); const parseTweetFileContent = require("../common/parse-tweet-file-content"); @@ -62,10 +63,12 @@ async function createCheckRun( toolkit.info(`check run created: ${response.data.html_url}`); } -function tweetToCheckRunSummary(tweet) { - let text = autoLink(tweet.text) - .replace(/(^|\n)/g, "$1> ") - .replace(/(^|\n)> (\n|$)/g, "$1>$2"); +function tweetToCheckRunSummary(tweet, threading) { + let text = !tweet.text + ? "" + : autoLink(tweet.text) + .replace(/(^|\n)/g, "$1> ") + .replace(/(^|\n)> (\n|$)/g, "$1>$2"); if (!tweet.valid) return `### ❌ Invalid\n\n${text}\n\n${tweet.error || "Unknown error"}`; @@ -73,5 +76,23 @@ function tweetToCheckRunSummary(tweet) { if (tweet.poll) text += "\n\nThe tweet includes a poll:\n\n> πŸ”˜ " + tweet.poll.join("\n> πŸ”˜ "); + + if (tweet.reply) text = `Replying to ${tweet.reply}\n\n${text}`; + + if (tweet.retweet) text = `Retweeting ${tweet.retweet}\n\n${text}`.trim(); + + if (tweet.media.length) { + const media = tweet.media + .map(({ file, alt }) => `- ${path.basename(file)} [${alt}]`) + .join("\n"); + text = `Uploading media:\n\n${media}\n\n${text}`.trim(); + } + + if (tweet.thread || threading) { + let cells = `\n\n\n${text}\n\n`; + if (tweet.thread) cells += `${tweetToCheckRunSummary(tweet.thread, true)}`; + return threading ? cells : `### βœ… Valid\n\n${cells}\n
`; + } + return `### βœ… Valid\n\n${text}`; } diff --git a/test/pull-request-has-tweet-with-front-matter-media/event.json b/test/pull-request-has-tweet-with-front-matter-media/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-media/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-front-matter-media/media/cat.jpg b/test/pull-request-has-tweet-with-front-matter-media/media/cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a10d50590b7013ce13a9f22d984aab31fd66fbc7 GIT binary patch literal 154981 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

SB=@T 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 I@*gMv*$GsU*8l(j literal 0 HcmV?d00001 diff --git a/test/pull-request-has-tweet-with-front-matter-media/media/dog.jpg b/test/pull-request-has-tweet-with-front-matter-media/media/dog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a25bfbe88317a284a2b22ed987766b79a09718f GIT binary patch literal 75044 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 OTQZX-8214MPygA>1XXhY literal 0 HcmV?d00001 diff --git a/test/pull-request-has-tweet-with-front-matter-media/test.js b/test/pull-request-has-tweet-with-front-matter-media/test.js new file mode 100644 index 00000000..23e53afe --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-media/test.js @@ -0,0 +1,102 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); +const path = require("path"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = path.dirname(process.env.GITHUB_EVENT_PATH); +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/media/cat.jpg b/media/cat.jpg +new file mode 100644 +index 0000000..a10d505 +Binary files /dev/null and b/media/cat.jpg differ +diff --git a/media/dog.jpg b/media/dog.jpg +new file mode 100644 +index 0000000..7a25bfb +Binary files /dev/null and b/media/dog.jpg differ +diff --git a/tweets/media.tweet b/tweets/media.tweet +new file mode 100644 +index 0000000..1715c04 +--- /dev/null ++++ b/tweets/media.tweet +@@ -0,0 +1,9 @@ ++--- ++media: ++ - file: cat.jpg ++ alt: A cat ++ - file: dog.jpg ++ alt: A dog ++--- ++ ++Here are some cute animals!` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### βœ… Valid + +Uploading media: + +- cat.jpg [A cat] +- dog.jpg [A dog] + +> Here are some cute animals!`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-with-front-matter-poll-5-options/event.json b/test/pull-request-has-tweet-with-front-matter-poll-5-options/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-poll-5-options/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-front-matter-poll-5-options/test.js b/test/pull-request-has-tweet-with-front-matter-poll-5-options/test.js new file mode 100644 index 00000000..e047b62c --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-poll-5-options/test.js @@ -0,0 +1,100 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/poll.tweet b/tweets/poll.tweet +new file mode 100644 +index 0000000..6053708 +--- /dev/null ++++ b/tweets/poll.tweet +@@ -0,0 +1,10 @@ ++--- ++poll: ++ - Red ++ - Blue ++ - Green ++ - Orange ++ - Purple ++--- ++ ++What is your favorite color?` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "failure"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### ❌ Invalid + +> --- +> poll: +> - Red +> - Blue +> - Green +> - Orange +> - Purple +> --- +> +> What is your favorite color? + +Polls cannot have more than four options, found 5 options`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-with-front-matter-poll/event.json b/test/pull-request-has-tweet-with-front-matter-poll/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-poll/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-front-matter-poll/test.js b/test/pull-request-has-tweet-with-front-matter-poll/test.js new file mode 100644 index 00000000..4ab80352 --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-poll/test.js @@ -0,0 +1,93 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/poll.tweet b/tweets/poll.tweet +new file mode 100644 +index 0000000..6053708 +--- /dev/null ++++ b/tweets/poll.tweet +@@ -0,0 +1,8 @@ ++--- ++poll: ++ - Red ++ - Blue ++ - Green ++--- ++ ++What is your favorite color?` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### βœ… Valid + +> What is your favorite color? + +The tweet includes a poll: + +> πŸ”˜ Red +> πŸ”˜ Blue +> πŸ”˜ Green`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-with-front-matter-quote/event.json b/test/pull-request-has-tweet-with-front-matter-quote/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-quote/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-front-matter-quote/test.js b/test/pull-request-has-tweet-with-front-matter-quote/test.js new file mode 100644 index 00000000..2fd6c337 --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-quote/test.js @@ -0,0 +1,86 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/retweet.tweet b/tweets/retweet.tweet +new file mode 100644 +index 0000000..d462a1f +--- /dev/null ++++ b/tweets/retweet.tweet +@@ -0,0 +1,5 @@ ++--- ++retweet: https://twitter.com/m2rg/status/0000000000000000001 ++--- ++ ++Smart thinking!` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### βœ… Valid + +Retweeting https://twitter.com/m2rg/status/0000000000000000001 + +> Smart thinking!`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-with-front-matter-reply/event.json b/test/pull-request-has-tweet-with-front-matter-reply/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-reply/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-front-matter-reply/test.js b/test/pull-request-has-tweet-with-front-matter-reply/test.js new file mode 100644 index 00000000..4a6ae4e6 --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-reply/test.js @@ -0,0 +1,86 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/retweet.tweet b/tweets/retweet.tweet +new file mode 100644 +index 0000000..d462a1f +--- /dev/null ++++ b/tweets/retweet.tweet +@@ -0,0 +1,5 @@ ++--- ++reply: https://twitter.com/m2rg/status/0000000000000000001 ++--- ++ ++Good idea :)` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### βœ… Valid + +Replying to https://twitter.com/m2rg/status/0000000000000000001 + +> Good idea :)`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-with-front-matter-retweet/event.json b/test/pull-request-has-tweet-with-front-matter-retweet/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-retweet/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-front-matter-retweet/test.js b/test/pull-request-has-tweet-with-front-matter-retweet/test.js new file mode 100644 index 00000000..e88d804e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-retweet/test.js @@ -0,0 +1,82 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/retweet.tweet b/tweets/retweet.tweet +new file mode 100644 +index 0000000..d462a1f +--- /dev/null ++++ b/tweets/retweet.tweet +@@ -0,0 +1,3 @@ ++--- ++retweet: https://twitter.com/m2rg/status/0000000000000000001 ++---` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### βœ… Valid + +Retweeting https://twitter.com/m2rg/status/0000000000000000001`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-with-thread/event.json b/test/pull-request-has-tweet-with-thread/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-thread/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-thread/test.js b/test/pull-request-has-tweet-with-thread/test.js new file mode 100644 index 00000000..b150c932 --- /dev/null +++ b/test/pull-request-has-tweet-with-thread/test.js @@ -0,0 +1,120 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/thread.tweet b/tweets/thread.tweet +new file mode 100644 +index 0000000..ec04564 +--- /dev/null ++++ b/tweets/thread.tweet +@@ -0,0 +1,15 @@ ++🧡 Here is a thread... ++ ++--- ++--- ++poll: ++ - Banana ++ - Mango ++--- ++ ++Which fruit is more delicious? ++ ++--- ++We hope you enjoyed this thread... ++--- ++We certainly did.` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### βœ… Valid + + + + + + +
+ +> 🧡 Here is a thread... + +
+ +> Which fruit is more delicious? + +The tweet includes a poll: + +> πŸ”˜ Banana +> πŸ”˜ Mango + +
+ +> We hope you enjoyed this thread... + +
+ +> We certainly did. + +
`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); From ab9c94a9f08a0e63137792f710730fe7f302124d Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Wed, 5 Oct 2022 08:16:34 +0000 Subject: [PATCH 02/13] Add required `name` to workflow docs --- README.md | 6 ++++-- docs/02-create-twitter-together-workflow.md | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f86f4bdb..1a7fad6f 100644 --- a/README.md +++ b/README.md @@ -54,10 +54,12 @@ Unless you wish to contribute to this project, you don't need to fork this repos runs-on: ubuntu-latest if: github.event_name == 'pull_request' steps: - - uses: actions/checkout@v3 + - name: checkout pull request + uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} - - uses: twitter-together/action@v2 + - name: Validate Tweets + uses: twitter-together/action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} tweet: diff --git a/docs/02-create-twitter-together-workflow.md b/docs/02-create-twitter-together-workflow.md index b1e9130f..929efb27 100644 --- a/docs/02-create-twitter-together-workflow.md +++ b/docs/02-create-twitter-together-workflow.md @@ -21,10 +21,12 @@ jobs: runs-on: ubuntu-latest if: github.event_name == 'pull_request' steps: - - uses: actions/checkout@v3 + - name: checkout pull request + uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} - - uses: twitter-together/action@v2 + - name: Validate Tweets + uses: twitter-together/action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} tweet: From 217f4cb381677ee0097c79cfe9022688b62b0716 Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Thu, 6 Oct 2022 03:17:51 +0000 Subject: [PATCH 03/13] fix: validate preview tweet reference #221 --- lib/common/parse-tweet-file-content.js | 4 + lib/common/parse-tweet-id.js | 16 ++++ lib/common/tweet.js | 11 +-- .../event.json | 22 +++++ .../test.js | 86 +++++++++++++++++++ .../event.json | 22 +++++ .../test.js | 86 +++++++++++++++++++ 7 files changed, 240 insertions(+), 7 deletions(-) create mode 100644 lib/common/parse-tweet-id.js create mode 100644 test/pull-request-has-tweet-with-front-matter-reply-invalid/event.json create mode 100644 test/pull-request-has-tweet-with-front-matter-reply-invalid/test.js create mode 100644 test/pull-request-has-tweet-with-front-matter-retweet-invalid/event.json create mode 100644 test/pull-request-has-tweet-with-front-matter-retweet-invalid/test.js diff --git a/lib/common/parse-tweet-file-content.js b/lib/common/parse-tweet-file-content.js index e62b58ad..fbf1f404 100644 --- a/lib/common/parse-tweet-file-content.js +++ b/lib/common/parse-tweet-file-content.js @@ -6,6 +6,7 @@ const { existsSync } = require("fs"); const { join } = require("path"); const { parseTweet } = require("twitter-text"); const { load } = require("js-yaml"); +const parseTweetId = require("./parse-tweet-id"); const OPTION_REGEX = /^\(\s?\)\s+/; const FRONT_MATTER_REGEX = new RegExp( @@ -85,6 +86,9 @@ function parseTweetFileContent(text, dir, isThread = false) { } function validateOptions(options, text, dir) { + if (options.retweet || options.reply) + parseTweetId(options.retweet || options.reply); + if (options.retweet && !text && options.poll) throw new Error("Cannot attach a poll to a retweet"); diff --git a/lib/common/parse-tweet-id.js b/lib/common/parse-tweet-id.js new file mode 100644 index 00000000..e7c14b47 --- /dev/null +++ b/lib/common/parse-tweet-id.js @@ -0,0 +1,16 @@ +module.exports = parseTweetId; + +const TWEET_REGEX = /^https:\/\/twitter\.com\/[^/]+\/status\/(\d+)$/; + +// TODO allow differently formatted URLs and tweet ids ? +// https://github.com/twitter-together/action/issues/221 + +// TODO: Should we check if the referenced tweet actually exists? + +function parseTweetId(tweetRef) { + const match = tweetRef.match(TWEET_REGEX); + if (!match) { + throw new Error(`Invalid tweet reference: ${tweetRef}`); + } + return match; +} diff --git a/lib/common/tweet.js b/lib/common/tweet.js index 5f680cfe..ddc7bec6 100644 --- a/lib/common/tweet.js +++ b/lib/common/tweet.js @@ -4,7 +4,7 @@ const { promises: fs } = require("fs"); const Twitter = require("twitter"); const mime = require("mime-types"); -const TWEET_REGEX = /^https:\/\/twitter\.com\/[^/]+\/status\/(\d+)$/; +const parseTweetId = require("./parse-tweet-id"); async function tweet({ twitterCredentials }, tweetData, tweetFile) { const client = new Twitter(twitterCredentials); @@ -13,8 +13,7 @@ async function tweet({ twitterCredentials }, tweetData, tweetFile) { async function handleTweet(client, tweet, name) { if (tweet.retweet && !tweet.text) { - // TODO: Should this throw if an invalid tweet is passed and there is no match? - const match = tweet.retweet.match(TWEET_REGEX); + const match = parseTweetId(tweet.retweet); if (match) return createRetweet(client, match[1]); } @@ -35,8 +34,7 @@ async function handleTweet(client, tweet, name) { } if (tweet.reply) { - // TODO: Should this throw if an invalid reply is passed and there is no match? - const match = tweet.reply.match(TWEET_REGEX); + const match = parseTweetId(tweet.reply); if (match) { tweetData.in_reply_to_status_id = match[1]; tweetData.auto_populate_reply_metadata = true; @@ -44,8 +42,7 @@ async function handleTweet(client, tweet, name) { } if (tweet.retweet) { - // TODO: Should this throw if an invalid tweet is passed and there is no match? - const match = tweet.retweet.match(TWEET_REGEX); + const match = parseTweetId(tweet.retweet); if (match) tweetData.attachment_url = match[0]; } diff --git a/test/pull-request-has-tweet-with-front-matter-reply-invalid/event.json b/test/pull-request-has-tweet-with-front-matter-reply-invalid/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-reply-invalid/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-front-matter-reply-invalid/test.js b/test/pull-request-has-tweet-with-front-matter-reply-invalid/test.js new file mode 100644 index 00000000..2e5a74f6 --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-reply-invalid/test.js @@ -0,0 +1,86 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/reply.tweet b/tweets/reply.tweet +new file mode 100644 +index 0000000..d462a1f +--- /dev/null ++++ b/tweets/reply.tweet +@@ -0,0 +1,3 @@ ++--- ++reply: spoons ++---` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "failure"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### ❌ Invalid + +> --- +> reply: spoons +> --- + +Invalid tweet reference: spoons`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-with-front-matter-retweet-invalid/event.json b/test/pull-request-has-tweet-with-front-matter-retweet-invalid/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-retweet-invalid/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-with-front-matter-retweet-invalid/test.js b/test/pull-request-has-tweet-with-front-matter-retweet-invalid/test.js new file mode 100644 index 00000000..edae2594 --- /dev/null +++ b/test/pull-request-has-tweet-with-front-matter-retweet-invalid/test.js @@ -0,0 +1,86 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/retweet.tweet b/tweets/retweet.tweet +new file mode 100644 +index 0000000..d462a1f +--- /dev/null ++++ b/tweets/retweet.tweet +@@ -0,0 +1,3 @@ ++--- ++retweet: spoons ++---` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "failure"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: `### ❌ Invalid + +> --- +> retweet: spoons +> --- + +Invalid tweet reference: spoons`, + }); + + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); From 41f43f7876b50676ceabde928892967ab95e81af Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Thu, 6 Oct 2022 13:11:13 +0000 Subject: [PATCH 04/13] Linting --- docs/02-create-twitter-together-workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/02-create-twitter-together-workflow.md b/docs/02-create-twitter-together-workflow.md index 929efb27..7dbea9f6 100644 --- a/docs/02-create-twitter-together-workflow.md +++ b/docs/02-create-twitter-together-workflow.md @@ -24,7 +24,7 @@ jobs: - name: checkout pull request uses: actions/checkout@v3 with: - ref: ${{ github.event.pull_request.head.sha }} + ref: ${{ github.event.pull_request.head.sha }} - name: Validate Tweets uses: twitter-together/action@v2 env: From 1b4b8297e8f22582d913eedb74e227c7886cfbc6 Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Thu, 13 Oct 2022 04:12:47 +0000 Subject: [PATCH 05/13] Render image in media previews --- lib/pull-request/create-check-run.js | 17 ++++++++++++----- .../test.js | 7 +++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/pull-request/create-check-run.js b/lib/pull-request/create-check-run.js index fd901f36..35f7ff40 100644 --- a/lib/pull-request/create-check-run.js +++ b/lib/pull-request/create-check-run.js @@ -55,7 +55,9 @@ async function createCheckRun( conclusion: allTweetsValid ? "success" : "failure", output: { title: `${parsedTweets.length} tweet(s)`, - summary: parsedTweets.map(tweetToCheckRunSummary).join("\n\n---\n\n"), + summary: parsedTweets + .map((tweet) => tweetToCheckRunSummary(tweet, payload, false)) + .join("\n\n---\n\n"), }, } ); @@ -63,7 +65,7 @@ async function createCheckRun( toolkit.info(`check run created: ${response.data.html_url}`); } -function tweetToCheckRunSummary(tweet, threading) { +function tweetToCheckRunSummary(tweet, payload, threading) { let text = !tweet.text ? "" : autoLink(tweet.text) @@ -83,14 +85,19 @@ function tweetToCheckRunSummary(tweet, threading) { if (tweet.media.length) { const media = tweet.media - .map(({ file, alt }) => `- ${path.basename(file)} [${alt}]`) - .join("\n"); + .map(({ file, alt }) => { + const fileName = path.basename(file); + const url = `https://raw.githubusercontent.com/${payload.repository.owner.login}/${payload.repository.name}/${payload.after}/media/${fileName}`; + return `${alt}\n`; + }) + .join("\n\n"); text = `Uploading media:\n\n${media}\n\n${text}`.trim(); } if (tweet.thread || threading) { let cells = `\n\n\n${text}\n\n`; - if (tweet.thread) cells += `${tweetToCheckRunSummary(tweet.thread, true)}`; + if (tweet.thread) + cells += `${tweetToCheckRunSummary(tweet.thread, payload, true)}`; return threading ? cells : `### βœ… Valid\n\n${cells}\n
`; } diff --git a/test/pull-request-has-tweet-with-front-matter-media/test.js b/test/pull-request-has-tweet-with-front-matter-media/test.js index 23e53afe..5abdef63 100644 --- a/test/pull-request-has-tweet-with-front-matter-media/test.js +++ b/test/pull-request-has-tweet-with-front-matter-media/test.js @@ -84,8 +84,11 @@ nock("https://api.github.com") Uploading media: -- cat.jpg [A cat] -- dog.jpg [A dog] +A cat + + +A dog + > Here are some cute animals!`, }); From eefe1b16bbb596c561b21865cba0578957f1bac5 Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Thu, 13 Oct 2022 10:45:47 +0000 Subject: [PATCH 06/13] Fix nested media previews --- lib/pull-request/create-check-run.js | 16 +++++++++++----- .../event.json | 1 + .../media/{ => nested/media/pets}/dog.jpg | Bin .../test.js | 6 +++--- 4 files changed, 15 insertions(+), 8 deletions(-) rename test/pull-request-has-tweet-with-front-matter-media/media/{ => nested/media/pets}/dog.jpg (100%) diff --git a/lib/pull-request/create-check-run.js b/lib/pull-request/create-check-run.js index 35f7ff40..d27d2480 100644 --- a/lib/pull-request/create-check-run.js +++ b/lib/pull-request/create-check-run.js @@ -4,6 +4,7 @@ const { autoLink } = require("twitter-text"); const path = require("path"); const parseTweetFileContent = require("../common/parse-tweet-file-content"); +const { join } = require("path"); async function createCheckRun( { octokit, payload, startedAt, toolkit, dir }, @@ -56,7 +57,9 @@ async function createCheckRun( output: { title: `${parsedTweets.length} tweet(s)`, summary: parsedTweets - .map((tweet) => tweetToCheckRunSummary(tweet, payload, false)) + .map((tweet) => + tweetToCheckRunSummary({ tweet, payload, dir }, false) + ) .join("\n\n---\n\n"), }, } @@ -65,7 +68,7 @@ async function createCheckRun( toolkit.info(`check run created: ${response.data.html_url}`); } -function tweetToCheckRunSummary(tweet, payload, threading) { +function tweetToCheckRunSummary({ tweet, payload, dir }, threading) { let text = !tweet.text ? "" : autoLink(tweet.text) @@ -86,8 +89,8 @@ function tweetToCheckRunSummary(tweet, payload, threading) { if (tweet.media.length) { const media = tweet.media .map(({ file, alt }) => { - const fileName = path.basename(file); - const url = `https://raw.githubusercontent.com/${payload.repository.owner.login}/${payload.repository.name}/${payload.after}/media/${fileName}`; + const fileName = file.replace(dir, ""); + const url = `https://raw.githubusercontent.com/${payload.repository.owner.login}/${payload.repository.name}/${payload.after}${fileName}`; return `${alt}\n`; }) .join("\n\n"); @@ -97,7 +100,10 @@ function tweetToCheckRunSummary(tweet, payload, threading) { if (tweet.thread || threading) { let cells = `\n\n\n${text}\n\n`; if (tweet.thread) - cells += `${tweetToCheckRunSummary(tweet.thread, payload, true)}`; + cells += tweetToCheckRunSummary( + { tweet: tweet.thread, payload, dir }, + true + ); return threading ? cells : `### βœ… Valid\n\n${cells}\n
`; } diff --git a/test/pull-request-has-tweet-with-front-matter-media/event.json b/test/pull-request-has-tweet-with-front-matter-media/event.json index ad692d8e..eca974a6 100644 --- a/test/pull-request-has-tweet-with-front-matter-media/event.json +++ b/test/pull-request-has-tweet-with-front-matter-media/event.json @@ -1,5 +1,6 @@ { "action": "opened", + "after": "0000000000000000000000000000000000000003", "pull_request": { "number": 123, "base": { diff --git a/test/pull-request-has-tweet-with-front-matter-media/media/dog.jpg b/test/pull-request-has-tweet-with-front-matter-media/media/nested/media/pets/dog.jpg similarity index 100% rename from test/pull-request-has-tweet-with-front-matter-media/media/dog.jpg rename to test/pull-request-has-tweet-with-front-matter-media/media/nested/media/pets/dog.jpg diff --git a/test/pull-request-has-tweet-with-front-matter-media/test.js b/test/pull-request-has-tweet-with-front-matter-media/test.js index 5abdef63..985a7e33 100644 --- a/test/pull-request-has-tweet-with-front-matter-media/test.js +++ b/test/pull-request-has-tweet-with-front-matter-media/test.js @@ -63,7 +63,7 @@ index 0000000..1715c04 +media: + - file: cat.jpg + alt: A cat -+ - file: dog.jpg ++ - file: nested/media/pets/dog.jpg + alt: A dog +--- + @@ -85,10 +85,10 @@ nock("https://api.github.com") Uploading media: A cat - + A dog - + > Here are some cute animals!`, }); From 4216a997f628a5acb6f6717c79827a404d96ab08 Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Fri, 14 Oct 2022 10:32:05 +0000 Subject: [PATCH 07/13] Updating comment in PR thread, better previews --- lib/common/update-issue.js | 49 ++++++ lib/index.js | 20 ++- lib/pull-request/create-check-run.js | 80 +++++----- lib/pull-request/index.js | 2 +- .../event.json | 22 +++ .../test.js | 141 ++++++++++++++++++ .../event.json | 22 +++ .../test.js | 113 ++++++++++++++ .../pull-request-has-tweet-no-newline/test.js | 2 +- .../test.js | 4 +- .../test.js | 26 ++-- .../test.js | 12 +- .../test.js | 2 +- .../test.js | 12 +- .../test.js | 2 +- .../test.js | 12 +- .../test.js | 2 +- .../test.js | 20 +-- test/pull-request-has-tweet-with-poll/test.js | 14 +- .../test.js | 27 ++-- test/pull-request-has-tweet/test.js | 2 +- test/pull-request-invalid-tweet/test.js | 8 +- .../event.json | 22 +++ .../test.js | 112 ++++++++++++++ test/push-main-tweet-error/test.js | 1 - 25 files changed, 608 insertions(+), 121 deletions(-) create mode 100644 lib/common/update-issue.js create mode 100644 test/pull-request-has-tweet-issue-comment-updated/event.json create mode 100644 test/pull-request-has-tweet-issue-comment-updated/test.js create mode 100644 test/pull-request-has-tweet-issue-comment/event.json create mode 100644 test/pull-request-has-tweet-issue-comment/test.js create mode 100644 test/pull-request-target-has-tweet-issue-comment/event.json create mode 100644 test/pull-request-target-has-tweet-issue-comment/test.js diff --git a/lib/common/update-issue.js b/lib/common/update-issue.js new file mode 100644 index 00000000..3fc4f859 --- /dev/null +++ b/lib/common/update-issue.js @@ -0,0 +1,49 @@ +module.exports = updateIssue; + +const BOT_LOGIN = "github-actions[bot]"; + +const DIVIDER = "\n\n---\n\n\n\n"; +const PREVIEW = `${DIVIDER}Preview using `; +const UPDATED = `${DIVIDER}**Updated** preview using `; +const SIGNATURE = + " generated by [Twitter, together!](https://github.com/twitter-together/action)\n\n"; + +async function updateIssue({ octokit, payload, body }) { + // check for existing comments. + const comments = await octokit.request( + "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", + { + owner: payload.repository.owner.login, + repo: payload.repository.name, + issue_number: payload.pull_request.number, + } + ); + + const match = comments.data.find( + ({ user, body }) => user.login === BOT_LOGIN && body.endsWith(SIGNATURE) + ); + + if (match) { + // update the existing comment + await octokit.request( + "PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}", + { + owner: payload.repository.owner.login, + repo: payload.repository.name, + comment_id: match.id, + body: `${body}${UPDATED}${payload.pull_request.head.sha}${SIGNATURE}`, + } + ); + } else { + // post a new comment + await octokit.request( + "POST /repos/{owner}/{repo}/issues/{issue_number}/comments", + { + owner: payload.repository.owner.login, + repo: payload.repository.name, + issue_number: payload.pull_request.number, + body: `${body}${PREVIEW}${payload.pull_request.head.sha}${SIGNATURE}`, + } + ); + } +} diff --git a/lib/index.js b/lib/index.js index 0350c77b..367b5760 100644 --- a/lib/index.js +++ b/lib/index.js @@ -46,6 +46,12 @@ async function main() { const ref = process.env.GITHUB_REF; const sha = process.env.GITHUB_SHA; const dir = process.env.GITHUB_WORKSPACE; + const trigger = process.env.GITHUB_EVENT_NAME; + // do not make comments by default if "pull_request_target" is not used + // but optionally allow enabling them on "pull_request" for local branches + const comments = + !!process.env.ENABLE_COMMENTS || trigger === "pull_request_target"; + const githubState = { ...state, toolkit, @@ -54,15 +60,15 @@ async function main() { ref, sha, dir, + trigger, + comments, }; - switch (process.env.GITHUB_EVENT_NAME) { - case "push": - await handlePush(githubState); - break; - case "pull_request": - await handlePullRequest(githubState); - break; + if (trigger === "push") { + await handlePush(githubState); + } + if (trigger === "pull_request" || trigger === "pull_request_target") { + await handlePullRequest(githubState); } } diff --git a/lib/pull-request/create-check-run.js b/lib/pull-request/create-check-run.js index d27d2480..5a1a46fc 100644 --- a/lib/pull-request/create-check-run.js +++ b/lib/pull-request/create-check-run.js @@ -1,13 +1,12 @@ module.exports = createCheckRun; const { autoLink } = require("twitter-text"); -const path = require("path"); const parseTweetFileContent = require("../common/parse-tweet-file-content"); -const { join } = require("path"); +const updateIssue = require("../common/update-issue"); async function createCheckRun( - { octokit, payload, startedAt, toolkit, dir }, + { octokit, payload, startedAt, toolkit, dir, trigger, comments }, newTweets ) { const parsedTweets = newTweets.map((rawTweet) => { @@ -24,20 +23,25 @@ async function createCheckRun( const allTweetsValid = parsedTweets.every((tweet) => tweet.valid); - // Check runs cannot be created if the pull request was created by a fork, - // so we just log out the result. + // Check runs cannot and comments cannot be created if the pull request was created by a fork, + // so we just log out the result and fallback to text-only rendering (no HTML for images, etc) // https://help.github.com/en/actions/automating-your-workflow-with-github-actions/authenticating-with-the-github_token#permissions-for-the-github_token - if (payload.pull_request.head.repo.fork) { - for (const tweet of parsedTweets) { - if (tweet.valid) { - toolkit.info(`### βœ… Valid\n\n${tweet.text}`); - } else { - toolkit.info( - `### ❌ Invalid\n\n${tweet.text}\n\n${tweet.error || "Unknown error"}` - ); - } - } + const textOnly = + payload.pull_request.head.repo.fork && trigger === "pull_request"; + + const summary = parsedTweets + .map((tweet) => tweetToCheckRunSummary({ tweet, payload, dir, textOnly })) + .join("\n\n---\n\n"); + + const body = `## Found ${parsedTweets.length} new .tweet file(s)\n\n${summary}`; + + if (textOnly) { + // just log the result + toolkit.info(body); process.exit(allTweetsValid ? 0 : 1); + } else if (comments) { + // make a comment if we can + await updateIssue({ octokit, payload, body }); } const response = await octokit.request( @@ -56,11 +60,7 @@ async function createCheckRun( conclusion: allTweetsValid ? "success" : "failure", output: { title: `${parsedTweets.length} tweet(s)`, - summary: parsedTweets - .map((tweet) => - tweetToCheckRunSummary({ tweet, payload, dir }, false) - ) - .join("\n\n---\n\n"), + summary, }, } ); @@ -68,19 +68,21 @@ async function createCheckRun( toolkit.info(`check run created: ${response.data.html_url}`); } -function tweetToCheckRunSummary({ tweet, payload, dir }, threading) { +function tweetToCheckRunSummary(state, threading = false) { + const { tweet, payload, dir, textOnly } = state; + + if (!tweet.valid) + return `### ❌ Invalid Tweet\n\n\`\`\`tweet\n${tweet.text}\n\`\`\`\n\n**${ + tweet.error || "Unknown error" + }**`; + let text = !tweet.text ? "" : autoLink(tweet.text) .replace(/(^|\n)/g, "$1> ") .replace(/(^|\n)> (\n|$)/g, "$1>$2"); - if (!tweet.valid) - return `### ❌ Invalid\n\n${text}\n\n${tweet.error || "Unknown error"}`; - - if (tweet.poll) - text += - "\n\nThe tweet includes a poll:\n\n> πŸ”˜ " + tweet.poll.join("\n> πŸ”˜ "); + if (tweet.poll) text = `- ${tweet.poll.join("\n- ")}\n\n${text}`; if (tweet.reply) text = `Replying to ${tweet.reply}\n\n${text}`; @@ -90,22 +92,26 @@ function tweetToCheckRunSummary({ tweet, payload, dir }, threading) { const media = tweet.media .map(({ file, alt }) => { const fileName = file.replace(dir, ""); - const url = `https://raw.githubusercontent.com/${payload.repository.owner.login}/${payload.repository.name}/${payload.after}${fileName}`; - return `${alt}\n`; + if (textOnly) { + return `- ${fileName} [${alt}]`; + } else { + return `${alt}\n`; + } }) - .join("\n\n"); - text = `Uploading media:\n\n${media}\n\n${text}`.trim(); + .join(textOnly ? "\n" : "\n\n"); + text = `${media}\n\n${text}`.trim(); } if (tweet.thread || threading) { - let cells = `\n\n\n${text}\n\n`; + const count = threading ? threading + 1 : 1; + let thread = `\n\n#### --- 🧡 ${count} ---\n\n${text}`; if (tweet.thread) - cells += tweetToCheckRunSummary( - { tweet: tweet.thread, payload, dir }, - true + thread += tweetToCheckRunSummary( + { ...state, tweet: tweet.thread }, + count ); - return threading ? cells : `### βœ… Valid\n\n${cells}\n
`; + return threading ? thread : `### βœ… Valid Thread${thread}`; } - return `### βœ… Valid\n\n${text}`; + return `### βœ… Valid Tweet\n\n${text}`; } diff --git a/lib/pull-request/index.js b/lib/pull-request/index.js index 14eb5f14..876c1014 100644 --- a/lib/pull-request/index.js +++ b/lib/pull-request/index.js @@ -6,7 +6,7 @@ const createCheckRun = require("./create-check-run"); async function handlePullRequest(state) { const { octokit, toolkit, payload } = state; - // ignore builds from branches other than the repository’s defaul branch + // ignore builds from branches other than the repository’s default branch const base = payload.pull_request.base.ref; const defaultBranch = payload.repository.default_branch; if (defaultBranch !== base) { diff --git a/test/pull-request-has-tweet-issue-comment-updated/event.json b/test/pull-request-has-tweet-issue-comment-updated/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-issue-comment-updated/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-issue-comment-updated/test.js b/test/pull-request-has-tweet-issue-comment-updated/test.js new file mode 100644 index 00000000..f14aa58f --- /dev/null +++ b/test/pull-request-has-tweet-issue-comment-updated/test.js @@ -0,0 +1,141 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; +process.env.ENABLE_COMMENTS = "1"; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/hello-world.tweet b/tweets/hello-world.tweet +new file mode 100644 +index 0000000..0123456 +--- /dev/null ++++ b/tweets/hello-world.tweet +@@ -0,0 +1 @@ ++Hello, world!` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: "### βœ… Valid Tweet\n\n> Hello, world!", + }); + + return true; + }) + .reply(201); + +// check for comments +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // has a comment + .get("/repos/twitter-together/action/issues/123/comments") + .reply(200, [ + { + id: 454, + user: { login: "some-other-account" }, + body: "blah", + }, + { + id: 455, + user: { login: "github-actions[bot]" }, + body: "A comment generated by some other action", + }, + { + id: 456, + user: { login: "github-actions[bot]" }, + body: `## Found 1 new .tweet file(s) + +### βœ… Valid Tweet + +> Hello, world! + +--- + + + +Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action) + +`, + }, + ]); + +// update comment +nock("https://api.github.com") + // get changed files + .patch("/repos/twitter-together/action/issues/comments/456", ({ body }) => { + tap.same( + body, + `## Found 1 new .tweet file(s) + +### βœ… Valid Tweet + +> Hello, world! + +--- + + + +**Updated** preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action) + +` + ); + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-issue-comment/event.json b/test/pull-request-has-tweet-issue-comment/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-has-tweet-issue-comment/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-has-tweet-issue-comment/test.js b/test/pull-request-has-tweet-issue-comment/test.js new file mode 100644 index 00000000..fe769745 --- /dev/null +++ b/test/pull-request-has-tweet-issue-comment/test.js @@ -0,0 +1,113 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; +process.env.ENABLE_COMMENTS = "1"; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/hello-world.tweet b/tweets/hello-world.tweet +new file mode 100644 +index 0000000..0123456 +--- /dev/null ++++ b/tweets/hello-world.tweet +@@ -0,0 +1 @@ ++Hello, world!` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: "### βœ… Valid Tweet\n\n> Hello, world!", + }); + + return true; + }) + .reply(201); + +// check for comments +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // no comments + .get("/repos/twitter-together/action/issues/123/comments") + .reply(200, []); + +// post comment +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/issues/123/comments", ({ body }) => { + tap.same( + body, + `## Found 1 new .tweet file(s) + +### βœ… Valid Tweet + +> Hello, world! + +--- + + + +Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action) + +` + ); + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/pull-request-has-tweet-no-newline/test.js b/test/pull-request-has-tweet-no-newline/test.js index 864069ce..8c5c37da 100644 --- a/test/pull-request-has-tweet-no-newline/test.js +++ b/test/pull-request-has-tweet-no-newline/test.js @@ -65,7 +65,7 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: "### βœ… Valid\n\n> Hello, world!", + summary: "### βœ… Valid Tweet\n\n> Hello, world!", }); return true; diff --git a/test/pull-request-has-tweet-with-front-matter-media/test.js b/test/pull-request-has-tweet-with-front-matter-media/test.js index 985a7e33..0aee447b 100644 --- a/test/pull-request-has-tweet-with-front-matter-media/test.js +++ b/test/pull-request-has-tweet-with-front-matter-media/test.js @@ -80,9 +80,7 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### βœ… Valid - -Uploading media: + summary: `### βœ… Valid Tweet A cat diff --git a/test/pull-request-has-tweet-with-front-matter-poll-5-options/test.js b/test/pull-request-has-tweet-with-front-matter-poll-5-options/test.js index e047b62c..d65c9a4b 100644 --- a/test/pull-request-has-tweet-with-front-matter-poll-5-options/test.js +++ b/test/pull-request-has-tweet-with-front-matter-poll-5-options/test.js @@ -72,20 +72,22 @@ nock("https://api.github.com") tap.equal(body.conclusion, "failure"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### ❌ Invalid + summary: `### ❌ Invalid Tweet -> --- -> poll: -> - Red -> - Blue -> - Green -> - Orange -> - Purple -> --- -> -> What is your favorite color? +\`\`\`tweet +--- +poll: + - Red + - Blue + - Green + - Orange + - Purple +--- -Polls cannot have more than four options, found 5 options`, +What is your favorite color? +\`\`\` + +**Polls cannot have more than four options, found 5 options**`, }); return true; diff --git a/test/pull-request-has-tweet-with-front-matter-poll/test.js b/test/pull-request-has-tweet-with-front-matter-poll/test.js index 4ab80352..8ab77e31 100644 --- a/test/pull-request-has-tweet-with-front-matter-poll/test.js +++ b/test/pull-request-has-tweet-with-front-matter-poll/test.js @@ -70,15 +70,13 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### βœ… Valid + summary: `### βœ… Valid Tweet -> What is your favorite color? +- Red +- Blue +- Green -The tweet includes a poll: - -> πŸ”˜ Red -> πŸ”˜ Blue -> πŸ”˜ Green`, +> What is your favorite color?`, }); return true; diff --git a/test/pull-request-has-tweet-with-front-matter-quote/test.js b/test/pull-request-has-tweet-with-front-matter-quote/test.js index 2fd6c337..e6594ac3 100644 --- a/test/pull-request-has-tweet-with-front-matter-quote/test.js +++ b/test/pull-request-has-tweet-with-front-matter-quote/test.js @@ -67,7 +67,7 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### βœ… Valid + summary: `### βœ… Valid Tweet Retweeting https://twitter.com/m2rg/status/0000000000000000001 diff --git a/test/pull-request-has-tweet-with-front-matter-reply-invalid/test.js b/test/pull-request-has-tweet-with-front-matter-reply-invalid/test.js index 2e5a74f6..7c61e21c 100644 --- a/test/pull-request-has-tweet-with-front-matter-reply-invalid/test.js +++ b/test/pull-request-has-tweet-with-front-matter-reply-invalid/test.js @@ -65,13 +65,15 @@ nock("https://api.github.com") tap.equal(body.conclusion, "failure"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### ❌ Invalid + summary: `### ❌ Invalid Tweet -> --- -> reply: spoons -> --- +\`\`\`tweet +--- +reply: spoons +--- +\`\`\` -Invalid tweet reference: spoons`, +**Invalid tweet reference: spoons**`, }); return true; diff --git a/test/pull-request-has-tweet-with-front-matter-reply/test.js b/test/pull-request-has-tweet-with-front-matter-reply/test.js index 4a6ae4e6..f3c86c2e 100644 --- a/test/pull-request-has-tweet-with-front-matter-reply/test.js +++ b/test/pull-request-has-tweet-with-front-matter-reply/test.js @@ -67,7 +67,7 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### βœ… Valid + summary: `### βœ… Valid Tweet Replying to https://twitter.com/m2rg/status/0000000000000000001 diff --git a/test/pull-request-has-tweet-with-front-matter-retweet-invalid/test.js b/test/pull-request-has-tweet-with-front-matter-retweet-invalid/test.js index edae2594..8e07169e 100644 --- a/test/pull-request-has-tweet-with-front-matter-retweet-invalid/test.js +++ b/test/pull-request-has-tweet-with-front-matter-retweet-invalid/test.js @@ -65,13 +65,15 @@ nock("https://api.github.com") tap.equal(body.conclusion, "failure"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### ❌ Invalid + summary: `### ❌ Invalid Tweet -> --- -> retweet: spoons -> --- +\`\`\`tweet +--- +retweet: spoons +--- +\`\`\` -Invalid tweet reference: spoons`, +**Invalid tweet reference: spoons**`, }); return true; diff --git a/test/pull-request-has-tweet-with-front-matter-retweet/test.js b/test/pull-request-has-tweet-with-front-matter-retweet/test.js index e88d804e..ea257f45 100644 --- a/test/pull-request-has-tweet-with-front-matter-retweet/test.js +++ b/test/pull-request-has-tweet-with-front-matter-retweet/test.js @@ -65,7 +65,7 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### βœ… Valid + summary: `### βœ… Valid Tweet Retweeting https://twitter.com/m2rg/status/0000000000000000001`, }); diff --git a/test/pull-request-has-tweet-with-poll-with-5-options/test.js b/test/pull-request-has-tweet-with-poll-with-5-options/test.js index 1dd253dd..37d4024e 100644 --- a/test/pull-request-has-tweet-with-poll-with-5-options/test.js +++ b/test/pull-request-has-tweet-with-poll-with-5-options/test.js @@ -69,17 +69,19 @@ nock("https://api.github.com") tap.equal(body.conclusion, "failure"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### ❌ Invalid + summary: `### ❌ Invalid Tweet -> Here is my poll -> -> ( ) option 1 -> ( ) option 2 -> ( ) option 3 -> ( ) option 4 -> ( ) option 5 +\`\`\`tweet +Here is my poll -Polls cannot have more than four options, found 5 options`, +( ) option 1 +( ) option 2 +( ) option 3 +( ) option 4 +( ) option 5 +\`\`\` + +**Polls cannot have more than four options, found 5 options**`, }); return true; diff --git a/test/pull-request-has-tweet-with-poll/test.js b/test/pull-request-has-tweet-with-poll/test.js index dcaf4c99..668acb15 100644 --- a/test/pull-request-has-tweet-with-poll/test.js +++ b/test/pull-request-has-tweet-with-poll/test.js @@ -68,16 +68,14 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### βœ… Valid + summary: `### βœ… Valid Tweet -> Here is my poll +- option 1 +- option 2 +- option 3 +- option 4 -The tweet includes a poll: - -> πŸ”˜ option 1 -> πŸ”˜ option 2 -> πŸ”˜ option 3 -> πŸ”˜ option 4`, +> Here is my poll`, }); return true; diff --git a/test/pull-request-has-tweet-with-thread/test.js b/test/pull-request-has-tweet-with-thread/test.js index b150c932..955467f7 100644 --- a/test/pull-request-has-tweet-with-thread/test.js +++ b/test/pull-request-has-tweet-with-thread/test.js @@ -77,35 +77,26 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### βœ… Valid + summary: `### βœ… Valid Thread - - - - - -
+#### --- 🧡 1 --- > 🧡 Here is a thread... -
+#### --- 🧡 2 --- -> Which fruit is more delicious? - -The tweet includes a poll: +- Banana +- Mango -> πŸ”˜ Banana -> πŸ”˜ Mango +> Which fruit is more delicious? -
+#### --- 🧡 3 --- > We hope you enjoyed this thread... -
- -> We certainly did. +#### --- 🧡 4 --- -
`, +> We certainly did.`, }); return true; diff --git a/test/pull-request-has-tweet/test.js b/test/pull-request-has-tweet/test.js index 36d3c7a3..9be1e4c1 100644 --- a/test/pull-request-has-tweet/test.js +++ b/test/pull-request-has-tweet/test.js @@ -63,7 +63,7 @@ nock("https://api.github.com") tap.equal(body.conclusion, "success"); tap.same(body.output, { title: "1 tweet(s)", - summary: "### βœ… Valid\n\n> Hello, world!", + summary: "### βœ… Valid Tweet\n\n> Hello, world!", }); return true; diff --git a/test/pull-request-invalid-tweet/test.js b/test/pull-request-invalid-tweet/test.js index c984bd10..2341b056 100644 --- a/test/pull-request-invalid-tweet/test.js +++ b/test/pull-request-invalid-tweet/test.js @@ -66,11 +66,13 @@ nock("https://api.github.com", { tap.equal(body.conclusion, "failure"); tap.same(body.output, { title: "1 tweet(s)", - summary: `### ❌ Invalid + summary: `### ❌ Invalid Tweet -> Cupcake ipsum dolor sit amet chupa chups candy halvah I love. Apple pie gummi bears chupa chups jujubes I love cake jelly. Jelly candy canes pudding jujubes caramels sweet roll I love. Sweet fruitcake oat cake I love brownie sesame snaps apple pie lollipop. Pie dragΓ©e I love apple pie cotton candy candy chocolate bar. +\`\`\`tweet +Cupcake ipsum dolor sit amet chupa chups candy halvah I love. Apple pie gummi bears chupa chups jujubes I love cake jelly. Jelly candy canes pudding jujubes caramels sweet roll I love. Sweet fruitcake oat cake I love brownie sesame snaps apple pie lollipop. Pie dragΓ©e I love apple pie cotton candy candy chocolate bar. +\`\`\` -Tweet exceeds maximum length of 280 characters by 39 characters`, +**Tweet exceeds maximum length of 280 characters by 39 characters**`, }); return true; diff --git a/test/pull-request-target-has-tweet-issue-comment/event.json b/test/pull-request-target-has-tweet-issue-comment/event.json new file mode 100644 index 00000000..ad692d8e --- /dev/null +++ b/test/pull-request-target-has-tweet-issue-comment/event.json @@ -0,0 +1,22 @@ +{ + "action": "opened", + "pull_request": { + "number": 123, + "base": { + "ref": "main" + }, + "head": { + "sha": "0000000000000000000000000000000000000002", + "repo": { + "fork": false + } + } + }, + "repository": { + "default_branch": "main", + "name": "action", + "owner": { + "login": "twitter-together" + } + } +} diff --git a/test/pull-request-target-has-tweet-issue-comment/test.js b/test/pull-request-target-has-tweet-issue-comment/test.js new file mode 100644 index 00000000..a1f25d63 --- /dev/null +++ b/test/pull-request-target-has-tweet-issue-comment/test.js @@ -0,0 +1,112 @@ +/** + * This test checks the happy path of pull request adding a new *.tweet file + */ + +const nock = require("nock"); +const tap = require("tap"); + +// SETUP +process.env.GITHUB_EVENT_NAME = "pull_request_target"; +process.env.GITHUB_TOKEN = "secret123"; +process.env.GITHUB_EVENT_PATH = require.resolve("./event.json"); + +// set other env variables so action-toolkit is happy +process.env.GITHUB_REF = ""; +process.env.GITHUB_WORKSPACE = ""; +process.env.GITHUB_WORKFLOW = ""; +process.env.GITHUB_ACTION = "twitter-together"; +process.env.GITHUB_ACTOR = ""; +process.env.GITHUB_REPOSITORY = ""; +process.env.GITHUB_SHA = ""; + +// MOCK +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // get changed files + .get("/repos/twitter-together/action/pulls/123/files") + .reply(200, [ + { + status: "added", + filename: "tweets/hello-world.tweet", + }, + ]); + +// get pull request diff +nock("https://api.github.com", { + reqheaders: { + accept: "application/vnd.github.diff", + authorization: "token secret123", + }, +}) + .get("/repos/twitter-together/action/pulls/123") + .reply( + 200, + `diff --git a/tweets/hello-world.tweet b/tweets/hello-world.tweet +new file mode 100644 +index 0000000..0123456 +--- /dev/null ++++ b/tweets/hello-world.tweet +@@ -0,0 +1 @@ ++Hello, world!` + ); + +// create check run +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/check-runs", (body) => { + tap.equal(body.name, "preview"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.status, "completed"); + tap.equal(body.conclusion, "success"); + tap.same(body.output, { + title: "1 tweet(s)", + summary: "### βœ… Valid Tweet\n\n> Hello, world!", + }); + + return true; + }) + .reply(201); + +// check for comments +nock("https://api.github.com", { + reqheaders: { + authorization: "token secret123", + }, +}) + // no comments + .get("/repos/twitter-together/action/issues/123/comments") + .reply(200, []); + +// post comment +nock("https://api.github.com") + // get changed files + .post("/repos/twitter-together/action/issues/123/comments", ({ body }) => { + tap.same( + body, + `## Found 1 new .tweet file(s) + +### βœ… Valid Tweet + +> Hello, world! + +--- + + + +Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action) + +` + ); + return true; + }) + .reply(201); + +process.on("exit", (code) => { + tap.equal(code, 0); + tap.same(nock.pendingMocks(), []); +}); + +require("../../lib"); diff --git a/test/push-main-tweet-error/test.js b/test/push-main-tweet-error/test.js index b18c14ef..2aff9068 100644 --- a/test/push-main-tweet-error/test.js +++ b/test/push-main-tweet-error/test.js @@ -45,7 +45,6 @@ nock("https://api.github.com", { .post( "/repos/twitter-together/action/commits/0000000000000000000000000000000000000002/comments", (body) => { - console.log(body.body); tap.equal( body.body, "Errors:\n\n- Tweet exceeds maximum length of 280 characters by 166 characters" From 4cc21bb064511b8cfb3e1928b087ab332372e50c Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Fri, 14 Oct 2022 14:07:40 +0000 Subject: [PATCH 08/13] Skip redudant check run if using comments --- lib/pull-request/create-check-run.js | 23 ++++++++++++------- .../test.js | 21 ++--------------- .../test.js | 19 +-------------- .../event.json | 8 +++++-- .../test.js | 2 +- .../test.js | 19 +-------------- 6 files changed, 26 insertions(+), 66 deletions(-) diff --git a/lib/pull-request/create-check-run.js b/lib/pull-request/create-check-run.js index 5a1a46fc..b547b6ab 100644 --- a/lib/pull-request/create-check-run.js +++ b/lib/pull-request/create-check-run.js @@ -1,3 +1,5 @@ +// TODO REFACTOR HIS + module.exports = createCheckRun; const { autoLink } = require("twitter-text"); @@ -23,9 +25,10 @@ async function createCheckRun( const allTweetsValid = parsedTweets.every((tweet) => tweet.valid); - // Check runs cannot and comments cannot be created if the pull request was created by a fork, - // so we just log out the result and fallback to text-only rendering (no HTML for images, etc) + // Check runs cannot be created if the pull request was created by a fork // https://help.github.com/en/actions/automating-your-workflow-with-github-actions/authenticating-with-the-github_token#permissions-for-the-github_token + + // fallback to a text only log if we are not posting markdown comments (strip HTML) const textOnly = payload.pull_request.head.repo.fork && trigger === "pull_request"; @@ -33,11 +36,17 @@ async function createCheckRun( .map((tweet) => tweetToCheckRunSummary({ tweet, payload, dir, textOnly })) .join("\n\n---\n\n"); - const body = `## Found ${parsedTweets.length} new .tweet file(s)\n\n${summary}`; + const body = `## Found ${parsedTweets.length} new \`.tweet\` file(s)\n\n${summary}`; if (textOnly) { - // just log the result toolkit.info(body); + } else if (comments) { + await updateIssue({ octokit, payload, body }); + } + + // exit before the check run if we've posted a comment or cannot do the check run + + if (payload.pull_request.head.repo.fork || comments) { process.exit(allTweetsValid ? 0 : 1); } else if (comments) { // make a comment if we can @@ -47,9 +56,6 @@ async function createCheckRun( const response = await octokit.request( "POST /repos/:owner/:repo/check-runs", { - headers: { - accept: "application/vnd.github.antiope-preview+json", - }, owner: payload.repository.owner.login, repo: payload.repository.name, name: "preview", @@ -95,7 +101,8 @@ function tweetToCheckRunSummary(state, threading = false) { if (textOnly) { return `- ${fileName} [${alt}]`; } else { - return `${alt}\n`; + const { repo, sha } = payload.pull_request.head; + return `${alt}\n`; } }) .join(textOnly ? "\n" : "\n\n"); diff --git a/test/pull-request-has-tweet-issue-comment-updated/test.js b/test/pull-request-has-tweet-issue-comment-updated/test.js index f14aa58f..d409c05c 100644 --- a/test/pull-request-has-tweet-issue-comment-updated/test.js +++ b/test/pull-request-has-tweet-issue-comment-updated/test.js @@ -54,23 +54,6 @@ index 0000000..0123456 +Hello, world!` ); -// create check run -nock("https://api.github.com") - // get changed files - .post("/repos/twitter-together/action/check-runs", (body) => { - tap.equal(body.name, "preview"); - tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); - tap.equal(body.status, "completed"); - tap.equal(body.conclusion, "success"); - tap.same(body.output, { - title: "1 tweet(s)", - summary: "### βœ… Valid Tweet\n\n> Hello, world!", - }); - - return true; - }) - .reply(201); - // check for comments nock("https://api.github.com", { reqheaders: { @@ -93,7 +76,7 @@ nock("https://api.github.com", { { id: 456, user: { login: "github-actions[bot]" }, - body: `## Found 1 new .tweet file(s) + body: `## Found 1 new \`.tweet\` file(s) ### βœ… Valid Tweet @@ -115,7 +98,7 @@ nock("https://api.github.com") .patch("/repos/twitter-together/action/issues/comments/456", ({ body }) => { tap.same( body, - `## Found 1 new .tweet file(s) + `## Found 1 new \`.tweet\` file(s) ### βœ… Valid Tweet diff --git a/test/pull-request-has-tweet-issue-comment/test.js b/test/pull-request-has-tweet-issue-comment/test.js index fe769745..81f48fb8 100644 --- a/test/pull-request-has-tweet-issue-comment/test.js +++ b/test/pull-request-has-tweet-issue-comment/test.js @@ -54,23 +54,6 @@ index 0000000..0123456 +Hello, world!` ); -// create check run -nock("https://api.github.com") - // get changed files - .post("/repos/twitter-together/action/check-runs", (body) => { - tap.equal(body.name, "preview"); - tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); - tap.equal(body.status, "completed"); - tap.equal(body.conclusion, "success"); - tap.same(body.output, { - title: "1 tweet(s)", - summary: "### βœ… Valid Tweet\n\n> Hello, world!", - }); - - return true; - }) - .reply(201); - // check for comments nock("https://api.github.com", { reqheaders: { @@ -87,7 +70,7 @@ nock("https://api.github.com") .post("/repos/twitter-together/action/issues/123/comments", ({ body }) => { tap.same( body, - `## Found 1 new .tweet file(s) + `## Found 1 new \`.tweet\` file(s) ### βœ… Valid Tweet diff --git a/test/pull-request-has-tweet-with-front-matter-media/event.json b/test/pull-request-has-tweet-with-front-matter-media/event.json index eca974a6..6eb7c183 100644 --- a/test/pull-request-has-tweet-with-front-matter-media/event.json +++ b/test/pull-request-has-tweet-with-front-matter-media/event.json @@ -7,9 +7,13 @@ "ref": "main" }, "head": { - "sha": "0000000000000000000000000000000000000002", + "sha": "0000000000000000000000000000000000000003", "repo": { - "fork": false + "name": "action", + "fork": false, + "owner": { + "login": "twitter-together" + } } } }, diff --git a/test/pull-request-has-tweet-with-front-matter-media/test.js b/test/pull-request-has-tweet-with-front-matter-media/test.js index 0aee447b..b2d78054 100644 --- a/test/pull-request-has-tweet-with-front-matter-media/test.js +++ b/test/pull-request-has-tweet-with-front-matter-media/test.js @@ -75,7 +75,7 @@ nock("https://api.github.com") // get changed files .post("/repos/twitter-together/action/check-runs", (body) => { tap.equal(body.name, "preview"); - tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); + tap.equal(body.head_sha, "0000000000000000000000000000000000000003"); tap.equal(body.status, "completed"); tap.equal(body.conclusion, "success"); tap.same(body.output, { diff --git a/test/pull-request-target-has-tweet-issue-comment/test.js b/test/pull-request-target-has-tweet-issue-comment/test.js index a1f25d63..00ee9d46 100644 --- a/test/pull-request-target-has-tweet-issue-comment/test.js +++ b/test/pull-request-target-has-tweet-issue-comment/test.js @@ -53,23 +53,6 @@ index 0000000..0123456 +Hello, world!` ); -// create check run -nock("https://api.github.com") - // get changed files - .post("/repos/twitter-together/action/check-runs", (body) => { - tap.equal(body.name, "preview"); - tap.equal(body.head_sha, "0000000000000000000000000000000000000002"); - tap.equal(body.status, "completed"); - tap.equal(body.conclusion, "success"); - tap.same(body.output, { - title: "1 tweet(s)", - summary: "### βœ… Valid Tweet\n\n> Hello, world!", - }); - - return true; - }) - .reply(201); - // check for comments nock("https://api.github.com", { reqheaders: { @@ -86,7 +69,7 @@ nock("https://api.github.com") .post("/repos/twitter-together/action/issues/123/comments", ({ body }) => { tap.same( body, - `## Found 1 new .tweet file(s) + `## Found 1 new \`.tweet\` file(s) ### βœ… Valid Tweet From d148b5d47d5d1372205ce971e674d0bfdebbb245 Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Sat, 15 Oct 2022 03:54:09 +0000 Subject: [PATCH 09/13] Refactor, update comment footer --- lib/index.js | 8 +- lib/pull-request/create-check-run.js | 109 +----------------- .../create-comment.js} | 13 ++- lib/pull-request/generate-summary.js | 79 +++++++++++++ lib/pull-request/index.js | 38 +++++- .../test.js | 12 +- .../test.js | 6 +- .../test.js | 6 +- 8 files changed, 132 insertions(+), 139 deletions(-) rename lib/{common/update-issue.js => pull-request/create-comment.js} (76%) create mode 100644 lib/pull-request/generate-summary.js diff --git a/lib/index.js b/lib/index.js index 367b5760..550c7bae 100644 --- a/lib/index.js +++ b/lib/index.js @@ -47,10 +47,8 @@ async function main() { const sha = process.env.GITHUB_SHA; const dir = process.env.GITHUB_WORKSPACE; const trigger = process.env.GITHUB_EVENT_NAME; - // do not make comments by default if "pull_request_target" is not used - // but optionally allow enabling them on "pull_request" for local branches - const comments = - !!process.env.ENABLE_COMMENTS || trigger === "pull_request_target"; + // optionally allow enabling comments them on "pull_request" for local branches + const enableComments = !!process.env.ENABLE_COMMENTS; const githubState = { ...state, @@ -61,7 +59,7 @@ async function main() { sha, dir, trigger, - comments, + enableComments, }; if (trigger === "push") { diff --git a/lib/pull-request/create-check-run.js b/lib/pull-request/create-check-run.js index b547b6ab..53086927 100644 --- a/lib/pull-request/create-check-run.js +++ b/lib/pull-request/create-check-run.js @@ -1,58 +1,9 @@ -// TODO REFACTOR HIS - module.exports = createCheckRun; -const { autoLink } = require("twitter-text"); - -const parseTweetFileContent = require("../common/parse-tweet-file-content"); -const updateIssue = require("../common/update-issue"); - async function createCheckRun( - { octokit, payload, startedAt, toolkit, dir, trigger, comments }, - newTweets + { payload, startedAt, octokit, toolkit }, + summary ) { - const parsedTweets = newTweets.map((rawTweet) => { - try { - return parseTweetFileContent(rawTweet, dir); - } catch (error) { - return { - error: error.message, - valid: false, - text: rawTweet, - }; - } - }); - - const allTweetsValid = parsedTweets.every((tweet) => tweet.valid); - - // Check runs cannot be created if the pull request was created by a fork - // https://help.github.com/en/actions/automating-your-workflow-with-github-actions/authenticating-with-the-github_token#permissions-for-the-github_token - - // fallback to a text only log if we are not posting markdown comments (strip HTML) - const textOnly = - payload.pull_request.head.repo.fork && trigger === "pull_request"; - - const summary = parsedTweets - .map((tweet) => tweetToCheckRunSummary({ tweet, payload, dir, textOnly })) - .join("\n\n---\n\n"); - - const body = `## Found ${parsedTweets.length} new \`.tweet\` file(s)\n\n${summary}`; - - if (textOnly) { - toolkit.info(body); - } else if (comments) { - await updateIssue({ octokit, payload, body }); - } - - // exit before the check run if we've posted a comment or cannot do the check run - - if (payload.pull_request.head.repo.fork || comments) { - process.exit(allTweetsValid ? 0 : 1); - } else if (comments) { - // make a comment if we can - await updateIssue({ octokit, payload, body }); - } - const response = await octokit.request( "POST /repos/:owner/:repo/check-runs", { @@ -63,62 +14,12 @@ async function createCheckRun( started_at: startedAt, completed_at: new Date().toISOString(), status: "completed", - conclusion: allTweetsValid ? "success" : "failure", + conclusion: summary.valid ? "success" : "failure", output: { - title: `${parsedTweets.length} tweet(s)`, - summary, + title: `${summary.count} tweet(s)`, + summary: summary.body, }, } ); - toolkit.info(`check run created: ${response.data.html_url}`); } - -function tweetToCheckRunSummary(state, threading = false) { - const { tweet, payload, dir, textOnly } = state; - - if (!tweet.valid) - return `### ❌ Invalid Tweet\n\n\`\`\`tweet\n${tweet.text}\n\`\`\`\n\n**${ - tweet.error || "Unknown error" - }**`; - - let text = !tweet.text - ? "" - : autoLink(tweet.text) - .replace(/(^|\n)/g, "$1> ") - .replace(/(^|\n)> (\n|$)/g, "$1>$2"); - - if (tweet.poll) text = `- ${tweet.poll.join("\n- ")}\n\n${text}`; - - if (tweet.reply) text = `Replying to ${tweet.reply}\n\n${text}`; - - if (tweet.retweet) text = `Retweeting ${tweet.retweet}\n\n${text}`.trim(); - - if (tweet.media.length) { - const media = tweet.media - .map(({ file, alt }) => { - const fileName = file.replace(dir, ""); - if (textOnly) { - return `- ${fileName} [${alt}]`; - } else { - const { repo, sha } = payload.pull_request.head; - return `${alt}\n`; - } - }) - .join(textOnly ? "\n" : "\n\n"); - text = `${media}\n\n${text}`.trim(); - } - - if (tweet.thread || threading) { - const count = threading ? threading + 1 : 1; - let thread = `\n\n#### --- 🧡 ${count} ---\n\n${text}`; - if (tweet.thread) - thread += tweetToCheckRunSummary( - { ...state, tweet: tweet.thread }, - count - ); - return threading ? thread : `### βœ… Valid Thread${thread}`; - } - - return `### βœ… Valid Tweet\n\n${text}`; -} diff --git a/lib/common/update-issue.js b/lib/pull-request/create-comment.js similarity index 76% rename from lib/common/update-issue.js rename to lib/pull-request/create-comment.js index 3fc4f859..2949b9c6 100644 --- a/lib/common/update-issue.js +++ b/lib/pull-request/create-comment.js @@ -1,14 +1,15 @@ -module.exports = updateIssue; +module.exports = createComment; const BOT_LOGIN = "github-actions[bot]"; -const DIVIDER = "\n\n---\n\n\n\n"; +const DIVIDER = "\n\n---\n\n*"; const PREVIEW = `${DIVIDER}Preview using `; const UPDATED = `${DIVIDER}**Updated** preview using `; const SIGNATURE = - " generated by [Twitter, together!](https://github.com/twitter-together/action)\n\n"; + " generated by [Twitter, together!](https://github.com/twitter-together/action)*"; -async function updateIssue({ octokit, payload, body }) { +async function createComment({ octokit, payload }, summary) { + const comment = `${summary.title}${summary.body}`; // check for existing comments. const comments = await octokit.request( "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", @@ -31,7 +32,7 @@ async function updateIssue({ octokit, payload, body }) { owner: payload.repository.owner.login, repo: payload.repository.name, comment_id: match.id, - body: `${body}${UPDATED}${payload.pull_request.head.sha}${SIGNATURE}`, + body: `${comment}${UPDATED}${payload.pull_request.head.sha}${SIGNATURE}`, } ); } else { @@ -42,7 +43,7 @@ async function updateIssue({ octokit, payload, body }) { owner: payload.repository.owner.login, repo: payload.repository.name, issue_number: payload.pull_request.number, - body: `${body}${PREVIEW}${payload.pull_request.head.sha}${SIGNATURE}`, + body: `${comment}${PREVIEW}${payload.pull_request.head.sha}${SIGNATURE}`, } ); } diff --git a/lib/pull-request/generate-summary.js b/lib/pull-request/generate-summary.js new file mode 100644 index 00000000..a7cfccab --- /dev/null +++ b/lib/pull-request/generate-summary.js @@ -0,0 +1,79 @@ +module.exports = generateSummary; + +const { autoLink } = require("twitter-text"); + +const parseTweetFileContent = require("../common/parse-tweet-file-content"); +const getNewTweets = require("./get-new-tweets"); + +async function generateSummary(state, plainText = false) { + const { payload, dir } = state; + + const newTweets = await getNewTweets(state); + + const parsedTweets = newTweets.map((tweet) => { + try { + return parseTweetFileContent(tweet, dir); + } catch (error) { + return { + error: error.message, + valid: false, + text: tweet, + }; + } + }); + + return { + count: parsedTweets.length, + valid: parsedTweets.every((tweet) => tweet.valid), + title: `## Found ${parsedTweets.length} new \`.tweet\` file(s)\n\n`, + body: parsedTweets + .map((tweet) => summarizeTweet({ tweet, payload, dir, plainText })) + .join("\n\n---\n\n"), + }; +} + +function summarizeTweet(state, threading = false) { + const { tweet, payload, dir, plainText } = state; + + if (!tweet.valid) + return `### ❌ Invalid Tweet\n\n\`\`\`tweet\n${tweet.text}\n\`\`\`\n\n**${ + tweet.error || "Unknown error" + }**`; + + let text = !tweet.text + ? "" + : autoLink(tweet.text) + .replace(/(^|\n)/g, "$1> ") + .replace(/(^|\n)> (\n|$)/g, "$1>$2"); + + if (tweet.poll) text = `- ${tweet.poll.join("\n- ")}\n\n${text}`; + + if (tweet.reply) text = `Replying to ${tweet.reply}\n\n${text}`; + + if (tweet.retweet) text = `Retweeting ${tweet.retweet}\n\n${text}`.trim(); + + if (tweet.media.length) { + const media = tweet.media + .map(({ file, alt }) => { + const fileName = file.replace(dir, ""); + if (plainText) { + return `- ${fileName} [${alt}]`; + } else { + const { repo, sha } = payload.pull_request.head; + return `${alt}\n`; + } + }) + .join(plainText ? "\n" : "\n\n"); + text = `${media}\n\n${text}`.trim(); + } + + if (tweet.thread || threading) { + const count = threading ? threading + 1 : 1; + let thread = `\n\n#### --- 🧡 ${count} ---\n\n${text}`; + if (tweet.thread) + thread += summarizeTweet({ ...state, tweet: tweet.thread }, count); + return threading ? thread : `### βœ… Valid Thread${thread}`; + } + + return `### βœ… Valid Tweet\n\n${text}`; +} diff --git a/lib/pull-request/index.js b/lib/pull-request/index.js index 876c1014..f10070f1 100644 --- a/lib/pull-request/index.js +++ b/lib/pull-request/index.js @@ -1,14 +1,21 @@ module.exports = handlePullRequest; -const getNewTweets = require("./get-new-tweets"); const createCheckRun = require("./create-check-run"); +const createComment = require("./create-comment"); +const generateSummary = require("./generate-summary"); + +const CHECK = "check"; +const LOG = "log"; +const COMMENT = "comment"; async function handlePullRequest(state) { - const { octokit, toolkit, payload } = state; + const { octokit, toolkit, payload, trigger, enableComments } = state; // ignore builds from branches other than the repository’s default branch const base = payload.pull_request.base.ref; const defaultBranch = payload.repository.default_branch; + const fork = !!payload.pull_request.head.repo.fork; + if (defaultBranch !== base) { return toolkit.info( `Pull request base "${base}" is not the repository’s default branch` @@ -22,6 +29,29 @@ async function handlePullRequest(state) { process.exit(); }); - const newTweets = await getNewTweets(state); - await createCheckRun(state, newTweets); + // default report type, for `pull_request` non-fork PRs + let reportType = CHECK; + // can only log the output for fork PRs without check run permissions + if (fork && trigger === "pull_request") { + reportType = LOG; + } + // assume use of comments for `pull_request_target` PRs + // optional: use comments instead of check runs for `pull_request` + if (trigger === "pull_request_target" || enableComments) { + reportType = COMMENT; + } + + const summary = await generateSummary(state, reportType === LOG); + + if (reportType === LOG) { + toolkit.info(summary.body); + process.exit(summary.valid ? 0 : 1); + } + if (reportType === COMMENT) { + await createComment(state, summary); + process.exit(summary.valid ? 0 : 1); + } + if (reportType === CHECK) { + await createCheckRun(state, summary); + } } diff --git a/test/pull-request-has-tweet-issue-comment-updated/test.js b/test/pull-request-has-tweet-issue-comment-updated/test.js index d409c05c..4767872e 100644 --- a/test/pull-request-has-tweet-issue-comment-updated/test.js +++ b/test/pull-request-has-tweet-issue-comment-updated/test.js @@ -84,11 +84,7 @@ nock("https://api.github.com", { --- - - -Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action) - -`, +*Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action)*`, }, ]); @@ -106,11 +102,7 @@ nock("https://api.github.com") --- - - -**Updated** preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action) - -` +***Updated** preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action)*` ); return true; }) diff --git a/test/pull-request-has-tweet-issue-comment/test.js b/test/pull-request-has-tweet-issue-comment/test.js index 81f48fb8..f4592abe 100644 --- a/test/pull-request-has-tweet-issue-comment/test.js +++ b/test/pull-request-has-tweet-issue-comment/test.js @@ -78,11 +78,7 @@ nock("https://api.github.com") --- - - -Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action) - -` +*Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action)*` ); return true; }) diff --git a/test/pull-request-target-has-tweet-issue-comment/test.js b/test/pull-request-target-has-tweet-issue-comment/test.js index 00ee9d46..6678b992 100644 --- a/test/pull-request-target-has-tweet-issue-comment/test.js +++ b/test/pull-request-target-has-tweet-issue-comment/test.js @@ -77,11 +77,7 @@ nock("https://api.github.com") --- - - -Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action) - -` +*Preview using 0000000000000000000000000000000000000002 generated by [Twitter, together!](https://github.com/twitter-together/action)*` ); return true; }) From 80d559dbfdff18a1ca07cfb0a37e9e8a99233b5a Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Sat, 15 Oct 2022 04:20:45 +0000 Subject: [PATCH 10/13] Update docs for PR comments --- README.md | 96 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index e41ff7eb..4ebddfeb 100644 --- a/README.md +++ b/README.md @@ -49,39 +49,69 @@ Instead, you can make use of this GitHub Action from the comfort of your own rep 1. [Create a Twitter app](docs/01-create-twitter-app.md) with your shared Twitter account and store the credentials as `TWITTER_API_KEY`, `TWITTER_API_SECRET_KEY`, `TWITTER_ACCESS_TOKEN` and `TWITTER_ACCESS_TOKEN_SECRET` in your repository’s secrets settings. 2. [Create a `.github/workflows/twitter-together.yml` file](docs/02-create-twitter-together-workflow.md) with the content below. Make sure to replace `'main'` if you changed your repository's default branch. - ```yml - on: [push, pull_request] - name: Twitter, together! - jobs: - preview: - name: Preview - runs-on: ubuntu-latest - if: github.event_name == 'pull_request' - steps: - - name: checkout pull request - uses: actions/checkout@v3 - with: - ref: ${{ github.event.pull_request.head.sha }} - - name: Validate Tweets - uses: twitter-together/action@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - tweet: - name: Tweet - runs-on: ubuntu-latest - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - steps: - - name: checkout main - uses: actions/checkout@v3 - - name: Tweet - uses: twitter-together/action@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }} - TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} - TWITTER_API_KEY: ${{ secrets.TWITTER_API_KEY }} - TWITTER_API_SECRET_KEY: ${{ secrets.TWITTER_API_SECRET_KEY }} - ``` +```yml +on: [push, pull_request] +name: Twitter, together! +jobs: + preview: + name: Preview + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + steps: + - name: checkout pull request + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Validate Tweets + uses: twitter-together/action@v3 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + tweet: + name: Tweet + runs-on: ubuntu-latest + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + steps: + - name: checkout main + uses: actions/checkout@v3 + - name: Tweet + uses: twitter-together/action@v3 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }} + TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} + TWITTER_API_KEY: ${{ secrets.TWITTER_API_KEY }} + TWITTER_API_SECRET_KEY: ${{ secrets.TWITTER_API_SECRET_KEY }} +``` + +TODO: CONFIRM + +If you wish to have this action create preview comments in the PR thread, you can use the following config. + +Note that `pull_request_target` action have elevated permissions, so you should configure your repository to only trigger actions that are trusted. You can do this in [various](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) ways, including preventing outside contributors from triggering actions automatically, and requiring only allowing actions from Verified Creators in your repository Settings -> Actions -> General. + +You can also securely enable PR comments only for local branch commits, using the `pull_request` events with an `ENABLE_COMMENTS: 1` env variable, but comments will not be created for PRs from forks. + +```yml +# enable comments, but beware of security implications +on: [push, pull_request_target] +name: Twitter, together! +jobs: + preview: + name: Preview + runs-on: ubuntu-latest + if: github.event_name == 'pull_request_target' + permissions: + pull-requests: write + steps: + - name: checkout pull request + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Validate Tweets + uses: twitter-together/action@v3 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +``` 3. After creating or updating `.github/workflows/twitter-together.yml` in your repository’s default branch, a pull request will be created with further instructions. From 76d3af7f90147261f685c27eb32e3ce919d5ecc5 Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Sat, 15 Oct 2022 04:42:08 +0000 Subject: [PATCH 11/13] Typo fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ebddfeb..ee3dfcf6 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ TODO: CONFIRM If you wish to have this action create preview comments in the PR thread, you can use the following config. -Note that `pull_request_target` action have elevated permissions, so you should configure your repository to only trigger actions that are trusted. You can do this in [various](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) ways, including preventing outside contributors from triggering actions automatically, and requiring only allowing actions from Verified Creators in your repository Settings -> Actions -> General. +Note that `pull_request_target` events have elevated permissions, so if you are using this config, you should configure your repository to only trigger actions that are trusted. You can do this in [various](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) ways, including preventing outside contributors from triggering actions automatically, and requiring only allowing actions from Verified Creators in your repository Settings -> Actions -> General. You can also securely enable PR comments only for local branch commits, using the `pull_request` events with an `ENABLE_COMMENTS: 1` env variable, but comments will not be created for PRs from forks. From ac649427bb8baefb7472cff3b6e48a7c5e8ada9b Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Fri, 4 Nov 2022 11:11:04 +0000 Subject: [PATCH 12/13] Do not report "null" for media without alt text --- lib/pull-request/generate-summary.js | 4 ++-- test/pull-request-has-tweet-with-front-matter-media/test.js | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/pull-request/generate-summary.js b/lib/pull-request/generate-summary.js index a7cfccab..efcedb5f 100644 --- a/lib/pull-request/generate-summary.js +++ b/lib/pull-request/generate-summary.js @@ -57,10 +57,10 @@ function summarizeTweet(state, threading = false) { .map(({ file, alt }) => { const fileName = file.replace(dir, ""); if (plainText) { - return `- ${fileName} [${alt}]`; + return `- ${fileName}${alt && ` [${alt}]`}`; } else { const { repo, sha } = payload.pull_request.head; - return `${alt}\n`; + return `${alt || ""}\n`; } }) .join(plainText ? "\n" : "\n\n"); diff --git a/test/pull-request-has-tweet-with-front-matter-media/test.js b/test/pull-request-has-tweet-with-front-matter-media/test.js index b2d78054..d77cbffb 100644 --- a/test/pull-request-has-tweet-with-front-matter-media/test.js +++ b/test/pull-request-has-tweet-with-front-matter-media/test.js @@ -62,7 +62,6 @@ index 0000000..1715c04 +--- +media: + - file: cat.jpg -+ alt: A cat + - file: nested/media/pets/dog.jpg + alt: A dog +--- @@ -82,7 +81,6 @@ nock("https://api.github.com") title: "1 tweet(s)", summary: `### βœ… Valid Tweet -A cat A dog From 8ba8ea1877b2874875a665fafa9938629d6f30a1 Mon Sep 17 00:00:00 2001 From: IstoraMandiri Date: Fri, 4 Nov 2022 11:16:19 +0000 Subject: [PATCH 13/13] Prettier formatting --- lib/pull-request/generate-summary.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pull-request/generate-summary.js b/lib/pull-request/generate-summary.js index efcedb5f..f50bcc8e 100644 --- a/lib/pull-request/generate-summary.js +++ b/lib/pull-request/generate-summary.js @@ -60,7 +60,9 @@ function summarizeTweet(state, threading = false) { return `- ${fileName}${alt && ` [${alt}]`}`; } else { const { repo, sha } = payload.pull_request.head; - return `${alt || ""}\n`; + return `${alt || ""}\n`; } }) .join(plainText ? "\n" : "\n\n");