ulysses/tests
Mazen Tamer Salah d71284194b
fix(memory): only delete memories the model explicitly drops in tidy (#3455)
* fix(memory): only delete memories the model explicitly drops in tidy

The AI memory-tidy path computed deletions as the complement of the model's
`keep` list (`if mid not in keep_ids: continue`). When the model returned a
valid response that simply omitted some existing ids — a common LLM lapse — every
omitted memory was silently deleted, even though it was neither a duplicate nor
listed in `drop`.

Honor the explicit `drop` set instead: delete only ids the model dropped (minus
any it saw only truncated), and preserve everything else, still applying cleaned
text/category from `keep`.

Adds tests/test_consolidate_memory_explicit_drops.py: a memory the model omits
from both keep and drop survives; an explicitly dropped one is removed.

* refactor(memory): remove now-dead keep_ids from tidy

After deletion switched to drop_ids and text/category rewrites to cleaned_by_id,
keep_ids was written but never read. Remove the init, the .add(mid) in the keep
loop, and the truncated .update() (its truncated-protection is already covered by
`drop_ids -= truncated_ids`). Pure deletion, no behavior change; tests stay green.

Addresses review feedback on #3455.

---------

Co-authored-by: Kenny Van de Maele <kenny@kvandemaele.be>
2026-06-08 18:54:45 +02:00
..
helpers refactor(tests): add temp sqlite helper (#2930) 2026-06-07 23:44:16 +02:00
streaming fix(chat): stop code-block button flicker during streaming (#3023) 2026-06-06 04:08:54 -06:00
bombadil-spec.ts Odysseus v1.0 2026-05-31 23:58:26 +09:00
conftest.py fix(tests): make conftest DB import clean-worktree safe 2026-06-05 09:14:51 +01:00
markdown_codefence_placeholder_regression.mjs Render emoji shortcodes as icons in chat (#345) (#629) 2026-06-05 02:28:42 +02:00
README.md docs(tests): define testing standard and taxonomy (#3372) 2026-06-08 01:15:47 +02:00
test_action_intents.py fix(calendar): route read requests to agent (#2452) 2026-06-05 09:24:04 +01:00
test_action_intents_shell_verbs.py Anchor shell-verb intent patterns to imperative or can-you position (#1664) 2026-06-03 14:23:10 +09:00
test_active_document_clear.py fix: closed document stays active & leaks into new chats (#1160) (#1238) 2026-06-03 01:47:13 +09:00
test_admin_device_flow_static.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_admin_wipe_gallery.py Admin: wipe gallery albums with images 2026-06-02 20:35:57 +09:00
test_agent_loop.py fix(mcp): route literal MCP requests to external schemas 2026-06-04 13:00:17 +00:00
test_agent_rounds_exhausted.py feat: round-limit handling — Continue affordance at the cap + configurable cap (#1999) 2026-06-04 22:36:05 +02:00
test_agent_tools_truncate_nonstring.py fix: agent_tools._truncate crashes on non-string input (#1624) 2026-06-03 14:06:39 +09:00
test_ai_interaction_owner_scope.py fix(ai): scope tool model resolution by owner 2026-06-04 00:37:28 +01:00
test_amd_gpu_check_args.py Parse all AMD GPU check args (#1586) 2026-06-03 08:56:48 +09:00
test_anthropic_response_parse.py fix: Anthropic responses with multiple text blocks lose all but the first (#1255) 2026-06-03 00:57:20 +09:00
test_api_chat_security.py Reapply "Merge branch 'main' of github.com:pewdiepie-archdaemon/odysseus" 2026-06-03 22:47:00 +09:00
test_api_key_manager_corrupt_load.py fix: APIKeyManager.load crashes app startup on a corrupt/wrong-shape api_keys.json (#1565) 2026-06-03 08:11:37 +09:00
test_api_key_manager_resilience.py API keys: skip undecryptable entries on load 2026-06-02 20:28:26 +09:00
test_api_token_routes.py tests: cover API token CRUD routes 2026-06-02 20:42:32 +09:00
test_api_token_user_route_gate.py fix(auth): gate api tokens from user routes (#2992) 2026-06-07 12:55:01 +02:00
test_app.py Fix fresh checkout test failures 2026-06-01 02:22:17 +00:00
test_app_static_mime.py fix: normalize JS static MIME types on Windows 2026-06-02 01:32:00 +02:00
test_archived_sessions_model_filter.py fix(tests): make archived session filter test multipart-independent 2026-06-05 10:12:47 +01:00
test_ask_user_tool.py Add ask_user tool: agent-posed multiple-choice questions (#2111) 2026-06-05 11:49:11 +02:00
test_atomic_io.py Add atomic IO durability tests (#1622) 2026-06-03 14:14:16 +09:00
test_auth_config_lock_concurrency.py refactor(tests): reuse import-state helper in auth manager tests 2026-06-05 11:24:55 +01:00
test_auth_event_loop.py fix: avoid double bcrypt on login by using create_session_trusted (#3236) 2026-06-07 15:10:53 +02:00
test_auth_regressions.py fix(endpoint): import ModelEndpoint from core database 2026-06-04 11:51:47 +01:00
test_auth_require_privilege_nondict.py fix: require_privilege 500s on a non-dict privileges blob from auth.json (#1693) 2026-06-03 13:37:54 +09:00
test_auth_session_revocation.py refactor(tests): reuse import-state helper in auth tests 2026-06-05 11:10:41 +01:00
test_aux_llm_owner_scope.py fix(endpoint): scope secondary endpoint lookups by owner 2026-06-08 11:51:55 +01:00
test_backup_cli_security.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_backup_import_cross_user_dedup.py fix: backup import drops a user's memory when its text matches another user's (#1743) 2026-06-03 13:29:14 +09:00
test_backup_import_skills.py fix: restore backup import after skills migration (#2980) 2026-06-06 21:46:32 +01:00
test_bg_jobs_store.py Ignore invalid background job store rows (#1261) 2026-06-03 14:07:14 +09:00
test_bg_monitor_stream.py Ignore non-string background stream deltas (#1549) 2026-06-03 14:11:45 +09:00
test_blind_compare_redaction.py refactor(tests): add import-state isolation helper 2026-06-05 07:30:14 +01:00
test_build_user_content_pdf_marker.py fix(documents): restore PDF library metadata and preview (#2483) 2026-06-07 23:23:27 +02:00
test_builtin_actions_nonstring.py fix: builtin_actions heuristics crash on a truthy non-string input (#1639) 2026-06-03 08:59:16 +09:00
test_builtin_actions_owner_scope.py fix(actions): scope scheduled model resolution to owner (#2773) 2026-06-05 13:13:13 +02:00
test_builtin_memory_consolidation.py Scope memory consolidation by owner group 2026-06-02 12:40:28 +09:00
test_caldav_google_principal_url.py fix(caldav): disable redirects on the sync/write-back DAVClient (SSRF) (#2663) 2026-06-07 05:05:24 +01:00
test_caldav_redirect_hardening.py fix(caldav): disable redirects on the sync/write-back DAVClient (SSRF) (#2663) 2026-06-07 05:05:24 +01:00
test_caldav_sync_prune_local_events.py fix(caldav): don't prune locally-created events on sync (#2706) 2026-06-05 02:48:03 +02:00
test_caldav_sync_uid_scope.py fix(calendar): scope CalDAV event lookup by calendar 2026-06-04 04:01:21 +01:00
test_caldav_url_hardening.py fix(caldav): disable redirects on the sync/write-back DAVClient (SSRF) (#2663) 2026-06-07 05:05:24 +01:00
test_caldav_url_nonstring.py Harden DAV outbound URL validation (#2819) 2026-06-05 13:22:21 +02:00
test_caldav_writeback.py feat(calendar): support multiple CalDAV accounts (#2942) 2026-06-05 20:32:50 +02:00
test_caldav_writeback_route.py feat: CalDAV write-back — push local event create/update/delete to the remote (#800) (#1282) 2026-06-03 01:44:02 +09:00
test_calendar_cli_name.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_calendar_event_contrast.py Improve calendar event text contrast (#1184) 2026-06-02 23:14:52 +09:00
test_calendar_list_range_aliases.py fix(calendar): accept list event range aliases 2026-06-06 03:47:18 -06:00
test_calendar_owner_scope.py Sanitize calendar export filenames (#2840) 2026-06-05 10:18:09 +02:00
test_calendar_parse_dt_naive.py Strip tz in _parse_dt dateutil fallback (naive-datetime contract) (#2557) 2026-06-05 08:18:26 +01:00
test_calendar_parse_dt_tonight.py fix: _parse_dt does not understand 'tonight' so event start/end breaks (#1488) 2026-06-03 14:14:41 +09:00
test_calendar_recurrence.py fix(calendar): cap RRULE expansion (#2902) 2026-06-05 16:05:14 +02:00
test_calendar_rrule.py refactor(tests): add temp sqlite helper (#2930) 2026-06-07 23:44:16 +02:00
test_calendar_rrule_until_utc.py fix(calendar): keep recurring events with a UTC UNTIL from collapsing to one (#1383) 2026-06-03 14:24:14 +09:00
test_calendar_update_event_tz.py refactor(tests): add temp sqlite helper (#2930) 2026-06-07 23:44:16 +02:00
test_calendar_utils_dates_js.py Ignore non-string calendar date inputs (#1649) 2026-06-03 14:16:58 +09:00
test_censor_pref_js.py Ignore censor preference storage errors (#1652) 2026-06-03 14:16:55 +09:00
test_chat_attachment_picker.py Chat attachments: allow picker to choose any file type 2026-06-02 20:55:30 +09:00
test_chat_cached_model_normalization.py Chat: use cached endpoint model ids before probing 2026-06-02 21:00:58 +09:00
test_chat_helpers.py fix(chat): show requested and actual reply models 2026-06-06 04:30:16 -06:00
test_chat_image_routing.py Fix Windows Cookbook background tasks, exit statuses, and empty SSH logs wrapper (#1389) 2026-06-05 14:41:07 +02:00
test_chat_metrics.py fix(chat): show requested and actual reply models 2026-06-06 04:30:16 -06:00
test_chat_preprocess_tool_policy.py fix(agent): enforce guide-only tool policy (#3088) 2026-06-06 18:48:24 -06:00
test_chat_route_tool_policy.py fix(agent): enforce guide-only tool policy (#3088) 2026-06-06 18:48:24 -06:00
test_chat_stream_scope.py Fix chat stream recovery and PDF library indexing (#468) 2026-06-01 22:33:35 +09:00
test_chat_tool_screenshot_xss.py Harden chat streaming DOM sinks (#2498) 2026-06-04 20:49:37 +02:00
test_chat_upload_limit_config.py fix(upload): configure chat attachment size limit (#2439) 2026-06-07 22:42:24 +02:00
test_chatgpt_subscription_routes.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_check_outbound_url_nonstring.py fix: check_outbound_url crashes on a truthy non-string URL (#1623) 2026-06-03 08:59:49 +09:00
test_chroma_client.py fix: ChromaDB unreachable blocks app startup for 30-60s (#326) (#476) 2026-06-01 22:22:41 +09:00
test_claim_ownerless_json.py Skip invalid ownerless JSON rows (#1540) 2026-06-03 14:06:57 +09:00
test_cleanup_owner_scope.py tests: cover cleanup owner scope 2026-06-02 20:42:21 +09:00
test_cleanup_service_utcnow.py Replace cleanup service datetime.utcnow calls (#1494) 2026-06-03 14:14:27 +09:00
test_code_nav_tools.py feat: add code-navigation tools (grep, glob, ls) + read_file line ranges (#1670) 2026-06-04 18:37:32 +02:00
test_compact_truncate_tool_call_args.py fix(compactor): shrink oversized tool_calls arguments so trim_for_context can fit a tool-only turn (#2949) 2026-06-05 20:23:38 +02:00
test_compaction_summary_failure.py fix(test): tolerate owner kwarg in compaction summary resolve_endpoint mock (#3304) 2026-06-07 17:23:06 +02:00
test_companion_pairing.py refactor(constants): single source of truth for data dir (#3368) 2026-06-08 09:58:52 +02:00
test_companion_readonly.py Tests: companion model JSON resilience 2026-06-02 13:15:22 +09:00
test_compare_endpoint_owner_scope.py fix(tests): isolate compare endpoint owner-scope test 2026-06-04 19:17:15 +01:00
test_compare_js.py Fix duplicate compare modal on repeated clicks (#491) 2026-06-01 22:24:27 +09:00
test_compare_stop_disconnect_poll.py fix(compare): stream Compare panes directly to stop upstream promptly 2026-06-08 01:13:45 +01:00
test_composer_arrow_up_recall_js.py feat(chat): recall last user message on empty composer ArrowUp (#1175) 2026-06-08 13:06:05 +02:00
test_compute_next_run_monthly_clamp.py fix: monthly tasks scheduled for day 29-31 skip every short month (#1668) 2026-06-03 14:23:01 +09:00
test_consolidate_memory_explicit_drops.py fix(memory): only delete memories the model explicitly drops in tidy (#3455) 2026-06-08 18:54:45 +02:00
test_contacts_add_null_name.py fix: POST /api/contacts/add crashes on JSON null name/email (None.strip()) (#1544) 2026-06-03 14:23:34 +09:00
test_contacts_carddav_security.py Harden DAV outbound URL validation (#2819) 2026-06-05 13:22:21 +02:00
test_contacts_cli_rows.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_contacts_vcard_parse.py fix(contacts): parse Apple/iCloud item-grouped vCard EMAIL/TEL properties (#1438) 2026-06-03 14:24:04 +09:00
test_context_budget.py fix(agent): make context-budget hard_max configurable via agent_input_token_hard_max setting (#1273) 2026-06-03 01:36:57 +09:00
test_context_cache_per_endpoint.py fix(model-context): key context-window cache by (endpoint, model) (#2614) 2026-06-05 02:50:56 +02:00
test_context_compactor.py Scope auxiliary LLM endpoints by owner (#2996) 2026-06-07 14:47:44 +02:00
test_context_compactor_nonstring.py fix: context_compactor token helpers crash on non-string message text (#1634) 2026-06-03 14:12:14 +09:00
test_cookbook_cli_state.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_cookbook_cpu_only_serve.py Drop GPU-only flags from the CPU-only (-ngl 0) serve command (#1433) 2026-06-03 04:26:15 +09:00
test_cookbook_dependency_completion_regression.py fix(tests): restore Python CI baseline regressions 2026-06-05 10:31:38 +01:00
test_cookbook_diagnosis.py fix: diagnose vllm serve runtime issues (#1198) 2026-06-05 11:03:04 +01:00
test_cookbook_download_toast_duration.py Keep Cookbook download-failure toasts visible long enough to read (#1412) 2026-06-03 03:48:25 +09:00
test_cookbook_endpoint_registration.py Fix Cookbook container-local model endpoints (#1223) 2026-06-03 00:09:48 +09:00
test_cookbook_error_feedback.py fix(cookbook): surface backend diagnosis when serve fails in background (#1636) 2026-06-05 09:52:07 +01:00
test_cookbook_gemma4_thinking_template.py feat(cookbook): add Gemma4 thinking chat template (#2955) 2026-06-05 22:43:31 +02:00
test_cookbook_helpers.py fix(platform): Improve WSL SSH remote compatibility (#3316) 2026-06-08 00:33:50 +02:00
test_cookbook_package_detection.py fix(cookbook): detect llama-cpp-python via its real distribution name (#1020) (#1167) 2026-06-02 22:52:37 +09:00
test_cookbook_progress_signal_js.py Don't falsely declare a dependency build stale (#1568) (#1768) 2026-06-03 13:23:35 +09:00
test_copilot.py feat(provider): add GitHub Copilot provider with device-flow auth (#1480) 2026-06-04 21:13:14 +02:00
test_copilot_routes.py feat(provider): add GitHub Copilot provider with device-flow auth (#1480) 2026-06-04 21:13:14 +02:00
test_cors_preflight.py Fix: CORS preflight 401'd by AuthMiddleware before CORSMiddleware (#3262) 2026-06-07 15:23:23 +02:00
test_database_utcnow.py Replace core database utcnow defaults (#1457) 2026-06-04 02:50:19 +01:00
test_ddg_redirect_resolution.py Match host, not substring, when resolving DuckDuckGo redirects (#886) 2026-06-02 12:25:56 +09:00
test_deep_research_date_context.py Inject current date into deep research planning and query prompts (#1347) 2026-06-03 03:00:52 +09:00
test_deep_research_extraction_controls.py fix(research): support timeout defaults in direct tests (#2624) 2026-06-04 20:23:17 +02:00
test_deep_research_parse_json_array_echo.py fix: deep research runs the prompt's example queries when the model echoes them (#1666) 2026-06-03 14:23:07 +09:00
test_deep_research_search_error.py Research: report empty search provider results clearly 2026-06-02 20:34:25 +09:00
test_deep_research_synthesis_resilience.py Don't lose deep-research findings when synthesis times out (#1551) (#1562) 2026-06-03 08:11:44 +09:00
test_delete_message_no_session.py Let the output "x" delete work when no model/session exists (#1431) 2026-06-03 04:20:48 +09:00
test_delete_user_invalidates_token_cache.py fix(auth): revoke API tokens when deleting users 2026-06-04 04:44:34 +01:00
test_delete_user_revokes_api_tokens.py refactor(tests): reuse import-state helper in auth tests 2026-06-05 11:10:41 +01:00
test_deleted_session_sidebar_regression.py Fix stale deleted sessions in sidebar (#1203) 2026-06-02 23:52:22 +09:00
test_derive_title_nonstring.py fix: _derive_title crashes on non-string content instead of returning Untitled (#1751) 2026-06-03 13:25:41 +09:00
test_device_flow_routes.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_dialog_aria.py Add dialog accessibility semantics 2026-06-02 12:41:25 +09:00
test_diffusion_server_security.py test(diffusion-server): exercise security middleware wiring (#3214) 2026-06-07 23:42:11 +02:00
test_digest_windows.py fix: calendar check-in digest drops events 7-8 days out (#1249) 2026-06-03 01:03:58 +09:00
test_direct_upload_limits.py fix(uploads): bound direct upload reads 2026-06-04 00:32:50 +01:00
test_doc_library_open_orphaned.py Let orphaned documents be reopened from the library (#1602) (#1761) 2026-06-03 13:28:31 +09:00
test_docs_cli_content_length.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_docs_no_orphan_images.py Remove stray PR screenshots accidentally committed under docs/ (#1351) 2026-06-03 03:31:09 +09:00
test_docs_query_nondict_rows.py fix: docs RAG query crashes on a non-dict row from the index (#1706) 2026-06-03 13:35:01 +09:00
test_document_actions_nonstring.py fix: document_actions title/content helpers crash on non-string input (#1621) 2026-06-03 08:59:55 +09:00
test_document_ai_preview_refresh_js.py fix document preview refresh after AI edits (#2259) 2026-06-07 22:33:01 +02:00
test_document_close_clears_active_route.py refactor(tests): centralize fake database import-state cleanup 2026-06-05 12:27:44 +01:00
test_document_deeplink.py fix: open #document deep-links on refresh and surface load errors (#631) 2026-06-02 11:48:54 +09:00
test_document_diff_discard_on_update_js.py fix(documents): discard pending AI diff before switching active doc (#2484) 2026-06-07 22:35:35 +02:00
test_document_editor_scroll.py Fix document editor scrollbar and line-number sync 2026-06-03 13:40:19 +09:00
test_document_library_delete_counters.py fix(documents): refresh library counters after removal (#1924) 2026-06-04 04:42:23 +01:00
test_document_library_language_facet.py fix: document library language facet undercounts text documents (#1758) 2026-06-03 13:28:38 +09:00
test_document_library_pdf_metadata.py fix(documents): restore PDF library metadata and preview (#2483) 2026-06-07 23:23:27 +02:00
test_document_pdf_marker.py Documents: strip PDF marker without corrupting text 2026-06-02 20:35:27 +09:00
test_document_processor_attachment_budget.py Cap inline attachment context across files (#1498) 2026-06-03 14:23:43 +09:00
test_document_session_owner_scope.py Scope document session links by owner (#3005) 2026-06-07 12:47:20 +02:00
test_document_tidy_null_timestamp.py fix: document tidy crashes on a duplicate with NULL timestamps (#1772) 2026-06-03 13:23:01 +09:00
test_document_tool_owner_scope.py Scope document tools to caller owner 2026-06-02 06:00:02 +09:00
test_edit_file.py fix(tests): call live tool_execution module in edit-file gate test 2026-06-04 23:22:02 +01:00
test_editor_draft_payload.py Ignore invalid editor draft payloads (#1533) 2026-06-03 14:07:03 +09:00
test_email_decode_header.py fix(email): guard _decode_header against unknown MIME charset (#1354) 2026-06-03 14:24:20 +09:00
test_email_envelope_recipients.py fix: SMTP envelope recipients split on commas inside display names (#1464) 2026-06-03 14:23:58 +09:00
test_email_fallback_reconnect.py Reconnect after a failed SEARCH ALL so the email poller doesn't desync IMAP (#1613) (#1748) 2026-06-03 13:28:53 +09:00
test_email_helpers_decode_header_spaces.py fix(email): decode headers without injected spaces (#2433) 2026-06-07 16:56:20 +02:00
test_email_imap_timeout.py Use shared IMAP timeout for account tests (#1088) 2026-06-02 23:11:04 +09:00
test_email_library_bulk_actions.py Email: persist bulk read state to provider 2026-06-02 20:28:01 +09:00
test_email_linkify_security_js.py Harden email HTML URL sanitization (#2496) 2026-06-04 20:47:47 +02:00
test_email_owner_scope.py fix(email): scope AI caches by owner (#2695) 2026-06-05 02:21:50 +02:00
test_email_polly_imap_leak.py fix(tests): allow multiple logout calls when IMAP fallback reconnects (#1976) 2026-06-04 02:56:05 +01:00
test_email_smtp_security.py Email: add explicit SMTP security mode 2026-06-02 13:15:06 +09:00
test_email_split_border_css.py fix(ui): contain email split divider (#1194) 2026-06-02 23:28:24 +09:00
test_email_thread_parser_nonstring.py Ignore non-string email thread bodies (#1654) 2026-06-03 14:06:31 +09:00
test_embedding_cache_confinement.py Constrain embedding model cache paths (#2849) 2026-06-05 10:46:48 +02:00
test_embedding_endpoint_config.py Ignore non-object embedding endpoint config (#1260) 2026-06-03 14:12:41 +09:00
test_embedding_lanes.py fix: split Chroma embedding lanes (#3046) 2026-06-06 03:17:19 -06:00
test_embeddings.py Add support for EMBEDDING_API_KEY (#2691) 2026-06-05 14:47:24 +02:00
test_emoji_shortcodes_js.py Render emoji shortcodes as icons in chat (#345) (#629) 2026-06-05 02:28:42 +02:00
test_emoji_svg_hardening.py Harden emoji SVG proxy responses (#2842) 2026-06-05 10:31:58 +02:00
test_endpoint_owner_scope_followup.py fix(endpoint): scope secondary endpoint lookups by owner 2026-06-08 11:51:55 +01:00
test_endpoint_probing.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_endpoint_resolver.py refactor(tests): replace local function copies in test_endpoint_resolver with real imports (#3359) 2026-06-07 22:47:57 +02:00
test_esc_menu_stack_js.py fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
test_estimate_tokens_tool_calls.py fix(model-context): count tool_calls in estimate_tokens so compaction sees real size (#2751) 2026-06-05 15:56:54 +02:00
test_extract_quotes.py fix: extract_quotes accepts mismatched opening/closing quotes (#1113) 2026-06-02 22:34:52 +09:00
test_extract_skill_json_nonstring.py fix: _extract_skill_json crashes on a truthy non-string teacher response (#1630) 2026-06-03 08:59:36 +09:00
test_extract_statistics.py fix: extract_statistics drops large numbers and trailing % signs (#1153) 2026-06-02 22:35:30 +09:00
test_fenced_invoke_no_raw_xml.py fix: route misfenced web lookups to web tools 2026-06-06 03:46:31 -06:00
test_font_routes.py Keep compact font family names together (#1263) 2026-06-03 14:24:30 +09:00
test_form_markdown_roundtrip.py fix(forms): keep PDF-form export from dropping values when the label has '*' (#1407) 2026-06-03 14:24:07 +09:00
test_forwarded_message_divider.py Email: recognize forwarded message dividers 2026-06-02 20:32:56 +09:00
test_function_call_non_object_args.py fix(agent): coerce non-object tool-call arguments instead of crashing (#1370) 2026-06-03 14:14:37 +09:00
test_gallery_album_owner_scope.py Harden gallery album assignment scope (#3004) 2026-06-07 12:49:03 +02:00
test_gallery_cli_album_count.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_gallery_cli_preview.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_gallery_endpoint_matching.py Scope gallery image endpoints by owner (#3001) 2026-06-07 12:51:21 +02:00
test_gallery_endpoint_ssrf.py fix: validate client-supplied image _endpoint to prevent SSRF (gallery proxies) (#1718) 2026-06-03 13:34:17 +09:00
test_gallery_exif_orientation.py fix: gallery records raw instead of display dimensions for EXIF-rotated photos (#1667) 2026-06-03 14:23:04 +09:00
test_gallery_filename_confinement.py Constrain gallery filenames to image root (#2828) 2026-06-05 10:29:11 +02:00
test_gallery_image_endpoint_owner_scope.py Scope gallery image endpoints by owner (#3001) 2026-06-07 12:51:21 +02:00
test_gallery_image_privileges.py fix(endpoint): scope secondary endpoint lookups by owner 2026-06-08 11:51:55 +01:00
test_gallery_owner_filter_single_user.py fix: gallery tag filters and tag-cleanup are empty in single-user mode (#1771) 2026-06-03 13:23:08 +09:00
test_generated_image_confinement.py Constrain generated-image paths to image root (#2837) 2026-06-05 10:33:47 +02:00
test_gmail_quote_attribution_js.py Parse standard Gmail quote attribution dates 2026-06-03 13:45:56 +09:00
test_gpu_compose_standalone.py Reapply "Merge branch 'main' of github.com:pewdiepie-archdaemon/odysseus" 2026-06-03 22:47:00 +09:00
test_group_chat_storage.py Keep group chat session cache loading (#1418) 2026-06-03 04:05:40 +09:00
test_helpers_import_state.py refactor(tests): centralize fake endpoint resolver cleanup 2026-06-05 13:23:46 +01:00
test_hex_to_rgb_js.py fix: theme color parsing breaks on #rgb shorthand hex (#1213) 2026-06-03 00:30:03 +09:00
test_history_compact_tool_calls.py Scope auxiliary LLM endpoints by owner (#2996) 2026-06-07 14:47:44 +02:00
test_history_db_fallback_hidden.py fix: history DB fallback returned hidden (compaction) messages to the client (#1726) 2026-06-03 13:30:11 +09:00
test_history_order_by_timestamp_regression.py Fix HTTP 500 in history routes: order ChatMessage by timestamp, not created_at (#1673) 2026-06-03 14:22:51 +09:00
test_history_topics_owner_scope.py fix(history): scope topic analysis to authenticated owner only (#744) 2026-06-02 11:36:01 +09:00
test_hwfit_amd.py Cookbook fit: steer consumer AMD to GGUF recommendations 2026-06-02 21:01:42 +09:00
test_hwfit_bandwidth_nonstring.py fix: _lookup_bandwidth crashes on a truthy non-string gpu_name (#1641) 2026-06-03 14:11:10 +09:00
test_hwfit_macos.py fix: require GGUF sources for llama downloads (#368) 2026-06-01 22:47:47 +09:00
test_hwfit_manual_backend.py fix(hwfit): honor manual "metal" backend in the hardware simulator (#1090) 2026-06-02 23:12:34 +09:00
test_hwfit_native_quant_labels.py fix: hwfit native quant labels miss the cost maps and over-estimate VRAM (#1690) 2026-06-03 14:22:42 +09:00
test_hwfit_params_b_malformed.py fix: params_b crashes the whole ranking on a malformed parameter_count (#1550) 2026-06-03 14:23:30 +09:00
test_hwfit_quant_formats.py Fix native Cookbook quant classification 2026-06-02 13:07:20 +09:00
test_hwfit_unified_nvidia.py fix(platform): Improve WSL SSH remote compatibility (#3316) 2026-06-08 00:33:50 +02:00
test_hwfit_windows.py fix(hwfit): filter non-GGUF models on Windows (#2530) 2026-06-04 20:02:13 +02:00
test_icloud_imap_full_fetch.py Fetch full messages with BODY.PEEK[] so read_email works on iCloud IMAP (#1961) (#1963) 2026-06-04 03:53:14 +01:00
test_ics_escape.py Sanitize calendar export filenames (#2840) 2026-06-05 10:18:09 +02:00
test_ics_export_escaping.py fix: ICS export — escape X-WR-CALNAME and honour is_utc on DTSTART/DTEND (#1174) 2026-06-02 23:02:28 +09:00
test_ics_import_dedup_tz.py fix: re-importing an ICS file duplicates every tz-aware timed event (#1683) 2026-06-03 14:22:49 +09:00
test_image_models_nondict_system.py fix: image model ranking crashes when system is not a dict (#1900) 2026-06-04 03:23:59 +01:00
test_image_models_nonstring_search.py fix: image model ranking crashes on a non-string search filter (#1898) 2026-06-04 03:26:35 +01:00
test_imap_leak_fixes.py fix(email): guarantee IMAP conn.logout() on all exception paths (#1530) 2026-06-07 05:09:28 +01:00
test_imap_mailbox_quoting.py fix: quote IMAP mailbox arguments (#2170) 2026-06-05 16:00:20 +02:00
test_inside_base_dir_nonstring.py fix: inside_base_dir raises TypeError on a non-string path instead of failing closed (#1619) 2026-06-03 09:00:04 +09:00
test_integrations_store_shape.py Ignore invalid integration rows (#1404) 2026-06-03 14:07:11 +09:00
test_internal_api_base.py fix: route all agent loopback calls through internal_api_base() helper (#3322) 2026-06-07 22:22:09 +01:00
test_is_youtube_url_nonstring.py fix: is_youtube_url crashes on a non-string url (#1752) 2026-06-03 13:24:33 +09:00
test_is_youtube_url_nonstring_svc.py fix: is_youtube_url (services) crashes on a non-string url (#1753) 2026-06-03 13:24:24 +09:00
test_keybind_altgr_js.py Ignore AltGr keystrokes in Ctrl+Alt keyboard shortcuts (#825) 2026-06-02 11:12:54 +09:00
test_lang_icon_null_opts_js.py fix: langIcon throws on an explicit null opts argument (#1740) 2026-06-03 13:29:21 +09:00
test_llm_core_anthropic_cache.py Add Anthropic prompt caching to the agent loop (#812) 2026-06-02 11:14:31 +09:00
test_llm_core_anthropic_temp_clamp.py Clamp Anthropic temperature to [0.0, 1.0] in _build_anthropic_payload (#1737) 2026-06-03 13:29:36 +09:00
test_llm_core_concurrency.py Make LLM host health maps thread-safe 2026-06-02 05:54:23 +09:00
test_llm_core_fallback.py Don't attempt the same (url, model) route twice in the fallback chains (#1733) 2026-06-03 13:33:50 +09:00
test_llm_core_ollama.py Ollama: pass discovered num_ctx in chat requests 2026-06-02 20:27:24 +09:00
test_llm_core_reasoning.py fix(llm): route harmony thinking streams (#2449) 2026-06-05 15:22:08 +02:00
test_llm_core_reasoning_content_fallback.py fix: surface reasoning_content when content is empty (thinking models) (#1233) 2026-06-03 01:41:24 +09:00
test_llm_core_sanitize_tool_calls.py test: stabilize full test collection 2026-06-04 00:27:29 +01:00
test_llm_core_sse_no_space.py fix: streaming drops providers that emit SSE data lines with no space (#1701) 2026-06-03 13:37:14 +09:00
test_llm_core_streaming.py fix(llm): guard against null arguments in streaming tool-call accumulator (#2923) 2026-06-05 20:57:36 +02:00
test_llm_core_system_msg_missing_content.py fix: degrade missing/None content key in system messages to empty string (#2570) 2026-06-05 00:10:11 +02:00
test_llm_core_temperature.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_llm_core_usage_finish_delta.py fix: SSE stream parser crashes with NoneType on providers sending null choice/usage/tc entries (#2389) 2026-06-04 13:53:10 +01:00
test_lmstudio_discovery.py Discover LM Studio via host/port scanning and native-API fingerprint (#1126) 2026-06-02 23:04:58 +09:00
test_lmstudio_vision.py Use LM Studio-reported vision capability for image passthrough (#1130) 2026-06-02 23:01:04 +09:00
test_local_endpoint_api_key_js.py Models: allow API keys for local endpoints 2026-06-02 20:36:54 +09:00
test_local_endpoint_js.py fix: don't bill self-hosted models reached by a container/service hostname (#596) 2026-06-02 11:47:58 +09:00
test_logs_cli_resolve_nonstring.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_loop_breaker_runaway.py fix(agent): don't abort legitimate tool batches as runaway loops (#3183) 2026-06-07 16:16:17 +02:00
test_mail_cli_read_empty_fetch.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_mail_cli_recipients.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_manage_notes_owner_gate.py Tighten manage notes owner checks (#3002) 2026-06-07 12:50:10 +02:00
test_manage_settings_token_budget.py fix: agent_input_token_budget wrongly treated as a secret and unsettable from chat (#1294) 2026-06-03 01:53:47 +09:00
test_markdown_dom_xss_helpers.py Harden markdown raw HTML sanitization (#2497) 2026-06-04 20:46:10 +02:00
test_markdown_rendering_js.py fix(markdown): avoid autolinking dotted imports (#2295) 2026-06-05 02:57:20 +02:00
test_markdown_table_row_js.py Ignore non-string markdown table rows (#1648) 2026-06-03 14:17:02 +09:00
test_markitdown_format_nonstring.py fix: is_markitdown_format crashes on a non-string path (#1618) 2026-06-03 09:00:10 +09:00
test_markitdown_runtime.py Add optional markitdown extraction for Office/EPUB documents (#766) 2026-06-02 11:28:52 +09:00
test_match_model_key_js.py fix: model cost/info matches first substring key (gpt-4o-mini billed as gpt-4o) (#1439) 2026-06-04 03:05:37 +01:00
test_mcp_cache_invalidation.py fix(mcp): invalidate tool prompt cache on connect/disconnect/error (#1235) 2026-06-03 00:49:29 +09:00
test_mcp_cli_env_serialize.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_mcp_cli_json.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_mcp_common_truncate.py fix: shared MCP truncate() crashes on None/non-string tool output (#1605) 2026-06-03 08:35:54 +09:00
test_mcp_email_decode_header_spaces.py Decode email headers without injected spaces 2026-06-03 13:45:33 +09:00
test_mcp_manager.py feat(mcp): add Streamable HTTP transport with OAuth 2.0 (#1033) 2026-06-05 02:40:52 +02:00
test_mcp_oauth.py feat(mcp): add Streamable HTTP transport with OAuth 2.0 (#1033) 2026-06-05 02:40:52 +02:00
test_mcp_param_hint_hardening.py fix(mcp): sanitize and cap rendered MCP tool param hints (#2682) 2026-06-05 03:00:22 +02:00
test_mcp_reconnect_args.py fix: MCP reconnect via tool passes only server_id to connect_server (#1385) 2026-06-03 03:46:07 +09:00
test_mcp_tool_params_in_prompt.py fix(mcp): expose MCP tool input parameters to the agent 2026-06-04 12:51:31 +00:00
test_memory_bullet_extraction.py Fix memory bullet extraction in service copy 2026-06-03 13:41:46 +09:00
test_memory_cli_rows.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_memory_extract_chat_nondict.py fix: chat memory extraction crashes on a non-dict message (#1749) 2026-06-03 13:25:48 +09:00
test_memory_extractor_rows.py Skip invalid memory extractor rows (#1535) 2026-06-03 14:07:00 +09:00
test_memory_extractor_vector_cross_tenant.py Stub llm_core via monkeypatch.setitem so the cross-tenant test does not leak its fake into later test modules 2026-06-05 00:04:15 +01:00
test_memory_extractor_vector_degraded.py Update degraded-vector dedup test for owner-scoped vector match 2026-06-04 23:45:13 +01:00
test_memory_fallback_dislike.py fix(memory): record dislikes as dislikes, not preferences (#2435) 2026-06-07 16:36:07 +02:00
test_memory_imports.py refactor(memory): canonicalize memory imports (#50) 2026-06-04 05:31:15 +01:00
test_memory_provider.py feat(memory): add provider interface (#72) 2026-06-04 16:26:11 +01:00
test_memory_recall_nondict_rows.py fix: memory recall crashes on a non-dict row from the vector store (#1705) 2026-06-03 13:35:09 +09:00
test_memory_routes_session_owner.py fix(memory): owner-scope memory route session access 2026-06-03 23:13:56 +01:00
test_memory_validate_entries_nondict.py fix: memory entry validation crashes on a non-dict row from memory.json (#1691) 2026-06-03 13:38:02 +09:00
test_merge_last_assistant_rows.py fix: merge-last-assistant deletes tool/system rows from the DB (history desync) (#1929) 2026-06-04 19:47:08 +02:00
test_migrate_faiss_to_chroma.py Skip invalid FAISS migration JSON (#1547) 2026-06-03 14:11:49 +09:00
test_modal_dock_composer_clearance.py fix(ui): keep minimized windows above composer (#1197) 2026-06-02 23:31:09 +09:00
test_model_context.py fix(models): stabilize proxy endpoint refresh behavior 2026-06-04 04:56:11 +01:00
test_model_discovery_status.py Reject invalid Tailscale discovery JSON (#1556) 2026-06-03 14:11:31 +09:00
test_model_helper_owner_scope.py Scope model helper endpoint resolution (#3007) 2026-06-07 12:40:23 +02:00
test_model_name_tooltip.py Add hover tooltips for clipped model names (#1982) (#1985) 2026-06-07 19:23:44 +02:00
test_model_routes.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_model_sort_js.py Ignore invalid model sort inputs (#1653) 2026-06-03 14:16:52 +09:00
test_new_chat_clears_input.py Clear the composer draft when entering the New Chat / welcome state (#1408) 2026-06-03 04:07:31 +09:00
test_new_chat_model_preference.py Chat: prefer active model for new desktop chats 2026-06-02 21:00:50 +09:00
test_nix_upload_text.py fix: treat Nix files as readable uploads (#2249) 2026-06-04 12:06:24 +02:00
test_note_reminder_fire_scope.py Harden note reminder dispatch ownership (#2999) 2026-06-07 12:52:27 +02:00
test_notes_cli_items.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_notes_dom_xss_helpers.py Guard image and QR DOM attributes (#2500) 2026-06-04 20:51:23 +02:00
test_notes_select_esc_listener_js.py fix(notes): track + remove the select-mode Esc keydown listener so it doesn't leak per open (#2792) 2026-06-05 16:25:05 +02:00
test_notes_update_due_date.py Notes: parse natural-language due dates on update 2026-06-02 20:51:16 +09:00
test_null_owner_gates.py fix(tests): align gallery owner filter null-user expectation 2026-06-04 18:39:45 +01:00
test_odysseus_dispatcher.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_og_image_extraction.py fix: source thumbnails dropped for http-only og:image URLs (#667) 2026-06-02 11:41:33 +09:00
test_ollama_port_detection.py Add Ollama port path detection regressions (#883) 2026-06-02 12:24:18 +09:00
test_ordinal_suffix_js.py fix: monthly schedule label shows 21th/22th/31th (ordinal suffix for days >20) (#1577) 2026-06-03 08:57:47 +09:00
test_owned_document_query.py fix: owner-less document query passes bare False to SQLAlchemy filter() (#1281) 2026-06-03 01:20:43 +09:00
test_parse_due_time_first.py fix(notes): handle time-first due_date phrases in parse_due_for_user (#3319) 2026-06-07 19:15:38 +02:00
test_pdf_runtime.py Show a clear message when PyMuPDF is missing 2026-06-01 18:27:17 +09:00
test_personal_cli_rows.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_personal_dir_symlink_escape.py fix: personal-docs path confinement used abspath, allowing symlink escape (#1728) 2026-06-03 13:29:57 +09:00
test_personal_docs_exclusions.py Docs: respect path boundary when clearing exclusions 2026-06-02 20:35:44 +09:00
test_personal_docs_keyword_nondict.py Skip malformed personal keyword index rows 2026-06-03 13:42:05 +09:00
test_personal_docs_lists.py Save only string personal doc paths (#1566) 2026-06-03 08:37:29 +09:00
test_personal_docs_office_index.py Add optional markitdown extraction for Office/EPUB documents (#766) 2026-06-02 11:28:52 +09:00
test_personal_docs_pdf_index.py Fix chat stream recovery and PDF library indexing (#468) 2026-06-01 22:33:35 +09:00
test_personal_docs_state_store.py Ignore invalid personal docs state (#1401) 2026-06-03 04:02:16 +09:00
test_personal_upload_isolation.py Scope personal RAG uploads by owner (#446) 2026-06-01 22:36:53 +09:00
test_personal_upload_privilege.py fix(personal): require document privilege for rag upload (#2990) 2026-06-07 12:56:53 +02:00
test_plan_mode.py feat: Add plan mode to the chat agent (#638) 2026-06-05 16:32:25 +02:00
test_platform_compat.py fix(platform): Improve WSL SSH remote compatibility (#3316) 2026-06-08 00:33:50 +02:00
test_popup_opener_isolation_js.py Isolate HTML popup openers (#2501) 2026-06-04 20:52:41 +02:00
test_pr_blocker_audit.py tools: add read-only PR blocker audit helper 2026-06-04 12:51:48 +01:00
test_prefs_atomic_write.py Persist user prefs atomically (#1840) 2026-06-04 03:55:22 +01:00
test_prefs_routes.py Ignore non-object prefs JSON (#1257) 2026-06-03 14:12:45 +09:00
test_prefs_single_user_no_clobber.py fix: disabling auth wipes all users' preferences on next pref save (#1764) 2026-06-03 13:23:50 +09:00
test_preset_cli_invalid_entries.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_preset_cli_set_corrupt_entry.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_preset_cli_store.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_preset_fill_missing_defaults.py Presets: fill missing built-in defaults on load 2026-06-02 20:32:08 +09:00
test_preset_local_storage_js.py Keep presets loading with bad local state (#1417) 2026-06-03 04:09:28 +09:00
test_preset_store_shape.py Fall back from invalid preset stores (#1402) 2026-06-03 14:12:31 +09:00
test_promote_image_fields.py fix(images): render agent-generated images in chat (#2809) 2026-06-05 13:04:33 +02:00
test_prompt_security.py fix(security): harden untrusted_context_message against delimiter spoofing (#3086) 2026-06-07 22:15:50 +01:00
test_provider_classification.py Add provider classification and upstream-error tests 2026-06-02 20:42:43 +09:00
test_provider_detection.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_provider_device_flow_js.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_provider_endpoints.py Add provider endpoint resolver tests 2026-06-02 12:53:50 +09:00
test_providers_mixtral_logo_js.py fix: Mixtral and Ministral models render with no provider logo (#1640) 2026-06-03 14:23:21 +09:00
test_public_blocked_tool_nonstring.py fix: is_public_blocked_tool crashes on a truthy non-string tool name (#1620) 2026-06-03 14:11:14 +09:00
test_question_type_detection.py fix: research query misclassifies 'whatsapp'/'however' as questions (#1247) 2026-06-03 01:10:06 +09:00
test_rag_keyword_fallback_owner.py fix: RAG keyword fallback leaked owner-less documents across users (#1722) 2026-06-03 13:31:33 +09:00
test_rag_manager_owner_compat.py fix(rag): forward owner through manager wrapper (#2991) 2026-06-07 12:56:57 +02:00
test_rag_remove_directory_scope.py Fix RAG remove_directory wiping the entire shared collection (#1660) (#1734) 2026-06-03 13:29:51 +09:00
test_rag_server_directory_nonstring.py fix: rag_server add/remove_directory crashes on a non-string directory arg (#1614) 2026-06-03 08:36:45 +09:00
test_rag_vector_id_stability.py fix(tests): use current python for rag id stability (#1817) 2026-06-04 03:49:59 +01:00
test_rate_limiter.py Odysseus v1.0 2026-05-31 23:58:26 +09:00
test_readiness.py feat: add /api/ready readiness probe (DB, data dir, local-first) (#1200) 2026-06-02 23:33:22 +09:00
test_readme_ascii_fenced.py Wrap the README banner in a code fence so it renders as typed (#1403) 2026-06-03 03:42:01 +09:00
test_rename_user_case_insensitive.py refactor(tests): reuse import-state helper in auth tests 2026-06-05 11:10:41 +01:00
test_rename_user_token_cache.py fix: renaming a user leaves their API tokens resolving to the old owner (#1932) 2026-06-04 20:37:59 +02:00
test_replace_messages_multimodal.py refactor(tests): add temp sqlite helper (#2930) 2026-06-07 23:44:16 +02:00
test_reply_all_cc_nonstring_js.py fix: reply-all Cc builder crashes on a non-string To or Cc field (#1700) 2026-06-03 13:37:22 +09:00
test_reply_recipients_js.py fix: reply-all Cc's the user's own other addresses (multi-account) (#672) 2026-06-02 11:42:20 +09:00
test_research_chat_stream_owner.py fix: pass owner to start_research in chat stream path (#1265) 2026-06-03 02:32:38 +09:00
test_research_cli_preview.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_research_cli_status_filter.py Research CLI: alias --status complete to the stored done value (#2515) 2026-06-05 08:50:33 +01:00
test_research_cli_store.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_research_endpoint_owner_scope.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_research_handler_path_confinement.py Constrain research handler JSON paths (#2846) 2026-06-05 13:20:02 +02:00
test_research_handler_raw_nondict.py fix: a non-dict finding silently drops all raw research findings (#1739) 2026-06-03 13:29:29 +09:00
test_research_handler_sources_nondict.py fix: research source extraction crashes on a non-dict finding (#1714) 2026-06-03 13:34:40 +09:00
test_research_owner_scope_routes.py refactor(constants): single source of truth for data dir (#3368) 2026-06-08 09:58:52 +02:00
test_research_probe_errors.py Surface deep research probe errors (#1086) 2026-06-02 22:51:25 +09:00
test_research_query_fallback.py Deep research: don't treat a bare 'yes' as the research topic (#858) 2026-06-02 11:30:53 +09:00
test_research_report_read.py Route "read that report" to manage_research instead of the HTML render (#1375) 2026-06-03 03:24:09 +09:00
test_research_service.py Skip invalid research service sources (#1583) 2026-06-03 08:57:09 +09:00
test_research_session_id_validation.py fix(research): validate session_id to block path traversal 2026-06-01 23:25:38 +01:00
test_research_source_link_xss.py Whitelist research source links (#2499) 2026-06-04 20:41:35 +02:00
test_research_utils.py fix: deep research discards valid sources mentioning cookies/copyright (#481) 2026-06-01 22:26:37 +09:00
test_research_utils_low_quality_nonstring.py Treat non-string research summaries as low quality 2026-06-03 13:42:24 +09:00
test_reserved_username_admin_escalation.py refactor(tests): reuse import-state helper in auth manager tests 2026-06-05 11:24:55 +01:00
test_resolve_endpoint_fallbacks.py Add resolve_endpoint fallback chain regressions (#890) 2026-06-02 12:24:50 +09:00
test_resolve_session_auth_chatgpt.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_resolve_upload_path_nondict.py fix: _resolve_user_upload_path crashes on a non-dict resolve_upload result (#1715) 2026-06-03 13:34:33 +09:00
test_review_regressions.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_rewrite_persist_column.py fix(tests): add endpoint URLs to remaining session fixtures 2026-06-04 03:14:43 +01:00
test_sanitize_multimodal_merge.py fix: merging consecutive user messages corrupts multimodal (image) content (#1277) 2026-06-03 01:21:57 +09:00
test_schedule_email_offset_normalization.py Normalize scheduled email offsets before storage 2026-06-03 13:44:18 +09:00
test_scheduler_restart_doublefire.py Replace task scheduler utcnow calls (#1456) 2026-06-03 14:14:30 +09:00
test_scheduler_scheduled_time_validation.py fix(scheduler): fail closed on malformed scheduled_time instead of 500 (#1410) 2026-06-03 14:12:07 +09:00
test_search_analytics_defaults.py refactor(search): make src analytics a service shim (#2264) 2026-06-04 18:57:24 +02:00
test_search_cache_invalidation.py Fix invalidate_search_cache using a key that never matches stored entries (#852) 2026-06-02 10:53:33 +09:00
test_search_config_no_key_leak.py Stop GET /api/search/config from leaking the Brave API key (#1661) (#1750) 2026-06-03 13:24:17 +09:00
test_search_config_provider_key.py Report provider-specific search API keys correctly (#1202) 2026-06-02 23:37:15 +09:00
test_search_content_block_source_index.py fix: web search content blocks numbered by fetch completion order break citations (#1672) 2026-06-03 14:22:55 +09:00
test_search_content_extraction_parity.py fix(search): catch HTTPStatusError so 403/404 URLs degrade gracefully instead of 500 (#2203) 2026-06-08 01:09:21 +01:00
test_search_content_url_guards.py chore: deduplicate src/search modules (cache, content, query) into shims (#2506) 2026-06-04 18:10:55 +02:00
test_search_module_consolidation.py chore: deduplicate src/search modules (cache, content, query) into shims (#2506) 2026-06-04 18:10:55 +02:00
test_search_provider_json.py fix(search): degrade to empty results on non-JSON provider responses (#1129) (#1352) 2026-06-03 14:24:23 +09:00
test_search_query.py Fix year extraction in research queries 2026-06-01 23:09:41 +09:00
test_search_query_entities_nonstring.py fix: _extract_entities crashes on a non-string query (#1724) 2026-06-03 13:30:28 +09:00
test_search_query_nonstring.py fix: search query helpers crash on a non-string query (#1604) 2026-06-03 08:36:01 +09:00
test_search_ranking.py Reapply "Merge branch 'main' of github.com:pewdiepie-archdaemon/odysseus" 2026-06-03 22:47:00 +09:00
test_search_ranking_recency.py Reapply "Merge branch 'main' of github.com:pewdiepie-archdaemon/odysseus" 2026-06-03 22:47:00 +09:00
test_search_ranking_sports_substring.py fix: sports-hint ranking penalty fires on 'transport'/'passport' substrings (#1473) 2026-06-03 14:23:52 +09:00
test_search_ranking_subject_substring.py Word-boundary match for snippet and subject-term ranking (#1473 follow-up) (#2556) 2026-06-05 08:04:31 +01:00
test_search_service_nondict_rows.py fix(tests): update search service mock to match current API signature (#2334) 2026-06-04 14:19:51 +01:00
test_searchservice_search_call.py fix: SearchService.search() calls comprehensive_web_search incorrectly (broken public API) (#1720) 2026-06-03 13:33:56 +09:00
test_searxng_image_pinned.py Pin the SearXNG image so a broken :latest can't block startup (#1419) 2026-06-03 03:56:54 +09:00
test_security_headers_middleware.py fix(security): add HSTS and Permissions-Policy to SecurityHeadersMiddleware (#3081) 2026-06-07 04:58:33 +01:00
test_security_headers_pdf_preview.py fix(documents): restore PDF library metadata and preview (#2483) 2026-06-07 23:23:27 +02:00
test_security_regressions.py docs(email): clarify Outlook password auth failures 2026-06-08 15:32:16 +01:00
test_select_dropdown_theme_css.py Normalize native select option theming (#1178) 2026-06-02 23:09:15 +09:00
test_sender_signature_skip_roles.py fix: signature learning never skips support@/info@/admin@ senders (#1773) 2026-06-03 13:22:52 +09:00
test_serve_profiles.py Cookbook serve profiles and engine filter 2026-06-02 12:34:42 +09:00
test_service_search_provider_guards.py Search: consolidate core and provider implementations 2026-06-02 21:02:26 +09:00
test_services_research_low_quality_sources.py fix: services research lists junk no-content pages as cited sources (#1669) 2026-06-03 14:22:58 +09:00
test_services_search_analytics_defaults.py Merge search analytics defaults in services copy 2026-06-03 13:45:07 +09:00
test_session_context_excludes_slash.py fix: exclude slash-command/setup messages from LLM context (#2634) (#2640) 2026-06-04 21:42:23 +02:00
test_session_endpoint_owner_scope.py Harden session endpoint owner scope (#1308) 2026-06-03 02:40:22 +09:00
test_session_export_filename.py fix: _sanitize_export_filename crashes on a non-string session name (#1607) 2026-06-03 08:35:47 +09:00
test_session_export_nonstring_content.py Fix session export 500 on multimodal/None message content (#1984) 2026-06-04 12:53:44 +01:00
test_session_ghost_delete.py allow user who disable auth to use chat (#2548) 2026-06-05 22:54:19 +02:00
test_session_list_owner_scope.py fix(sessions): scope enrichment queries by owner, add LIMIT to auto_sort (#3350) 2026-06-07 21:32:21 +02:00
test_session_manager_cleanup.py Fix session cleanup cutoff timezone (#2488) 2026-06-05 09:52:34 +02:00
test_session_manager_persist_guard.py Guard session message persistence after delete (#1451) 2026-06-03 14:24:01 +09:00
test_session_mode_helpers.py Fix database stubs in regression tests (#301) 2026-06-01 16:55:09 +09:00
test_session_owner_attribution.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_session_search.py feat(search): unify session transcript search (#2877) 2026-06-05 18:08:31 -06:00
test_sessions_cli.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_settings_error_paths.py fix(settings): catch PermissionError in load_settings + error-path tests (#1570) 2026-06-03 14:23:27 +09:00
test_settings_scrub.py Harden note reminder dispatch ownership (#2999) 2026-06-07 12:52:27 +02:00
test_settings_store_shape.py Fall back from invalid settings stores (#1416) 2026-06-03 03:53:05 +09:00
test_setup_admin_user.py refactor(constants): single source of truth for data dir (#3368) 2026-06-08 09:58:52 +02:00
test_setup_device_auth_static.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_shell_routes.py feat(platform): Add support for APFEL as part of the dependencies and models for the Cookbook. (#2657) 2026-06-07 17:28:02 +02:00
test_shell_service.py fix: use running loop for shell stream deadlines (#1694) 2026-06-03 13:37:46 +09:00
test_signature_cli_export.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_signature_fold_js.py Ignore non-string signature fold metadata (#1655) 2026-06-03 14:16:48 +09:00
test_signature_fold_self_closing_br_js.py fix: signature delimiter fold misses self-closing <br/> breaks (#1774) 2026-06-03 13:22:46 +09:00
test_signature_route_hardening.py Constrain signature uploads to PNG data (#2844) 2026-06-05 13:17:43 +02:00
test_signature_settings_dom_xss.py Constrain signature uploads to PNG data (#2844) 2026-06-05 13:17:43 +02:00
test_skill_extractor_json.py fix(skills): tolerate a stray brace before the JSON in skill extraction (#2200) 2026-06-07 16:54:36 +02:00
test_skill_extractor_rows.py Skip invalid skill extractor rows (#1546) 2026-06-03 14:06:53 +09:00
test_skill_extractor_stray_brace.py fix(skill-extractor): walk all brace candidates so stray braces in prose do not swallow valid JSON (#2205) 2026-06-07 23:31:12 +01:00
test_skill_importer.py feat(skills): import SKILL.md bundles from public GitHub URLs (#2576) 2026-06-05 19:48:23 +02:00
test_skill_index_prompt_injection.py fix(agent-loop): wrap matched skills + skill index in untrusted user-role message (#788) 2026-06-02 11:15:45 +09:00
test_skill_save_no_rename.py fix(skills): markdown save must not rename the skill, so delete keeps working (#1333) (#1365) 2026-06-03 03:16:11 +09:00
test_skills_cli_preview.py refactor(tests): finish shared CLI loader adoption 2026-06-05 06:00:05 +01:00
test_skills_cli_rows.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_skills_delete_owner.py Skills: delete owner-scoped skills with owner 2026-06-02 20:28:36 +09:00
test_skills_manager_owner_isolation.py Scope skills usage by owner (#1312) 2026-06-03 02:27:43 +09:00
test_skills_routes_nondict.py fix: skill test-task / precision helpers crash on a non-dict skill (#1638) 2026-06-03 08:59:24 +09:00
test_skills_routes_owner_update.py Fix owner-scoped skill updates (#1240) 2026-06-03 00:42:56 +09:00
test_skills_tag_token_match.py fix: skill retrieval boosts on tag substrings (e.g. 'ai' tag for any 'email' query) (#1406) 2026-06-03 14:24:11 +09:00
test_slash_autocomplete_static.py feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
test_snap_other_layers_nonarray_js.py fix: computeSnap throws when ctx.otherLayers is not an array (#1716) 2026-06-03 13:34:25 +09:00
test_speech_service_toggles.py Honor disabled speech service toggles (#814) 2026-06-02 10:44:39 +09:00
test_split_chunks_no_duplicate_tail.py fix(tests): use non-repeating split chunk fixture 2026-06-04 18:11:42 +01:00
test_sqlite_foreign_keys.py refactor(tests): centralize fake database import-state cleanup 2026-06-05 12:27:44 +01:00
test_src_search_query_nonstring.py chore: deduplicate src/search modules (cache, content, query) into shims (#2506) 2026-06-04 18:10:55 +02:00
test_streaming_segmenter_js.py fix(chat): stop code-block button flicker during streaming (#3023) 2026-06-06 04:08:54 -06:00
test_strip_reasoning_prose_dataloss.py fix: _strip_reasoning_prose discards the answer when reasoning trails it (#1643) 2026-06-03 14:23:15 +09:00
test_strip_think.py fix: normalize Gemma 4 thought-channel output (#2224) 2026-06-04 19:26:58 +02:00
test_stt_leak.py STT: clean temp audio files on transcription failure 2026-06-02 20:43:24 +09:00
test_task_chain_owner_scope.py Enforce task chain owner scope (#3006) 2026-06-07 12:43:43 +02:00
test_task_scheduler_cancel.py Tasks: clean up queued cancellation state 2026-06-02 20:51:21 +09:00
test_task_scheduler_session_delivery.py refactor(tests): centralize fake database import-state cleanup 2026-06-05 12:27:44 +01:00
test_task_session_folder.py feat(tasks): assign folder='Tasks' at creation + backfill migration (#2834) 2026-06-07 15:33:17 +02:00
test_tasks_cli_preview.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_teacher_eval_nonstring_reply.py fix: evaluate_turn_regex crashes on a non-string agent_reply (#1723) 2026-06-03 13:31:26 +09:00
test_theme_cli_store.py refactor(tests): reuse CLI loader in more tests (#2571) 2026-06-05 02:42:10 +01:00
test_tls_overrides_scope.py Support extra CA bundle for private-CA LLM providers (#769) 2026-06-04 13:18:50 +01:00
test_tool_index_keyword_boundaries.py fix(tests): restore Python CI baseline regressions 2026-06-05 10:31:38 +01:00
test_tool_parsing_nonstring.py fix: tool-block parsing crashes on a non-string input (#1628) 2026-06-03 08:59:42 +09:00
test_tool_path_confinement.py fix(tools): strict path confinement with sensitive-subpath deny list (#1072) 2026-06-02 23:13:30 +09:00
test_tool_policy.py fix(agent): enforce guide-only tool policy (#3088) 2026-06-06 18:48:24 -06:00
test_tool_rag_keyword_hints.py Don't force-include the email toolset on every "tell me" query (#1707) (#1735) 2026-06-03 13:33:43 +09:00
test_tool_support_heuristic.py Fix Ollama agent single-token responses (#1591) 2026-06-04 11:45:10 +01:00
test_topic_analyzer.py refactor(tests): centralize fake database import-state cleanup 2026-06-05 12:27:44 +01:00
test_totp_failclosed.py fix: 2FA bypassed when enabled but TOTP secret is missing (fail-open) (#1286) 2026-06-03 01:26:47 +09:00
test_truncate_message_count_regression.py Fix truncate_messages persisting an inflated message_count (#2052) 2026-06-04 21:19:16 +02:00
test_tts_cache_stats.py TTS: include mp3 files in cache stats 2026-06-02 20:43:29 +09:00
test_tts_speed_malformed.py fix(tts): tolerate a malformed tts_speed instead of 500-ing (#1450) 2026-06-03 14:12:03 +09:00
test_ui_control_rag_toggle.py fix: ui_control rejects the advertised rag toggle (#1763) 2026-06-03 13:24:00 +09:00
test_unknown_tool_calls.py fix(agent): map native google_search and surface empty rounds 2026-06-02 12:57:45 +09:00
test_update_database_script.py Remove duplicate update database body (#1584) 2026-06-03 08:57:03 +09:00
test_update_plan_tool.py feat: Add plan mode to the chat agent (#638) 2026-06-05 16:32:25 +02:00
test_upload_error_surfaced.py Surface upload failures instead of silently dropping the files (#1425) 2026-06-03 04:12:23 +09:00
test_upload_handler_atomicity.py Ignore stale duplicate upload rows (#1256) 2026-06-03 00:59:01 +09:00
test_upload_id_extension.py fix: uploads with _ or - in the extension become permanently unreadable (#1756) 2026-06-03 13:28:45 +09:00
test_upload_id_validation.py fix: uploaded files with no extension become permanently unresolvable (#1275) 2026-06-03 01:16:30 +09:00
test_upload_multifile.py Fix multi-file uploads tripping the per-IP concurrency guard (#1346) (#1362) 2026-06-03 04:04:19 +09:00
test_upload_routes_owner_scope.py Constrain upload paths to upload root (#2825) 2026-06-05 13:15:23 +02:00
test_url_safety.py fix: SSRF hardening for the custom embedding endpoint URL (#132) (#1206) 2026-06-02 23:46:33 +09:00
test_user_time.py Fix calendar routing and user-local time context (#408) 2026-06-04 13:20:04 +01:00
test_vault_password_not_in_argv.py Keep Bitwarden unlock password off argv (#1311) 2026-06-03 02:13:51 +09:00
test_venice_hosts.py Treat Venice as a tool-capable SOTA cloud provider (#1173) 2026-06-02 23:03:46 +09:00
test_vision_model_detection.py Recognize gemma3/llama4/mistral-small3.1+/multimodal as vision models (#1430) 2026-06-03 04:17:40 +09:00
test_vision_owner_scope.py Scope vision model resolution by owner (#3009) 2026-06-07 12:39:02 +02:00
test_visual_report.py Fix visual report chapter navigation (#505) 2026-06-01 22:26:13 +09:00
test_visual_report_icon_url.py fix: visual report drops photos whose URL slug contains icon or logo (#1685) 2026-06-03 14:22:45 +09:00
test_visual_report_nonstring.py fix: visual_report markdown helpers crash on a non-string input (#1633) 2026-06-03 14:06:35 +09:00
test_web_search_time_filter.py fix(tool-schemas): preserve web_search time_filter through native tool-call conversion (#2757) 2026-06-05 08:00:59 +01:00
test_webhook_cli_mask.py refactor(tests): add shared CLI test helpers 2026-06-04 15:44:25 +01:00
test_webhook_sanitize_error_ipv6.py fix(webhooks): redact IPv6 addresses in sanitized error messages (#3038) 2026-06-07 04:55:33 +01:00
test_webhook_ssrf_resilience.py fix(tests): make webhook SSRF test clean-worktree deterministic 2026-06-05 08:16:28 +01:00
test_webhook_trigger_auth_exempt.py Exempt task webhook trigger from session auth (#784) 2026-06-02 11:23:40 +09:00
test_windows_update_script.py Windows: add Docker update script 2026-06-02 20:45:32 +09:00
test_workspace_confine.py feat: Add workspace: confine agent tools to a folder (#1103) 2026-06-05 00:06:37 +02:00
test_youtube_comments_timeout.py YouTube: enforce comment fetch timeout while waiting 2026-06-02 20:44:24 +09:00
test_youtube_extract_id_nonstring.py fix: extract_youtube_id crashes on a non-string url instead of returning None (#1689) 2026-06-03 13:38:11 +09:00
test_youtube_svc_comments_nondict.py fix: youtube (services) comment formatter crashes on a non-dict comment (#1746) 2026-06-03 13:29:01 +09:00
test_youtube_transcript_seg_nondict.py fix: youtube transcript formatter crashes on a non-dict segment (#1745) 2026-06-03 13:29:08 +09:00
TESTING_STANDARD.md docs(tests): define testing standard and taxonomy (#3372) 2026-06-08 01:15:47 +02:00

Test Suite Notes

Purpose

This file documents the shared test helpers and the review expectations that go with them. The suite is being refactored incrementally, so this is a working reference for that effort - not a claim that the suite is already fully organized. Read it before adding a new helper or before reviewing a PR that touches tests/helpers/.

For the broader rules - test taxonomy, determinism/isolation rules, the behavioral-vs-source-text policy, and helper/factory extraction rules - see TESTING_STANDARD.md. This file is the concrete helper reference; that file is the standard the refactor works toward.

Core principles

  • Keep PRs small and homogeneous: one kind of change per PR.
  • Prefer explicit local setup over hidden global fixtures.
  • Avoid expanding the root conftest.py unless absolutely necessary.
  • Do not mix file moves with logic changes in the same PR.
  • Do not weaken tests with skip/xfail just to make CI pass.
  • Validate the focused files you changed, plus any neighboring or order-sensitive groups they interact with.

Helper conventions

The helpers below live under tests/helpers/. They exist to remove repeated boilerplate that already appeared across multiple tests. Reach for one only when your test matches its intended use; do not stretch a helper to cover a new case.

tests.helpers.cli_loader.load_script

Use when a test needs to import a script under scripts/ without repeating SourceFileLoader / importlib.util boilerplate.

  • Intended for script/CLI tests that load a single file from scripts/.
  • Not for arbitrary package imports - use a normal import for those.
  • When migrating an existing test to it, keep the existing stubs and assertions unchanged. Any sys.modules stubs the script needs at import time must still be injected (e.g. via monkeypatch) before calling load_script.

tests.helpers.import_state.clear_module

Use when a test must drop one cached module and its parent-package attribute before a fresh import.

  • Clears sys.modules[name].
  • Clears the parent-package attribute when present.
  • Good replacement for local sys.modules.pop(...) + delattr(parent, child) blocks.

tests.helpers.import_state.preserve_import_state

Use when a test temporarily installs stubs into sys.modules and needs deterministic cleanup afterward.

  • Context manager: restores both sys.modules entries and parent-package attributes on exit (normal or exception).
  • Useful around module-level stubs or temporary imports.
  • Prefer narrow, explicit module names over broad ones.

tests.helpers.import_state.clear_fake_database_modules

Use only for the guarded fake/stub database cleanup pattern.

  • Preserves a real-looking core.database (one with a string __file__).
  • Removes a fake/stub core.database and the related src.database state.
  • Do not use as a general database reset fixture.

tests.helpers.import_state.clear_fake_endpoint_resolver_modules

Use only for the guarded fake/stub src.endpoint_resolver cleanup pattern.

  • Preserves real resolver modules (those with a truthy __file__).
  • Evicts fake/stub resolver modules and the dependent route modules that were cached against them.
  • Accepts explicit extra dependent module names to evict alongside the defaults.

tests.helpers.sqlite_db.make_temp_sqlite

Use for the repeated file-backed temp sqlite setup in tests.

  • Only constructs (SessionLocal, engine, tmpfile) from the repeated block.
  • Does not patch modules and does not clean up the temp file.
  • The caller must bind SessionLocal explicitly onto whatever module the code under test reads, and must keep the returned objects alive.
  • Do not use it as a general DB fixture framework.

What not to abstract yet

Some remaining patterns should stay as-is for now rather than being forced into helpers:

  • Large mixed files such as security/review regression files.
  • Setup-oriented sys.modules stub installers.
  • One-off custom module patching.
  • DB/session/route setup, until it has been audited separately.

Validation expectations

Run validation locally before opening or approving a PR. Practical checks:

  • git diff --check - catch whitespace and conflict-marker errors.
  • python3 -m py_compile <changed files> - confirm changed files compile.
  • Focused pytest on the changed test files.
  • pytest on neighboring or order-sensitive test groups that share import state with the changed files.
  • grep for the old boilerplate when replacing it, to confirm no stragglers remain.
  • A fresh audit worktree when changing the helpers themselves, so stale __pycache__ or import state cannot mask a regression.

Current roadmap

  1. Import-state cleanup - complete.
  2. Document helper conventions (this file).
  3. Audit fake DB / SessionLocal / route setup duplication.
  4. Add tiny helpers only when the repeated semantics are clear.
  5. Start low-risk file moves only after helper conventions are documented.
  6. Avoid moving high-risk security/route regression files first.