n8n 連携: 後回しにした小さな問題 4 件を修正
- タスク名・チェックの変更で画面全体を作り直さない (直後のクリックが失われていた) - チケット選択の番号もエスケープする - 長さ 0 分・24 時間超の区間は送れない理由を付け、画面でも送信でも外す - items に dict でない項目があっても 500 にせず、その項目のエラーにする Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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)。"""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user