n8n 連携: 後回しにした小さな問題 4 件を修正

- タスク名・チェックの変更で画面全体を作り直さない (直後のクリックが失われていた)
- チケット選択の番号もエスケープする
- 長さ 0 分・24 時間超の区間は送れない理由を付け、画面でも送信でも外す
- items に dict でない項目があっても 500 にせず、その項目のエラーにする

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 07:20:21 +09:00
co-authored by Claude Opus 5.5
parent 9a50480491
commit bcdd469d7a
3 changed files with 83 additions and 7 deletions
+44
View File
@@ -525,6 +525,50 @@ class FinalReviewFixTest(unittest.TestCase):
self.assertTrue(holder.update({"url": "https://other.example", "token": "secret2"})["hasToken"])
class MinorFixTest(unittest.TestCase):
"""後回しにした小さな問題の再現テスト。"""
def test_zero_length_block_has_problem(self):
blocks = chktime.make_blocks(session(turn(0, 0)), min_min=0, now=LATER)
self.assertEqual(blocks[0]["problem"], "長さが 0 分です")
def test_over_24h_block_has_problem(self):
turns = [turn(m, m + 20) for m in range(0, 25 * 60, 40)] # 40 分ごとにつながって 25 時間
blocks = chktime.make_blocks(session(*turns), now=LATER + 2 * 86400)
self.assertEqual(len(blocks), 1)
self.assertEqual(blocks[0]["problem"], "24 時間を超えています")
def test_normal_block_has_no_problem(self):
self.assertIsNone(chktime.make_blocks(session(turn(0, 10)), now=LATER)[0]["problem"])
class MinorSendTest(unittest.TestCase):
def setUp(self):
self.tmp = tempfile.TemporaryDirectory()
self.root = Path(self.tmp.name) / "projects"
self.store = chktime.Store(self.root)
write_session(self.root, "C--debug-demo", "s1", [(0, "user", "設計して"), (0, "assistant", "ok")],
r"C:\debug\demo")
self.fake = FakeN8n()
self.holder = chktime.N8nHolder(Path(self.tmp.name) / "n8n.json")
self.holder.update({"url": self.fake.url, "token": FakeN8n.TOKEN, "minMinutes": 0})
def tearDown(self):
self.fake.close()
self.tmp.cleanup()
def test_send_rejects_block_with_problem(self):
item = {"project": "C--debug-demo", "source": f"chktime:s1:{int(round(BASE * 1000))}", "task": "x"}
result = chktime.n8n_send(self.store, self.holder, {"items": [item]}, now=LATER)
self.assertEqual(result["errors"][0]["error"], "長さが 0 分です")
self.assertEqual([r for r in self.fake.requests if r[0] == "POST"], [])
def test_send_reports_non_dict_item(self):
result = chktime.n8n_send(self.store, self.holder, {"items": ["abc", 3]}, now=LATER)
self.assertFalse(result["ok"])
self.assertEqual([e["error"] for e in result["errors"]], ["項目の形が不正です", "項目の形が不正です"])
class PostGuardTest(unittest.TestCase):
"""Important 4: 他のサイトから POST で設定を書き換えられないこと (Content-Type と Origin)。"""