import json from datetime import date from pathlib import Path from journal_bot.process import process_once from journal_bot.queue import Queue, QueueItem from journal_bot.processor_protocol import ProcessorOutput from journal_bot.vault_writer import VaultWriter class FakeProcessor: def __init__(self, output: ProcessorOutput | None = None, healthy=True, raises=None): self._output = output self._healthy = healthy self._raises = raises def health_check(self): return self._healthy def process(self, payload): if self._raises: raise self._raises return self._output class CapturingProcessor: """Records the payload it was asked to process and echoes today as target.""" def __init__(self): self.payload = None def health_check(self): return True def process(self, payload): self.payload = payload return ProcessorOutput( target_date=payload.today, target_path=f"05 Daily Notes/{payload.today}.md", entry_markdown=f"## {payload.received_time}\n{payload.text}", ) def make_item(update_id=1, text="Hallo"): return QueueItem( update_id=update_id, received_at="2026-06-14T14:32:17+02:00", type="text", text=text, ) def test_process_writes_to_vault_and_completes(tmp_path): vault = tmp_path / "vault" (vault / "05 Daily Notes").mkdir(parents=True) queue = Queue(tmp_path / "q") queue.enqueue(make_item(1)) processor = FakeProcessor(ProcessorOutput( target_date="2026-06-14", target_path="05 Daily Notes/2026-06-14.md", entry_markdown="## 14:32\nHallo", )) writer = VaultWriter(vault) n = process_once(processor, queue, writer, vault_path=vault, today=date(2026, 6, 14), processed_at="2026-06-14T15:00:00+02:00") assert n == 1 assert (tmp_path / "q" / "done" / "1.json").exists() assert (vault / "05 Daily Notes" / "2026-06-14.md").exists() def test_process_skips_when_unhealthy(tmp_path): vault = tmp_path / "vault" (vault / "05 Daily Notes").mkdir(parents=True) queue = Queue(tmp_path / "q") queue.enqueue(make_item(1)) processor = FakeProcessor(healthy=False) writer = VaultWriter(vault) n = process_once(processor, queue, writer, vault_path=vault, today=date(2026, 6, 14), processed_at="2026-06-14T15:00:00+02:00") assert n == 0 assert (tmp_path / "q" / "pending" / "1.json").exists() def test_process_fails_item_on_error(tmp_path): vault = tmp_path / "vault" (vault / "05 Daily Notes").mkdir(parents=True) queue = Queue(tmp_path / "q") queue.enqueue(make_item(1)) processor = FakeProcessor(raises=RuntimeError("boom")) writer = VaultWriter(vault) process_once(processor, queue, writer, vault_path=vault, today=date(2026, 6, 14), processed_at="2026-06-14T15:00:00+02:00") assert (tmp_path / "q" / "pending" / "1.json").exists() import json data = json.loads((tmp_path / "q" / "pending" / "1.json").read_text(encoding="utf-8")) assert data["attempts"] == 1 def test_target_date_follows_send_day_not_processing_day(tmp_path): # Message sent yesterday (2026-06-25), processed today (2026-06-26). # The daily note must be the send day, not the processing day. vault = tmp_path / "vault" (vault / "05 Daily Notes").mkdir(parents=True) queue = Queue(tmp_path / "q") item = QueueItem( update_id=1, received_at="2026-06-25T08:13:42+02:00", type="text", text="Neue Charge Kefir angesetzt", ) queue.enqueue(item) processor = CapturingProcessor() writer = VaultWriter(vault) process_once( processor, queue, writer, vault_path=vault, today=date(2026, 6, 26), # processing day differs from send day processed_at="2026-06-26T06:55:22+02:00", ) # The processor must have been told today = the send day, with matching weekday. assert processor.payload.today == "2026-06-25" assert processor.payload.weekday == "Donnerstag" # 2026-06-25 is a Thursday # And the entry landed in the send-day note. data = json.loads((tmp_path / "q" / "done" / "1.json").read_text(encoding="utf-8")) assert data["target_path"] == "05 Daily Notes/2026-06-25.md" def test_process_records_result_fields(tmp_path): vault = tmp_path / "vault" (vault / "05 Daily Notes").mkdir(parents=True) queue = Queue(tmp_path / "q") queue.enqueue(make_item(1)) processor = FakeProcessor(ProcessorOutput( target_date="2026-06-14", target_path="05 Daily Notes/2026-06-14.md", entry_markdown="## 14:32\nHallo", )) writer = VaultWriter(vault) process_once( processor, queue, writer, vault_path=vault, today=date(2026, 6, 14), processed_at="2026-06-14T15:00:00+02:00", ) data = json.loads( (tmp_path / "q" / "done" / "1.json").read_text(encoding="utf-8") ) assert data["target_path"] == "05 Daily Notes/2026-06-14.md" assert data["written_entry"] == "## 14:32\nHallo" assert data["processed_at"] == "2026-06-14T15:00:00+02:00"