diff --git a/operator-gate/adapters/nostur_adapter.py b/operator-gate/adapters/nostur_adapter.py index 92d79b49..19e592a8 100644 --- a/operator-gate/adapters/nostur_adapter.py +++ b/operator-gate/adapters/nostur_adapter.py @@ -71,7 +71,7 @@ def _normalize_dm(content: str) -> dict: parts = rest.split(" ", 1) if len(parts) >= 2: repo = parts[0] if "/" in parts[0] else f"Timmy_Foundation/{parts[0]}" - title = parts[1] + title = parts[1].split("\n", 1)[0] body = "\n".join(lines[1:]) if len(lines) > 1 else "" return {"action": "create_issue", "repo": repo, "title": title, "body": body} diff --git a/operator-gate/tests/test_gate_idempotency.py b/operator-gate/tests/test_gate_idempotency.py index 21a156e7..501b64f9 100644 --- a/operator-gate/tests/test_gate_idempotency.py +++ b/operator-gate/tests/test_gate_idempotency.py @@ -30,30 +30,39 @@ class TestIdempotency(unittest.TestCase): def tearDown(self): self.tmpdir.cleanup() - @patch("gitea_gate._LEDGER_PATH") - def test_replay_returns_prior_ack(self, mock_path): + @patch("gitea_gate._ledger_load") + @patch("gitea_gate._ledger_append") + @patch("gitea_gate._api_request") + def test_replay_returns_prior_ack(self, mock_api, mock_append, mock_load): """Same command executed twice must return prior_execution=True on second call.""" - mock_path.__str__ = lambda self: self.ledger_override - # We mock the API call to avoid network - with patch("gitea_gate._api_request") as mock_api: - mock_api.return_value = {"number": 999, "title": "Test Issue", "html_url": "http://test/999"} + mock_api.return_value = {"number": 999, "title": "Test Issue", "html_url": "http://test/999"} + ledger = {} - cmd = Command( - source="nostr:test", - action="create_issue", - repo="Timmy_Foundation/test", - payload={"title": "Test Issue", "body": "body"}, - timestamp_utc="2026-04-06T14:00:00Z", - ) + def load(): + return ledger.copy() - ack1 = self.gate.execute(cmd) - self.assertTrue(ack1.success) - self.assertFalse(ack1.prior_execution) + def append(entry): + ledger[entry["idempotency_key"]] = entry - ack2 = self.gate.execute(cmd) - self.assertTrue(ack2.success) - self.assertTrue(ack2.prior_execution) - self.assertEqual(ack2.gitea_number, 999) + mock_load.side_effect = load + mock_append.side_effect = append + + cmd = Command( + source="nostr:test", + action="create_issue", + repo="Timmy_Foundation/test", + payload={"title": "Test Issue", "body": "body"}, + timestamp_utc="2026-04-06T14:00:00Z", + ) + + ack1 = self.gate.execute(cmd) + self.assertTrue(ack1.success) + self.assertFalse(ack1.prior_execution) + + ack2 = self.gate.execute(cmd) + self.assertTrue(ack2.success) + self.assertTrue(ack2.prior_execution) + self.assertEqual(ack2.gitea_number, 999) def test_idempotency_key_determinism(self): """Identical commands must produce identical keys."""