signal-bot/tests
Krzysztof kuhy Rudnicki da016e1b94
Some checks failed
CI / check (push) Has been cancelled
CI / web (push) Has been cancelled
!dodaj lands in a queue; the management page approves it into the album
A photo sent to the chat no longer enters the album by itself. pack_add
strips it, checks it against the album and the queue, and writes it to
pending/ with a sidecar naming the people and labels the sender proposed;
the reply is "czeka na zatwierdzenie". The management page lists the queue
above the tagger, with the proposal pre-ticked, and Approve moves the file
in, mints the labels, records approved_at and asks the bot to rebuild its
table through /_reload -- the same publish path every other data change
takes, so PackHolder.reload is gone. A reload the bot refuses is reported
on the page, not rolled back: the photo is in the album either way.

The personal-data gate now reads pending/*.json too, so a label that is
still waiting for approval is forbidden in the tree already. The e2e run
boots the management page beside the bot with the same environment,
proves the queue is stripped and never reaches media/, approves it through
the real routes, and has !losowe answer with the photo afterwards without
a restart; exiftool is found through media_strip.locate() there rather
than PATH, which lacks vendor_perl on Arch.

!gadaj is dropped from !odcisz: it was within a typo of !dodaj, and the
nearest-command suggestion must never be a coin toss.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-04 22:55:39 +02:00
..
__init__.py feat: rewrite the bot so it runs, and gate it like the other repos 2026-08-29 13:05:42 +02:00
analytics_seed.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
conftest.py Today's food and workout logs, read from where diet_guard and screen_locker keep them 2026-09-04 22:07:46 +02:00
gate_helpers.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
manage_fixture.py Let the operator add aliases from the Commands tab 2026-09-04 16:20:05 +02:00
pack_add_fixture.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
pack_fixture.py release: 0.2.0 «Urbanus I» — a private photo album, and a tagger for it 2026-08-30 22:35:41 +02:00
stats_seed.py release: 0.2.0 «Urbanus I» — a private photo album, and a tagger for it 2026-08-30 22:35:41 +02:00
test_allowlist.py feat: refuse to look healthy while deaf, and heal the container by itself 2026-08-29 19:01:55 +02:00
test_analytics_backfill.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_analytics_behaviour.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_analytics_command.py Rebuild the command table on demand, and survive a tag whose file is gone 2026-09-04 10:14:39 +02:00
test_analytics_health.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_analytics_hours.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_analytics_journal.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_analytics_polish.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_analytics_probe.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_analytics_usage.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_animals.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
test_announce_render.py release: 0.1.7 «Callistus I» — a version now says which pope, and when 2026-08-30 22:12:09 +02:00
test_announce.py fix: a refused attachment no longer costs a group its release notes 2026-08-30 21:33:56 +02:00
test_app_commands.py A switchboard: any command off, off until, or on its own cooldown 2026-09-04 15:55:56 +02:00
test_app.py Rebuild the command table on demand, and survive a tag whose file is gone 2026-09-04 10:14:39 +02:00
test_art_command.py feat: two commands that answer with somebody else's work 2026-08-31 21:32:07 +02:00
test_bot_catchup.py fix: the evening report is one message, not one per thing it has to say 2026-08-30 22:49:51 +02:00
test_bot_listen.py Handle frames side by side, and budget the bot's own share of a reply 2026-09-04 21:35:34 +02:00
test_bot_report.py feat: !cisza silences the bot in one group for up to ten minutes 2026-09-04 10:31:08 +02:00
test_bot.py Rebuild the command table on demand, and survive a tag whose file is gone 2026-09-04 10:14:39 +02:00
test_changelog.py release: 0.1.7 «Callistus I» — a version now says which pope, and when 2026-08-30 22:12:09 +02:00
test_cli.py fix: green CI, and a page that has actually been looked at 2026-08-31 15:38:24 +02:00
test_command_events.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_command_settings.py A switchboard: any command off, off until, or on its own cooldown 2026-09-04 15:55:56 +02:00
test_command_switch.py A switchboard: any command off, off until, or on its own cooldown 2026-09-04 15:55:56 +02:00
test_commons.py feat: a word with two meanings gets the one made of steel 2026-08-31 18:01:27 +02:00
test_config_pack.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
test_config.py !good bot: thank the asker with an emoji on their message, not a reply 2026-09-04 21:48:03 +02:00
test_cooldown_gate.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
test_counting.py feat: the message event log, and the nightly report built on it 2026-08-30 19:14:43 +02:00
test_custom_aliases.py Let the operator add aliases from the Commands tab 2026-09-04 16:20:05 +02:00
test_day_log.py Today's food and workout logs, read from where diet_guard and screen_locker keep them 2026-09-04 22:07:46 +02:00
test_decorators.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
test_discovery.py feat: the message event log, and the nightly report built on it 2026-08-30 19:14:43 +02:00
test_dispatcher_concurrency.py Handle frames side by side, and budget the bot's own share of a reply 2026-09-04 21:35:34 +02:00
test_dispatcher_gates.py Rebuild the command table on demand, and survive a tag whose file is gone 2026-09-04 10:14:39 +02:00
test_dispatcher_mute.py feat: !cisza silences the bot in one group for up to ten minutes 2026-09-04 10:31:08 +02:00
test_dispatcher_outcomes.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_dispatcher_recording.py A switchboard: any command off, off until, or on its own cooldown 2026-09-04 15:55:56 +02:00
test_dispatcher_unknown.py Rebuild the command table on demand, and survive a tag whose file is gone 2026-09-04 10:14:39 +02:00
test_dispatcher.py Rebuild the command table on demand, and survive a tag whose file is gone 2026-09-04 10:14:39 +02:00
test_envelope_shape.py fix: the operator's uuid was still a fixture in the envelope-shape test 2026-08-30 23:04:42 +02:00
test_external.py feat: python tool/tagger.py sets up .venv too, not just tag.sh 2026-08-31 13:34:27 +02:00
test_fake_account.py feat: refuse to look healthy while deaf, and heal the container by itself 2026-08-29 19:01:55 +02:00
test_fake_groups.py feat: discover groups from the account, so adding the bot is the whole setup 2026-08-29 15:30:08 +02:00
test_fake_server.py !good bot: thank the asker with an emoji on their message, not a reply 2026-09-04 21:48:03 +02:00
test_folding.py fix: commands resolve when typed on another alphabet's keyboard 2026-08-30 14:22:43 +02:00
test_food_command.py Today's food and workout logs, read from where diet_guard and screen_locker keep them 2026-09-04 22:07:46 +02:00
test_good_bot_command.py !good bot: thank the asker with an emoji on their message, not a reply 2026-09-04 21:48:03 +02:00
test_healthz.py release: 0.1.7 «Callistus I» — a version now says which pope, and when 2026-08-30 22:12:09 +02:00
test_help_album.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_help_command.py Today's food and workout logs, read from where diet_guard and screen_locker keep them 2026-09-04 22:07:46 +02:00
test_http_client.py feat: !gekon posts a research-grade gecko photo 2026-08-29 23:26:40 +02:00
test_inflight.py Handle frames side by side, and budget the bot's own share of a reply 2026-09-04 21:35:34 +02:00
test_latency.py Handle frames side by side, and budget the bot's own share of a reply 2026-09-04 21:35:34 +02:00
test_liveness.py feat: refuse to look healthy while deaf, and heal the container by itself 2026-08-29 19:01:55 +02:00
test_logging_setup.py feat: the bot can describe an envelope without quoting anybody 2026-08-30 19:29:06 +02:00
test_main.py feat: the message event log, and the nightly report built on it 2026-08-30 19:14:43 +02:00
test_manage_album.py feat: the management backend, absorbing the tagger 2026-08-31 14:38:24 +02:00
test_manage_aliases.py Let the operator add aliases from the Commands tab 2026-09-04 16:20:05 +02:00
test_manage_assets.py feat: the management backend, absorbing the tagger 2026-08-31 14:38:24 +02:00
test_manage_commands.py A switchboard: any command off, off until, or on its own cooldown 2026-09-04 15:55:56 +02:00
test_manage_envfile.py feat: the .env layer the management page will write through 2026-08-31 14:31:29 +02:00
test_manage_envkeys.py feat: the .env layer the management page will write through 2026-08-31 14:31:29 +02:00
test_manage_guard.py feat: the management backend, absorbing the tagger 2026-08-31 14:38:24 +02:00
test_manage_pending.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_manage_routes.py feat: the management backend, absorbing the tagger 2026-08-31 14:38:24 +02:00
test_media_sniff.py feat: add a photo to the album from the chat, tagged, stripped and verified 2026-08-31 11:20:00 +02:00
test_media_strip.py feat: import a folder of photos without importing it twice 2026-08-31 13:22:57 +02:00
test_media_tags.py feat: add a photo to the album from the chat, tagged, stripped and verified 2026-08-31 11:20:00 +02:00
test_media_tracks.py feat: import a folder of photos without importing it twice 2026-08-31 13:22:57 +02:00
test_membership.py feat: discover groups from the account, so adding the bot is the whole setup 2026-08-29 15:30:08 +02:00
test_models.py feat: weekly, monthly and year-in-review posts, keyed off the day reported 2026-08-30 19:56:25 +02:00
test_multiple_albums.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_mute_command.py feat: !cisza silences the bot in one group for up to ten minutes 2026-09-04 10:31:08 +02:00
test_mute.py feat: !cisza silences the bot in one group for up to ten minutes 2026-09-04 10:31:08 +02:00
test_nearest.py feat: a word the bot does not know gets an answer, and gets kept 2026-08-31 16:48:26 +02:00
test_pack_add_invariants.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_pack_add.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_pack_album.py feat: import a folder of photos without importing it twice 2026-08-31 13:22:57 +02:00
test_pack_command.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
test_pack_custom.py feat: add a photo to the album from the chat, tagged, stripped and verified 2026-08-31 11:20:00 +02:00
test_pack_import.py feat: import a folder of photos without importing it twice 2026-08-31 13:22:57 +02:00
test_pack_ledger.py feat: import a folder of photos without importing it twice 2026-08-31 13:22:57 +02:00
test_pack_load.py Rebuild the command table on demand, and survive a tag whose file is gone 2026-09-04 10:14:39 +02:00
test_pack_pending.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_pack_people.py Let the operator add aliases from the Commands tab 2026-09-04 16:20:05 +02:00
test_pack_random.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_pack_store.py feat: add a photo to the album from the chat, tagged, stripped and verified 2026-08-31 11:20:00 +02:00
test_pack.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
test_personal_data_sources.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_poem_command.py feat: two commands that answer with somebody else's work 2026-08-31 21:32:07 +02:00
test_popes_command.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
test_portcheck.py feat: make the bot actually reply on Signal, and gate every way it went silent 2026-08-29 14:37:27 +02:00
test_portraits.py release: 0.0.7 «Telesfor» — !papież, and the bot can test itself 2026-08-30 17:06:25 +02:00
test_quoting.py feat: answer the message that asked, not just the room 2026-08-29 23:01:01 +02:00
test_registry_holder.py Rebuild the command table on demand, and survive a tag whose file is gone 2026-09-04 10:14:39 +02:00
test_registry.py Let the operator add aliases from the Commands tab 2026-09-04 16:20:05 +02:00
test_routes_analytics.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_routes_suggestions.py feat: a word the bot does not know gets an answer, and gets kept 2026-08-31 16:48:26 +02:00
test_scenario.py !good bot: thank the asker with an emoji on their message, not a reply 2026-09-04 21:48:03 +02:00
test_scheduler.py feat: rewrite the bot so it runs, and gate it like the other repos 2026-08-29 13:05:42 +02:00
test_schema_tables.py A switchboard: any command off, off until, or on its own cooldown 2026-09-04 15:55:56 +02:00
test_selftest_attachments.py feat: serve several photo albums at once, each scoped to its own groups 2026-08-31 11:58:50 +02:00
test_selftest.py Handle frames side by side, and budget the bot's own share of a reply 2026-09-04 21:35:34 +02:00
test_served.py Handle frames side by side, and budget the bot's own share of a reply 2026-09-04 21:35:34 +02:00
test_startup.py feat: the message event log, and the nightly report built on it 2026-08-30 19:14:43 +02:00
test_stats_backfill.py fix: !ja told everybody their favourite hour was noon 2026-08-30 20:15:20 +02:00
test_stats_commands.py release: 0.2.0 «Urbanus I» — a private photo album, and a tagger for it 2026-08-30 22:35:41 +02:00
test_stats_curiosities.py Funny numbers: 69 (nice), 2137 🙏 and five more on every count the stats print 2026-09-04 21:55:33 +02:00
test_stats_events.py feat: the message event log, and the nightly report built on it 2026-08-30 19:14:43 +02:00
test_stats_nightly.py release: 0.1.6 «Zephyrinus» — 21:37 reports today, not yesterday 2026-08-30 22:09:13 +02:00
test_stats_periods.py feat: the message event log, and the nightly report built on it 2026-08-30 19:14:43 +02:00
test_stats_queries_period.py release: 0.2.0 «Urbanus I» — a private photo album, and a tagger for it 2026-08-30 22:35:41 +02:00
test_stats_records.py release: 0.2.0 «Urbanus I» — a private photo album, and a tagger for it 2026-08-30 22:35:41 +02:00
test_stats_render_day.py Funny numbers: 69 (nice), 2137 🙏 and five more on every count the stats print 2026-09-04 21:55:33 +02:00
test_stats_render_period.py Funny numbers: 69 (nice), 2137 🙏 and five more on every count the stats print 2026-09-04 21:55:33 +02:00
test_stats_streaks.py release: 0.2.0 «Urbanus I» — a private photo album, and a tagger for it 2026-08-30 22:35:41 +02:00
test_stats_text.py Funny numbers: 69 (nice), 2137 🙏 and five more on every count the stats print 2026-09-04 21:55:33 +02:00
test_store.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_suggest_command.py feat: a word the bot does not know gets an answer, and gets kept 2026-08-31 16:48:26 +02:00
test_suggestions_store.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_tool_imports.py feat: one page to manage the bot, and the tagger folded into it 2026-08-31 14:54:49 +02:00
test_transport_attachments.py feat: add a photo to the album from the chat, tagged, stripped and verified 2026-08-31 11:20:00 +02:00
test_transport_base.py feat: add a photo to the album from the chat, tagged, stripped and verified 2026-08-31 11:20:00 +02:00
test_transport_fake.py !good bot: thank the asker with an emoji on their message, not a reply 2026-09-04 21:48:03 +02:00
test_transport_media.py release: 0.2.0 «Urbanus I» — a private photo album, and a tagger for it 2026-08-30 22:35:41 +02:00
test_transport_rest.py !good bot: thank the asker with an emoji on their message, not a reply 2026-09-04 21:48:03 +02:00
test_traps_command.py feat: a word with two meanings gets the one made of steel 2026-08-31 18:01:27 +02:00
test_trust.py feat: the message event log, and the nightly report built on it 2026-08-30 19:14:43 +02:00
test_unknown.py feat: a word the bot does not know gets an answer, and gets kept 2026-08-31 16:48:26 +02:00
test_upstream_timing.py release: 0.2.6 «Stephanus I» — dodano !analityka 2026-08-31 23:19:51 +02:00
test_user_lock.py Handle frames side by side, and budget the bot's own share of a reply 2026-09-04 21:35:34 +02:00
test_versioning.py release: 0.1.7 «Callistus I» — a version now says which pope, and when 2026-08-30 22:12:09 +02:00
test_wiring_aliases.py Let the operator add aliases from the Commands tab 2026-09-04 16:20:05 +02:00
test_wiring_ungated.py !dodaj lands in a queue; the management page approves it into the album 2026-09-04 22:55:39 +02:00
test_wolnelektury.py feat: two commands that answer with somebody else's work 2026-08-31 21:32:07 +02:00
test_workout_command.py Today's food and workout logs, read from where diet_guard and screen_locker keep them 2026-09-04 22:07:46 +02:00