From 39f1a598a1c293c68274197b81639e3cb5662fcc Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 07:59:06 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=A7=AA=20fetchActivity=E3=81=AE?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=91=E3=82=B9=E3=81=A8=E6=97=A9?= =?UTF-8?q?=E6=9C=9F=E7=B5=82=E4=BA=86=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: is0692vs <135803462+is0692vs@users.noreply.github.com> --- append.js | 18 ++++++ append_events.js | 18 ++++++ append_more.js | 18 ++++++ fix_file.js | 17 +++++ fix_test.js | 6 ++ get_coverage.js | 6 ++ req.js | 6 ++ .../__tests__/github/fetchActivity.test.ts | 64 +++++++++++++++++++ 8 files changed, 153 insertions(+) create mode 100644 append.js create mode 100644 append_events.js create mode 100644 append_more.js create mode 100644 fix_file.js create mode 100644 fix_test.js create mode 100644 get_coverage.js create mode 100644 req.js diff --git a/append.js b/append.js new file mode 100644 index 0000000..9cb1a70 --- /dev/null +++ b/append.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); +const toAppend = ` + it("1ページ目で500エラーの場合、空の結果を返す(早期終了)", async () => { + mockFetch + .mockResolvedValueOnce(jsonResponse(null, 500)) + .mockResolvedValueOnce(jsonResponse([])) + .mockResolvedValueOnce(jsonResponse([])); + + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + + expect(result.totalEvents).toBe(0); + expect(result.eventBreakdown.length).toBe(0); + }); +`; +const newContent = content.replace(/ \}\);\n \}\);\n\}\);/, ' });\n' + toAppend + ' });\n});'); +fs.writeFileSync('src/lib/__tests__/github/fetchActivity.test.ts', newContent); diff --git a/append_events.js b/append_events.js new file mode 100644 index 0000000..1dff441 --- /dev/null +++ b/append_events.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); +const toAppend = ` + it("100件以上のイベントがある場合、次のページも取得する", async () => { + const hundredEvents = Array.from({ length: 100 }, (_, i) => ({ type: "PushEvent", created_at: "2024-01-15T10:30:00Z" })); + mockFetch + .mockResolvedValueOnce(jsonResponse(hundredEvents)) + .mockResolvedValueOnce(jsonResponse(MOCK_EVENTS)) + .mockResolvedValueOnce(jsonResponse([])); + + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + + expect(result.totalEvents).toBe(100 + MOCK_EVENTS.length); + }); +`; +const newContent = content.replace(/ \}\);\n \}\);\n\}\);/, ' });\n });\n' + toAppend + '});'); +fs.writeFileSync('src/lib/__tests__/github/fetchActivity.test.ts', newContent); diff --git a/append_more.js b/append_more.js new file mode 100644 index 0000000..28c8ae0 --- /dev/null +++ b/append_more.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); +const toAppend = ` + it("1ページ目で例外がスローされた場合(エラーインスタンス以外)、breakして処理を継続する", async () => { + mockFetch + .mockRejectedValueOnce(new Error("Unexpected error")) + .mockResolvedValueOnce(jsonResponse([])) + .mockResolvedValueOnce(jsonResponse([])); + + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + + expect(result.totalEvents).toBe(0); + expect(result.eventBreakdown.length).toBe(0); + }); +`; +const newContent = content.replace(/ \}\);\n \}\);\n\}\);/, ' });\n' + toAppend + ' });\n});'); +fs.writeFileSync('src/lib/__tests__/github/fetchActivity.test.ts', newContent); diff --git a/fix_file.js b/fix_file.js new file mode 100644 index 0000000..62d445d --- /dev/null +++ b/fix_file.js @@ -0,0 +1,17 @@ +const fs = require('fs'); +let content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); + +const additionalTest = ` + it("エラーが UserNotFoundError や RateLimitError 以外の場合、ループを抜ける", async () => { + mockFetch + .mockRejectedValueOnce(new Error("Generic error")) + .mockResolvedValueOnce(jsonResponse([])) + .mockResolvedValueOnce(jsonResponse([])); + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + expect(result.totalEvents).toBe(0); + }); +`; + +content = content.replace(/}\);\n$/, additionalTest + '});\n'); +fs.writeFileSync('src/lib/__tests__/github/fetchActivity.test.ts', content); diff --git a/fix_test.js b/fix_test.js new file mode 100644 index 0000000..3f19810 --- /dev/null +++ b/fix_test.js @@ -0,0 +1,6 @@ +const fs = require('fs'); +let content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); + +// The last test got added outside the describe("Error handling") but inside describe("fetchActivity"). This is fine. But I want to remove it and add it properly inside Error handling or next to it. Wait, the coverage issue is that the loop breaks when there's an error. The test "1ページ目で500エラーの場合..." tests this already. The problem might be about 100 limit. + +// I will make sure the branch if (events.length < 100) break; gets evaluated to true and false. diff --git a/get_coverage.js b/get_coverage.js new file mode 100644 index 0000000..0c1115e --- /dev/null +++ b/get_coverage.js @@ -0,0 +1,6 @@ +const fs = require('fs'); + +async function test() { + const { fetchActivity } = await import('./src/lib/github.ts'); + console.log(fetchActivity); +} diff --git a/req.js b/req.js new file mode 100644 index 0000000..066bbda --- /dev/null +++ b/req.js @@ -0,0 +1,6 @@ +const fs = require('fs'); + +async function test() { + console.log("Ready for plan review."); +} +test(); diff --git a/src/lib/__tests__/github/fetchActivity.test.ts b/src/lib/__tests__/github/fetchActivity.test.ts index 956aee4..53fc812 100644 --- a/src/lib/__tests__/github/fetchActivity.test.ts +++ b/src/lib/__tests__/github/fetchActivity.test.ts @@ -118,5 +118,69 @@ describe("fetchActivity", () => { expect(result.totalEvents).toBe(MOCK_EVENTS.length); expect(result.eventBreakdown[0].type).toBe("PushEvent"); }); + + it("1ページ目で500エラーの場合、空の結果を返す(早期終了)", async () => { + mockFetch + .mockResolvedValueOnce(jsonResponse(null, 500)) + .mockResolvedValueOnce(jsonResponse([])) + .mockResolvedValueOnce(jsonResponse([])); + + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + + expect(result.totalEvents).toBe(0); + expect(result.eventBreakdown.length).toBe(0); + }); + + it("1ページ目で例外がスローされた場合(エラーインスタンス以外)、breakして処理を継続する", async () => { + mockFetch + .mockRejectedValueOnce(new Error("Unexpected error")) + .mockResolvedValueOnce(jsonResponse([])) + .mockResolvedValueOnce(jsonResponse([])); + + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + + expect(result.totalEvents).toBe(0); + expect(result.eventBreakdown.length).toBe(0); + }); + + it("100件未満のイベントがある場合、breakする", async () => { + // Provide 99 events. So the mock fetch won't be called the second time. + const events = Array.from({ length: 99 }, (_, i) => ({ type: "PushEvent", created_at: "2024-01-15T10:30:00Z" })); + mockFetch + .mockResolvedValueOnce(jsonResponse(events)) + .mockResolvedValueOnce(jsonResponse([])) + .mockResolvedValueOnce(jsonResponse([])); + + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + + expect(result.totalEvents).toBe(99); + // Since events.length < 100, we break. Next promises aren't awaited. + }); }); + + it("100件以上のイベントがある場合、次のページも取得する", async () => { + const hundredEvents = Array.from({ length: 100 }, (_, i) => ({ type: "PushEvent", created_at: "2024-01-15T10:30:00Z" })); + mockFetch + .mockResolvedValueOnce(jsonResponse(hundredEvents)) + .mockResolvedValueOnce(jsonResponse(MOCK_EVENTS)) + .mockResolvedValueOnce(jsonResponse([])); + + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + + expect(result.totalEvents).toBe(100 + MOCK_EVENTS.length); + }); + + it("エラーが UserNotFoundError や RateLimitError 以外の場合、ループを抜ける", async () => { + mockFetch + .mockRejectedValueOnce(new Error("Generic error")) + .mockResolvedValueOnce(jsonResponse([])) + .mockResolvedValueOnce(jsonResponse([])); + const { fetchActivity } = await import("../../github"); + const result = await fetchActivity("testuser", "fake-token"); + expect(result.totalEvents).toBe(0); + }); }); From 2d86f4db145ecd8700ac138fcb7b7f591e98e380 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 08:09:27 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=A7=AA=20fetchActivity=E3=81=AE?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=91=E3=82=B9=E3=81=A8=E6=97=A9?= =?UTF-8?q?=E6=9C=9F=E7=B5=82=E4=BA=86=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: is0692vs <135803462+is0692vs@users.noreply.github.com> --- append.js | 18 ------------------ append_events.js | 18 ------------------ append_more.js | 18 ------------------ fix_file.js | 17 ----------------- fix_test.js | 6 ------ get_coverage.js | 6 ------ req.js | 6 ------ src/lib/__tests__/github/fetchActivity.test.ts | 4 ++-- 8 files changed, 2 insertions(+), 91 deletions(-) delete mode 100644 append.js delete mode 100644 append_events.js delete mode 100644 append_more.js delete mode 100644 fix_file.js delete mode 100644 fix_test.js delete mode 100644 get_coverage.js delete mode 100644 req.js diff --git a/append.js b/append.js deleted file mode 100644 index 9cb1a70..0000000 --- a/append.js +++ /dev/null @@ -1,18 +0,0 @@ -const fs = require('fs'); -const content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); -const toAppend = ` - it("1ページ目で500エラーの場合、空の結果を返す(早期終了)", async () => { - mockFetch - .mockResolvedValueOnce(jsonResponse(null, 500)) - .mockResolvedValueOnce(jsonResponse([])) - .mockResolvedValueOnce(jsonResponse([])); - - const { fetchActivity } = await import("../../github"); - const result = await fetchActivity("testuser", "fake-token"); - - expect(result.totalEvents).toBe(0); - expect(result.eventBreakdown.length).toBe(0); - }); -`; -const newContent = content.replace(/ \}\);\n \}\);\n\}\);/, ' });\n' + toAppend + ' });\n});'); -fs.writeFileSync('src/lib/__tests__/github/fetchActivity.test.ts', newContent); diff --git a/append_events.js b/append_events.js deleted file mode 100644 index 1dff441..0000000 --- a/append_events.js +++ /dev/null @@ -1,18 +0,0 @@ -const fs = require('fs'); -const content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); -const toAppend = ` - it("100件以上のイベントがある場合、次のページも取得する", async () => { - const hundredEvents = Array.from({ length: 100 }, (_, i) => ({ type: "PushEvent", created_at: "2024-01-15T10:30:00Z" })); - mockFetch - .mockResolvedValueOnce(jsonResponse(hundredEvents)) - .mockResolvedValueOnce(jsonResponse(MOCK_EVENTS)) - .mockResolvedValueOnce(jsonResponse([])); - - const { fetchActivity } = await import("../../github"); - const result = await fetchActivity("testuser", "fake-token"); - - expect(result.totalEvents).toBe(100 + MOCK_EVENTS.length); - }); -`; -const newContent = content.replace(/ \}\);\n \}\);\n\}\);/, ' });\n });\n' + toAppend + '});'); -fs.writeFileSync('src/lib/__tests__/github/fetchActivity.test.ts', newContent); diff --git a/append_more.js b/append_more.js deleted file mode 100644 index 28c8ae0..0000000 --- a/append_more.js +++ /dev/null @@ -1,18 +0,0 @@ -const fs = require('fs'); -const content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); -const toAppend = ` - it("1ページ目で例外がスローされた場合(エラーインスタンス以外)、breakして処理を継続する", async () => { - mockFetch - .mockRejectedValueOnce(new Error("Unexpected error")) - .mockResolvedValueOnce(jsonResponse([])) - .mockResolvedValueOnce(jsonResponse([])); - - const { fetchActivity } = await import("../../github"); - const result = await fetchActivity("testuser", "fake-token"); - - expect(result.totalEvents).toBe(0); - expect(result.eventBreakdown.length).toBe(0); - }); -`; -const newContent = content.replace(/ \}\);\n \}\);\n\}\);/, ' });\n' + toAppend + ' });\n});'); -fs.writeFileSync('src/lib/__tests__/github/fetchActivity.test.ts', newContent); diff --git a/fix_file.js b/fix_file.js deleted file mode 100644 index 62d445d..0000000 --- a/fix_file.js +++ /dev/null @@ -1,17 +0,0 @@ -const fs = require('fs'); -let content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); - -const additionalTest = ` - it("エラーが UserNotFoundError や RateLimitError 以外の場合、ループを抜ける", async () => { - mockFetch - .mockRejectedValueOnce(new Error("Generic error")) - .mockResolvedValueOnce(jsonResponse([])) - .mockResolvedValueOnce(jsonResponse([])); - const { fetchActivity } = await import("../../github"); - const result = await fetchActivity("testuser", "fake-token"); - expect(result.totalEvents).toBe(0); - }); -`; - -content = content.replace(/}\);\n$/, additionalTest + '});\n'); -fs.writeFileSync('src/lib/__tests__/github/fetchActivity.test.ts', content); diff --git a/fix_test.js b/fix_test.js deleted file mode 100644 index 3f19810..0000000 --- a/fix_test.js +++ /dev/null @@ -1,6 +0,0 @@ -const fs = require('fs'); -let content = fs.readFileSync('src/lib/__tests__/github/fetchActivity.test.ts', 'utf-8'); - -// The last test got added outside the describe("Error handling") but inside describe("fetchActivity"). This is fine. But I want to remove it and add it properly inside Error handling or next to it. Wait, the coverage issue is that the loop breaks when there's an error. The test "1ページ目で500エラーの場合..." tests this already. The problem might be about 100 limit. - -// I will make sure the branch if (events.length < 100) break; gets evaluated to true and false. diff --git a/get_coverage.js b/get_coverage.js deleted file mode 100644 index 0c1115e..0000000 --- a/get_coverage.js +++ /dev/null @@ -1,6 +0,0 @@ -const fs = require('fs'); - -async function test() { - const { fetchActivity } = await import('./src/lib/github.ts'); - console.log(fetchActivity); -} diff --git a/req.js b/req.js deleted file mode 100644 index 066bbda..0000000 --- a/req.js +++ /dev/null @@ -1,6 +0,0 @@ -const fs = require('fs'); - -async function test() { - console.log("Ready for plan review."); -} -test(); diff --git a/src/lib/__tests__/github/fetchActivity.test.ts b/src/lib/__tests__/github/fetchActivity.test.ts index 53fc812..5633d29 100644 --- a/src/lib/__tests__/github/fetchActivity.test.ts +++ b/src/lib/__tests__/github/fetchActivity.test.ts @@ -147,7 +147,7 @@ describe("fetchActivity", () => { it("100件未満のイベントがある場合、breakする", async () => { // Provide 99 events. So the mock fetch won't be called the second time. - const events = Array.from({ length: 99 }, (_, i) => ({ type: "PushEvent", created_at: "2024-01-15T10:30:00Z" })); + const events = Array.from({ length: 99 }, () => ({ type: "PushEvent", created_at: "2024-01-15T10:30:00Z" })); mockFetch .mockResolvedValueOnce(jsonResponse(events)) .mockResolvedValueOnce(jsonResponse([])) @@ -162,7 +162,7 @@ describe("fetchActivity", () => { }); it("100件以上のイベントがある場合、次のページも取得する", async () => { - const hundredEvents = Array.from({ length: 100 }, (_, i) => ({ type: "PushEvent", created_at: "2024-01-15T10:30:00Z" })); + const hundredEvents = Array.from({ length: 100 }, () => ({ type: "PushEvent", created_at: "2024-01-15T10:30:00Z" })); mockFetch .mockResolvedValueOnce(jsonResponse(hundredEvents)) .mockResolvedValueOnce(jsonResponse(MOCK_EVENTS)) From 9627fcde9ffa7b54407fa0dd6ced361405d6eb11 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 08:40:51 +0000 Subject: [PATCH 3/3] Fix lint errors that caused CI failure Co-authored-by: is0692vs <135803462+is0692vs@users.noreply.github.com>