[ "tests/test_analysis_service.py::TestAnalysisServiceConcurrency::test_default_max_concurrent", "tests/test_analysis_service.py::TestAnalysisServiceConcurrency::test_semaphore_initialized_with_max_concurrent", "tests/test_analysis_service.py::TestAnalysisServiceConcurrency::test_semaphore_limits_parallel_jobs", "tests/test_analysis_service.py::TestOnTaskDone::test_cancelled_task_marks_job_failed", "tests/test_analysis_service.py::TestOnTaskDone::test_exception_marks_job_failed", "tests/test_analysis_service.py::TestOnTaskDone::test_successful_task_does_not_mark_failed", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_create_analysis", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_create_analysis_document_not_found", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_create_analysis_empty_document_id", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_create_analysis_whitespace_document_id", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_create_analysis_with_partial_pipeline_options", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_create_analysis_with_pipeline_options", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_create_analysis_with_vlm_config", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_delete_analysis", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_delete_analysis_not_found", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_get_analysis", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_get_analysis_not_found", "tests/test_api_endpoints.py::TestAnalysisEndpoints::test_list_analyses", "tests/test_api_endpoints.py::TestDocumentEndpoints::test_delete_document", "tests/test_api_endpoints.py::TestDocumentEndpoints::test_delete_document_not_found", "tests/test_api_endpoints.py::TestDocumentEndpoints::test_get_document", "tests/test_api_endpoints.py::TestDocumentEndpoints::test_get_document_not_found", "tests/test_api_endpoints.py::TestDocumentEndpoints::test_list_documents", "tests/test_api_endpoints.py::TestDocumentEndpoints::test_preview_page_out_of_range", "tests/test_api_endpoints.py::TestDocumentEndpoints::test_upload_document", "tests/test_api_endpoints.py::TestDocumentEndpoints::test_upload_too_large", "tests/test_api_endpoints.py::TestHealthEndpoint::test_health", "tests/test_bbox.py::TestDegenerateBboxes::test_empty_bbox_is_not_mutated", "tests/test_bbox.py::TestDegenerateBboxes::test_inverted_lr_returns_empty", "tests/test_bbox.py::TestDegenerateBboxes::test_inverted_tb_topleft_returns_empty", "tests/test_bbox.py::TestDegenerateBboxes::test_point_bbox_returns_empty", "tests/test_bbox.py::TestDegenerateBboxes::test_zero_height_returns_empty", "tests/test_bbox.py::TestDegenerateBboxes::test_zero_width_returns_empty", "tests/test_bbox.py::TestPageFormats::test_a3_page", "tests/test_bbox.py::TestPageFormats::test_a4_page", "tests/test_bbox.py::TestPageFormats::test_landscape_page", "tests/test_bbox.py::TestPageFormats::test_legal_page", "tests/test_bbox.py::TestPrecision::test_bbox_at_page_bottom_right", "tests/test_bbox.py::TestPrecision::test_bbox_at_page_origin", "tests/test_bbox.py::TestPrecision::test_bottomleft_near_page_edge", "tests/test_bbox.py::TestPrecision::test_fractional_coordinates", "tests/test_bbox.py::TestPrecision::test_very_small_bbox", "tests/test_bbox.py::TestToTopleftList::test_bottomleft_origin_converted", "tests/test_bbox.py::TestToTopleftList::test_full_page_bbox_bottomleft", "tests/test_bbox.py::TestToTopleftList::test_full_page_bbox_topleft", "tests/test_bbox.py::TestToTopleftList::test_result_has_positive_dimensions", "tests/test_bbox.py::TestToTopleftList::test_topleft_origin_unchanged", "tests/test_bbox.py::TestToTopleftListStandard::test_bottomleft_origin_converted", "tests/test_bbox.py::TestToTopleftListStandard::test_full_page_bbox_bottomleft", "tests/test_bbox.py::TestToTopleftListStandard::test_full_page_bbox_topleft", "tests/test_bbox.py::TestToTopleftListStandard::test_result_has_positive_dimensions", "tests/test_bbox.py::TestToTopleftListStandard::test_topleft_origin_unchanged", "tests/test_chunking.py::TestAnalysisJobChunking::test_default_chunking_fields", "tests/test_chunking.py::TestAnalysisJobChunking::test_mark_completed_with_chunks", "tests/test_chunking.py::TestAnalysisJobChunking::test_mark_completed_without_chunks", "tests/test_chunking.py::TestChunkBbox::test_chunk_result_with_bboxes", "tests/test_chunking.py::TestChunkBbox::test_construction", "tests/test_chunking.py::TestChunkBbox::test_serializable", "tests/test_chunking.py::TestChunkBboxResponse::test_chunk_response_with_bboxes", "tests/test_chunking.py::TestChunkBboxResponse::test_serializes", "tests/test_chunking.py::TestChunkResponse::test_serializes_to_camel_case", "tests/test_chunking.py::TestChunkResult::test_defaults", "tests/test_chunking.py::TestChunkResult::test_full_values", "tests/test_chunking.py::TestChunkResult::test_serializable", "tests/test_chunking.py::TestChunkingOptions::test_custom_values", "tests/test_chunking.py::TestChunkingOptions::test_defaults", "tests/test_chunking.py::TestChunkingOptions::test_is_default", "tests/test_chunking.py::TestChunkingOptionsRequest::test_boundary_max_tokens", "tests/test_chunking.py::TestChunkingOptionsRequest::test_custom_values", "tests/test_chunking.py::TestChunkingOptionsRequest::test_defaults", "tests/test_chunking.py::TestChunkingOptionsRequest::test_invalid_chunker_type", "tests/test_chunking.py::TestChunkingOptionsRequest::test_max_tokens_too_high", "tests/test_chunking.py::TestChunkingOptionsRequest::test_max_tokens_too_low", "tests/test_chunking.py::TestCreateAnalysisWithChunking::test_create_with_chunking_options", "tests/test_chunking.py::TestCreateAnalysisWithChunking::test_create_without_chunking_options", "tests/test_chunking.py::TestCreateAnalysisWithChunking::test_response_includes_chunking_fields", "tests/test_chunking.py::TestRechunkEndpoint::test_rechunk_invalid_chunker_type", "tests/test_chunking.py::TestRechunkEndpoint::test_rechunk_no_document_json", "tests/test_chunking.py::TestRechunkEndpoint::test_rechunk_not_completed", "tests/test_chunking.py::TestRechunkEndpoint::test_rechunk_returns_bboxes", "tests/test_chunking.py::TestRechunkEndpoint::test_rechunk_success", "tests/test_chunking.py::TestRechunkRequest::test_parses", "tests/test_config.py::TestParsingMode::test_from_string", "tests/test_config.py::TestParsingMode::test_invalid_raises", "tests/test_config.py::TestParsingMode::test_values", "tests/test_config.py::TestResolveConfig::test_config_is_frozen", "tests/test_config.py::TestResolveConfig::test_defaults", "tests/test_config.py::TestResolveConfig::test_env_var_override", "tests/test_config.py::TestResolveConfig::test_none_values_use_defaults", "tests/test_config.py::TestResolveConfig::test_override_all", "tests/test_config.py::TestResolveConfig::test_override_mode", "tests/test_config.py::TestResolveConfig::test_override_ollama_model", "tests/test_config.py::TestResolveConfig::test_override_ollama_url", "tests/test_config.py::TestResolveConfig::test_per_request_overrides_env", "tests/test_document_service.py::TestCountPages::test_returns_none_on_error", "tests/test_document_service.py::TestCountPages::test_returns_page_count", "tests/test_document_service.py::TestDelete::test_delete_not_found_returns_false", "tests/test_document_service.py::TestDelete::test_delete_refuses_file_outside_upload_dir", "tests/test_document_service.py::TestDelete::test_delete_removes_file_and_records", "tests/test_document_service.py::TestGeneratePreview::test_raises_on_invalid_page", "tests/test_document_service.py::TestGeneratePreview::test_returns_png_bytes", "tests/test_document_service.py::TestUploadValidation::test_accepts_valid_pdf", "tests/test_document_service.py::TestUploadValidation::test_allows_pdf_under_page_limit", "tests/test_document_service.py::TestUploadValidation::test_rejects_non_pdf", "tests/test_document_service.py::TestUploadValidation::test_rejects_oversized_file", "tests/test_document_service.py::TestUploadValidation::test_rejects_too_many_pages", "tests/test_document_service.py::TestUploadValidation::test_unlimited_pages_when_zero", "tests/test_models.py::TestAnalysisJob::test_default_values", "tests/test_models.py::TestAnalysisJob::test_mark_completed", "tests/test_models.py::TestAnalysisJob::test_mark_failed", "tests/test_models.py::TestAnalysisJob::test_mark_running", "tests/test_models.py::TestAnalysisJob::test_status_transitions", "tests/test_models.py::TestAnalysisStatus::test_from_string", "tests/test_models.py::TestAnalysisStatus::test_values", "tests/test_models.py::TestDocument::test_custom_values", "tests/test_models.py::TestDocument::test_default_values", "tests/test_models.py::TestDocument::test_unique_ids", "tests/test_pipeline_options.py::TestAnalysisEndpointPipelineOptions::test_empty_pipeline_options_object_uses_defaults", "tests/test_pipeline_options.py::TestAnalysisEndpointPipelineOptions::test_full_pipeline_options", "tests/test_pipeline_options.py::TestAnalysisEndpointPipelineOptions::test_invalid_pipeline_option_type_rejected", "tests/test_pipeline_options.py::TestAnalysisEndpointPipelineOptions::test_no_pipeline_options_sends_none", "tests/test_pipeline_options.py::TestAnalysisEndpointPipelineOptions::test_partial_pipeline_options_merges_with_defaults", "tests/test_pipeline_options.py::TestAnalysisEndpointPipelineOptions::test_unknown_pipeline_option_ignored", "tests/test_pipeline_options.py::TestBuildConverter::test_all_options_combined", "tests/test_pipeline_options.py::TestBuildConverter::test_code_enrichment_enabled", "tests/test_pipeline_options.py::TestBuildConverter::test_defaults", "tests/test_pipeline_options.py::TestBuildConverter::test_formula_enrichment_enabled", "tests/test_pipeline_options.py::TestBuildConverter::test_generate_page_images", "tests/test_pipeline_options.py::TestBuildConverter::test_generate_picture_images", "tests/test_pipeline_options.py::TestBuildConverter::test_images_scale", "tests/test_pipeline_options.py::TestBuildConverter::test_ocr_disabled", "tests/test_pipeline_options.py::TestBuildConverter::test_picture_classification_enabled", "tests/test_pipeline_options.py::TestBuildConverter::test_picture_description_enabled", "tests/test_pipeline_options.py::TestBuildConverter::test_table_mode_accurate", "tests/test_pipeline_options.py::TestBuildConverter::test_table_mode_fast", "tests/test_pipeline_options.py::TestBuildConverter::test_table_structure_disabled", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_forwards_all_options_to_build_converter", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_uses_custom_converter_when_code_enrichment_on", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_uses_custom_converter_when_formula_enrichment_on", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_uses_custom_converter_when_generate_images_on", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_uses_custom_converter_when_images_scale_changed", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_uses_custom_converter_when_ocr_disabled", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_uses_custom_converter_when_picture_options_on", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_uses_custom_converter_when_table_mode_fast", "tests/test_pipeline_options.py::TestConvertDocumentRouting::test_uses_default_converter_with_all_defaults", "tests/test_pipeline_options.py::TestServiceForwardsPipelineOptions::test_create_passes_none_when_no_options", "tests/test_pipeline_options.py::TestServiceForwardsPipelineOptions::test_create_passes_pipeline_options_to_run", "tests/test_pipeline_options.py::TestServiceForwardsPipelineOptions::test_run_analysis_forwards_options_to_convert", "tests/test_pipeline_options.py::TestServiceForwardsPipelineOptions::test_run_analysis_marks_failed_on_error", "tests/test_pipeline_options.py::TestServiceForwardsPipelineOptions::test_run_analysis_uses_defaults_when_no_options", "tests/test_rate_limiter.py::TestClientBucket::test_add", "tests/test_rate_limiter.py::TestClientBucket::test_count_recent_filters_old_entries", "tests/test_rate_limiter.py::TestClientBucket::test_count_recent_keeps_all_when_within_window", "tests/test_rate_limiter.py::TestRateLimiterMiddleware::test_allows_requests_under_limit", "tests/test_rate_limiter.py::TestRateLimiterMiddleware::test_blocks_requests_over_limit", "tests/test_rate_limiter.py::TestRateLimiterMiddleware::test_health_excluded_from_limit", "tests/test_rate_limiter.py::TestRateLimiterMiddleware::test_window_resets", "tests/test_repos.py::TestAnalysisRepo::test_delete", "tests/test_repos.py::TestAnalysisRepo::test_delete_by_document", "tests/test_repos.py::TestAnalysisRepo::test_delete_nonexistent", "tests/test_repos.py::TestAnalysisRepo::test_find_all", "tests/test_repos.py::TestAnalysisRepo::test_find_by_id_not_found", "tests/test_repos.py::TestAnalysisRepo::test_insert_and_find_by_id", "tests/test_repos.py::TestAnalysisRepo::test_update_status", "tests/test_repos.py::TestAnalysisRepo::test_update_status_completed", "tests/test_repos.py::TestDocumentRepo::test_delete", "tests/test_repos.py::TestDocumentRepo::test_delete_nonexistent", "tests/test_repos.py::TestDocumentRepo::test_find_all", "tests/test_repos.py::TestDocumentRepo::test_find_by_id_not_found", "tests/test_repos.py::TestDocumentRepo::test_insert_and_find_by_id", "tests/test_repos.py::TestDocumentRepo::test_update_page_count", "tests/test_schemas.py::TestAnalysisResponse::test_populate_by_name", "tests/test_schemas.py::TestAnalysisResponse::test_serializes_to_camel_case", "tests/test_schemas.py::TestCreateAnalysisRequest::test_backward_compatible_with_only_document_id", "tests/test_schemas.py::TestCreateAnalysisRequest::test_optional_vlm_fields_default_to_none", "tests/test_schemas.py::TestCreateAnalysisRequest::test_parses_document_id", "tests/test_schemas.py::TestCreateAnalysisRequest::test_parses_with_pipeline_options", "tests/test_schemas.py::TestCreateAnalysisRequest::test_vlm_fields_set", "tests/test_schemas.py::TestDocumentResponse::test_optional_fields_default_to_none", "tests/test_schemas.py::TestDocumentResponse::test_serializes_to_camel_case", "tests/test_schemas.py::TestPipelineOptionsRequest::test_boundary_images_scale_accepted", "tests/test_schemas.py::TestPipelineOptionsRequest::test_custom_values", "tests/test_schemas.py::TestPipelineOptionsRequest::test_defaults", "tests/test_schemas.py::TestPipelineOptionsRequest::test_excessive_images_scale_rejected", "tests/test_schemas.py::TestPipelineOptionsRequest::test_invalid_table_mode_rejected", "tests/test_schemas.py::TestPipelineOptionsRequest::test_model_dump", "tests/test_schemas.py::TestPipelineOptionsRequest::test_negative_images_scale_rejected", "tests/test_schemas.py::TestPipelineOptionsRequest::test_zero_images_scale_rejected", "tests/test_schemas.py::TestToCamel::test_already_camel", "tests/test_schemas.py::TestToCamel::test_single_word", "tests/test_schemas.py::TestToCamel::test_three_words", "tests/test_schemas.py::TestToCamel::test_two_words", "tests/test_serve_converter.py::TestBuildFormData::test_custom_options", "tests/test_serve_converter.py::TestBuildFormData::test_default_options", "tests/test_serve_converter.py::TestConverterWiring::test_local_engine_builds_local_converter", "tests/test_serve_converter.py::TestConverterWiring::test_remote_engine_builds_serve_converter", "tests/test_serve_converter.py::TestConverterWiring::test_remote_engine_passes_api_key", "tests/test_serve_converter.py::TestExtractBbox::test_bottomleft_conversion", "tests/test_serve_converter.py::TestExtractBbox::test_empty_dict", "tests/test_serve_converter.py::TestExtractBbox::test_missing_coord_origin_defaults_topleft", "tests/test_serve_converter.py::TestExtractBbox::test_non_dict_returns_zeros", "tests/test_serve_converter.py::TestExtractBbox::test_topleft_passthrough", "tests/test_serve_converter.py::TestLabelMapping::test_known_labels", "tests/test_serve_converter.py::TestLabelMapping::test_unknown_label_defaults_to_text", "tests/test_serve_converter.py::TestMapItemType::test_missing_type_defaults_to_text", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[code-code]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[equation-formula]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[figure-picture]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[formula-formula]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[list_item-list]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[paragraph-text]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[picture-picture]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[section-header-section_header]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[section_header-section_header]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[table-table]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[text-text]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[title-title]", "tests/test_serve_converter.py::TestMapItemType::test_type_mapping[unknown_type-text]", "tests/test_serve_converter.py::TestParseResponse::test_bbox_as_list", "tests/test_serve_converter.py::TestParseResponse::test_empty_response", "tests/test_serve_converter.py::TestParseResponse::test_json_content_as_string", "tests/test_serve_converter.py::TestParseResponse::test_json_content_malformed_string_falls_back", "tests/test_serve_converter.py::TestParseResponse::test_minimal_response", "tests/test_serve_converter.py::TestParseResponse::test_multi_page", "tests/test_serve_converter.py::TestParseResponse::test_multi_page_response", "tests/test_serve_converter.py::TestParseResponse::test_no_json_content", "tests/test_serve_converter.py::TestParseResponse::test_response_with_body_elements", "tests/test_serve_converter.py::TestParseResponse::test_response_with_elements", "tests/test_serve_converter.py::TestParseResponse::test_tables_and_pictures", "tests/test_serve_converter.py::TestServeConverter::test_base_url_trailing_slash_stripped", "tests/test_serve_converter.py::TestServeConverter::test_build_conversion_options", "tests/test_serve_converter.py::TestServeConverter::test_headers_with_api_key", "tests/test_serve_converter.py::TestServeConverter::test_headers_without_api_key", "tests/test_serve_converter.py::TestServeConverterConvert::test_health_check_failure", "tests/test_serve_converter.py::TestServeConverterConvert::test_health_check_success", "tests/test_serve_converter.py::TestServeConverterConvert::test_http_error_raises", "tests/test_serve_converter.py::TestServeConverterConvert::test_successful_conversion", "tests/test_settings.py::TestSettingsDefaults::test_default_values", "tests/test_settings.py::TestSettingsDefaults::test_frozen", "tests/test_settings.py::TestSettingsFromEnv::test_cors_origins_split", "tests/test_settings.py::TestSettingsFromEnv::test_defaults_when_env_empty", "tests/test_settings.py::TestSettingsFromEnv::test_reads_env_vars" ]