test(issue-extract): 封住圍欄、表格與分頁的回頭路
八條新案例,每一條都對應一個實際重現過的缺陷:~~~ 圍欄、圍欄內的假清單項、 混用圍欄標記、未閉合圍欄的歸屬、逸脫的直線、第二條分隔列、巢狀攤平,以及 留言分頁。 把修正還原成舊版解析器後,這批測試有五條會失敗;修正回來則全綠——確認測試 真的抓得到,不是陪跑。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -350,3 +350,98 @@ test('--dry-run 印出將發出的請求,且不碰 Gitea', async (t) => {
|
|||||||
);
|
);
|
||||||
assert.equal(stub.requests.length, 0);
|
assert.equal(stub.requests.length, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ── 圍欄與表格的邊界(皆為 code review 抓出的實際缺陷,這裡封住回頭路)────
|
||||||
|
|
||||||
|
test('~~~ 圍欄裡的井字號不是標題', async (t) => {
|
||||||
|
const body = '## 流程圖\n\n~~~\n## 這不是標題\n~~~\n\n## 目標\n\n- 真的目標\n';
|
||||||
|
const stub = await withStub(t, {}, { body });
|
||||||
|
|
||||||
|
const { json } = await run([], stub);
|
||||||
|
|
||||||
|
assert.deepEqual(json.data.目標, ['真的目標']);
|
||||||
|
assert.match(json.data.流程圖, /這不是標題/, '圍欄內容原樣留在流程圖段落裡');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('圍欄裡的減號不是清單項', async (t) => {
|
||||||
|
const body = '## 驗收標準\n\n```\n- 程式碼範例裡的假項目\n```\n\n- 真正的驗收標準\n';
|
||||||
|
const stub = await withStub(t, {}, { body });
|
||||||
|
|
||||||
|
const { json } = await run([], stub);
|
||||||
|
|
||||||
|
assert.deepEqual(json.data.驗收標準, ['真正的驗收標準']);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('圍欄要同種標記才算關閉,混用時不會提早收尾', async (t) => {
|
||||||
|
const body = '## 驗收標準\n\n```\n~~~\n- 仍在圍欄內\n```\n\n- 圍欄外的項目\n';
|
||||||
|
const stub = await withStub(t, {}, { body });
|
||||||
|
|
||||||
|
const { json } = await run([], stub);
|
||||||
|
|
||||||
|
assert.deepEqual(json.data.驗收標準, ['圍欄外的項目']);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('圍欄沒關就到結尾時,其後內容算在圍欄內(與 markdown 渲染一致)', async (t) => {
|
||||||
|
const body = '## 流程圖\n\n```mermaid\nflowchart TD\n\n## 驗收標準\n\n- 被圍欄吃掉\n';
|
||||||
|
const stub = await withStub(t, {}, { body });
|
||||||
|
|
||||||
|
const { code, json } = await run([], stub);
|
||||||
|
|
||||||
|
assert.equal(code, 0, '不該炸掉,只是內容歸屬不同');
|
||||||
|
assert.deepEqual(json.data.驗收標準, []);
|
||||||
|
assert.match(json.data.流程圖, /驗收標準/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('名詞表的欄位內容可以有逸脫的直線', async (t) => {
|
||||||
|
const body = '## 領域名詞表\n\n| 名詞 | 定義 |\n| --- | --- |\n| a\\|b | 帶直線的名詞 |\n';
|
||||||
|
const stub = await withStub(t, {}, { body });
|
||||||
|
|
||||||
|
const { json } = await run([], stub);
|
||||||
|
|
||||||
|
assert.deepEqual(json.data.名詞表, [{ term: 'a|b', def: '帶直線的名詞' }]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('同一段落裡出現第二條分隔列時,不會變成一筆假名詞', async (t) => {
|
||||||
|
const body = '## 領域名詞表\n\n| 名詞 | 定義 |\n| --- | --- |\n| 甲 | 一 |\n| --- | --- |\n| 乙 | 二 |\n';
|
||||||
|
const stub = await withStub(t, {}, { body });
|
||||||
|
|
||||||
|
const { json } = await run([], stub);
|
||||||
|
|
||||||
|
assert.deepEqual(json.data.名詞表, [
|
||||||
|
{ term: '甲', def: '一' },
|
||||||
|
{ term: '乙', def: '二' },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('巢狀清單一律攤平,不無聲吃掉內容', async (t) => {
|
||||||
|
const body = '## 驗收標準\n\n- 上層項目\n - 巢狀項目\n';
|
||||||
|
const stub = await withStub(t, {}, { body });
|
||||||
|
|
||||||
|
const { json } = await run([], stub);
|
||||||
|
|
||||||
|
assert.deepEqual(json.data.驗收標準, ['上層項目', '巢狀項目']);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('留言逐頁讀完,不是只讀第一頁', async (t) => {
|
||||||
|
// 第一頁滿 50 筆就得再翻一頁;第二頁不滿才收手
|
||||||
|
const page1 = Array.from({ length: 50 }, (_, i) => ({ id: 200 + i }));
|
||||||
|
const page2 = Array.from({ length: 20 }, (_, i) => ({ id: 300 + i }));
|
||||||
|
const reactions = {};
|
||||||
|
for (const { id } of [...page1, ...page2]) {
|
||||||
|
reactions[`GET /api/v1/repos/${REPO}/issues/comments/${id}/reactions`] = { status: 200, body: [] };
|
||||||
|
}
|
||||||
|
|
||||||
|
const stub = await withStub(t, {
|
||||||
|
[`GET /api/v1/repos/${REPO}/issues/${INDEX}/comments`]: (req) => ({
|
||||||
|
status: 200,
|
||||||
|
body: req.query.page === '1' ? page1 : page2,
|
||||||
|
}),
|
||||||
|
...reactions,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { json } = await run([], stub);
|
||||||
|
|
||||||
|
const commentPages = stub.requests.filter((r) => r.path.endsWith(`/issues/${INDEX}/comments`));
|
||||||
|
assert.deepEqual(commentPages.map((r) => r.query.page), ['1', '2']);
|
||||||
|
assert.equal(json.data.未處理留言數, 70, '第二頁的留言也要算進來');
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user