145 lines
5.1 KiB
Python
145 lines
5.1 KiB
Python
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"
|