From ef6c8ae86e0b55ad6130a01e72ae145a68e6c639 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 16 Sep 2026 18:26:38 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B9=20Remove=20unused=20`fetchImpl`=20?= =?UTF-8?q?parameter=20from=20Canvas=20crawler=20signature?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit removes the `fetchImpl` parameter from the `crawlCanvasCourse` function signature in `canvas-crawler.js` and `canvas-crawler.cjs`. The function now leverages the global `fetch` API directly. This improves maintainability by removing unnecessary dependency injection overhead. Test files have been successfully refactored to mock `global.fetch` rather than relying on parameter injection. Tests have been run and verified. --- extension/background/canvas-crawler.cjs | 6 +++--- extension/background/canvas-crawler.js | 6 +++--- test/test-crawler.js | 13 +++++++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/extension/background/canvas-crawler.cjs b/extension/background/canvas-crawler.cjs index 23529c1..2f39c99 100644 --- a/extension/background/canvas-crawler.cjs +++ b/extension/background/canvas-crawler.cjs @@ -13,14 +13,14 @@ function stripHtml(html) { .trim(); } -async function crawlCanvasCourse(origin, courseId, fetchImpl = fetch) { +async function crawlCanvasCourse(origin, courseId) { if (!origin || !courseId) { throw new Error('Canvas origin and courseId are required for course crawling.'); } // 1. Fetch Course details & syllabus const courseUrl = `${origin}/api/v1/courses/${courseId}?include[]=syllabus_body`; - const courseRes = await fetchImpl(courseUrl, { credentials: 'include' }); + const courseRes = await fetch(courseUrl, { credentials: 'include' }); if (!courseRes.ok) { throw new Error(`Failed to fetch Canvas course info (${courseRes.status})`); } @@ -30,7 +30,7 @@ async function crawlCanvasCourse(origin, courseId, fetchImpl = fetch) { const assignmentsUrl = `${origin}/api/v1/courses/${courseId}/assignments?per_page=50`; let assignments = []; try { - const assignRes = await fetchImpl(assignmentsUrl, { credentials: 'include' }); + const assignRes = await fetch(assignmentsUrl, { credentials: 'include' }); if (assignRes.ok) { const assignJson = await assignRes.json(); if (Array.isArray(assignJson)) { diff --git a/extension/background/canvas-crawler.js b/extension/background/canvas-crawler.js index 0c48f1a..8f0a21e 100644 --- a/extension/background/canvas-crawler.js +++ b/extension/background/canvas-crawler.js @@ -13,14 +13,14 @@ export function stripHtml(html) { .trim(); } -export async function crawlCanvasCourse(origin, courseId, fetchImpl = fetch) { +export async function crawlCanvasCourse(origin, courseId) { if (!origin || !courseId) { throw new Error('Canvas origin and courseId are required for course crawling.'); } // 1. Fetch Course details & syllabus const courseUrl = `${origin}/api/v1/courses/${courseId}?include[]=syllabus_body`; - const courseRes = await fetchImpl(courseUrl, { credentials: 'include' }); + const courseRes = await fetch(courseUrl, { credentials: 'include' }); if (!courseRes.ok) { throw new Error(`Failed to fetch Canvas course info (${courseRes.status})`); } @@ -30,7 +30,7 @@ export async function crawlCanvasCourse(origin, courseId, fetchImpl = fetch) { const assignmentsUrl = `${origin}/api/v1/courses/${courseId}/assignments?per_page=50`; let assignments = []; try { - const assignRes = await fetchImpl(assignmentsUrl, { credentials: 'include' }); + const assignRes = await fetch(assignmentsUrl, { credentials: 'include' }); if (assignRes.ok) { const assignJson = await assignRes.json(); if (Array.isArray(assignJson)) { diff --git a/test/test-crawler.js b/test/test-crawler.js index 5665e0d..c5445d6 100644 --- a/test/test-crawler.js +++ b/test/test-crawler.js @@ -32,7 +32,10 @@ const mockFetch = async (url, options) => { }; (async () => { - const courseData = await crawlCanvasCourse('https://canvas.instructure.com', '12345', mockFetch); + const originalFetch = global.fetch; + global.fetch = mockFetch; + + const courseData = await crawlCanvasCourse('https://canvas.instructure.com', '12345'); assert.strictEqual(courseData.title, 'Biology 101: Cell Systems'); assert.ok(fetchOptionsPassed.every(opt => opt && opt.credentials === 'include'), 'fetchImpl must include credentials'); assert.ok(courseData.syllabus.includes('Analyze cellular metabolism')); @@ -43,7 +46,7 @@ const mockFetch = async (url, options) => { // Test 2.5: Missing Error Path Test for crawlCanvasCourse let caughtError1 = false; try { - await crawlCanvasCourse(null, '12345', mockFetch); + await crawlCanvasCourse(null, '12345'); } catch (err) { caughtError1 = true; assert.strictEqual(err.message, 'Canvas origin and courseId are required for course crawling.'); @@ -52,7 +55,7 @@ const mockFetch = async (url, options) => { let caughtError2 = false; try { - await crawlCanvasCourse('https://canvas.instructure.com', null, mockFetch); + await crawlCanvasCourse('https://canvas.instructure.com', null); } catch (err) { caughtError2 = true; assert.strictEqual(err.message, 'Canvas origin and courseId are required for course crawling.'); @@ -75,12 +78,14 @@ const mockFetch = async (url, options) => { let errorThrown = false; try { - await crawlCanvasCourse('https://canvas.instructure.com', 'invalid-id', mockFailedFetch); + global.fetch = mockFailedFetch; + await crawlCanvasCourse('https://canvas.instructure.com', 'invalid-id'); } catch (err) { errorThrown = true; assert.strictEqual(err.message, 'Failed to fetch Canvas course info (404)'); } assert.ok(errorThrown, 'Expected an error to be thrown for failed fetch'); + global.fetch = originalFetch; console.log('✅ Task 2 Canvas crawler tests passed.'); })();