✔ zoned uses the IANA zone across DST (13.128415ms)
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (18.297433ms)
✔ two blocking decisions get two DMs with different nonces (11.313253ms)
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.18167ms)
✔ a failed DM is journaled, backs off, and is retried until it lands (11.988508ms)
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (13.957443ms)
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (17.089441ms)
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (11.262007ms)
✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (100.79942ms)
✔ a restart after the second refusal does not send before that refusal's 30 min are up (53.784148ms)
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (12.748208ms)
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (9.222529ms)
✔ an inbox read failure is logged and the next poll retries (0.722967ms)
✔ no Discord id reaches the journal or the log (9.544532ms)
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (1.789995ms)
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (1.986084ms)
✔ the journal: a whole file that is one torn line truncates to empty (1.349357ms)
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (0.508954ms)
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (0.610828ms)
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (2.047239ms)
✔ the journal: a symlinked directory refuses and says it is a link (0.373784ms)
✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (1.769133ms)
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.453007ms)
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.504576ms)
✔ digest content stays within Discord's 2000 characters (0.293826ms)
✔ runLoop never overlaps ticks and stops after the one in flight (112.058864ms)
ℹ tests 26
ℹ suites 0
ℹ pass 26
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 472.016842
