============================= test session starts ==============================
platform linux -- Python 3.14.3, pytest-9.0.2, pluggy-1.6.0 -- /home/ark/dev/aw8s/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /home/ark/dev/aw8s
configfile: pyproject.toml
plugins: anyio-4.12.1, asyncio-1.3.0
asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collecting ... collected 49 items

tests/test_logs.py::TestLogViewAppendLines::test_append_lines_stores_and_writes PASSED [  2%]
tests/test_logs.py::TestLogViewSetLogs::test_set_logs_bulk PASSED        [  4%]
tests/test_logs.py::TestLogViewFollowToggle::test_f_toggles_follow PASSED [  6%]
tests/test_logs.py::TestLogViewFollowToggle::test_follow_controls_auto_scroll PASSED [  8%]
tests/test_logs.py::TestLogViewClear::test_clear_logs PASSED             [ 10%]
tests/test_logs.py::TestLogViewGoBack::test_escape_posts_go_back PASSED  [ 12%]
tests/test_logs.py::TestLogViewRefresh::test_r_posts_refresh PASSED      [ 14%]
tests/test_logs.py::TestLogViewSourceIndicator::test_default_source_is_empty_and_indicator_hidden PASSED [ 16%]
tests/test_logs.py::TestLogViewSourceIndicator::test_live_source_renders_green_indicator PASSED [ 18%]
tests/test_logs.py::TestLogViewSourceIndicator::test_archive_source_renders_yellow_indicator PASSED [ 20%]
tests/test_logs.py::TestLogViewSourceIndicator::test_history_source_renders_blue_indicator PASSED [ 22%]
tests/test_logs.py::TestLogViewSourceIndicator::test_resetting_to_empty_hides_indicator PASSED [ 24%]
tests/test_logs.py::TestLogViewSourceIndicator::test_archive_hides_follow_hint_in_header PASSED [ 26%]
tests/test_logs.py::TestLogViewSourceIndicator::test_history_hides_follow_hint_in_header PASSED [ 28%]
tests/test_logs.py::TestLogViewSourceIndicator::test_live_keeps_follow_hint_in_header PASSED [ 30%]
tests/test_logs.py::TestLogViewInlineError::test_render_error_appends_error_type_and_hint_to_lines PASSED [ 32%]
tests/test_logs.py::TestLogViewInlineError::test_render_error_works_with_empty_message PASSED [ 34%]
tests/test_logs.py::TestLogViewInlineError::test_render_error_writes_to_rich_log PASSED [ 36%]
tests/test_logs.py::TestStreamWorkflowLogs::test_yields_parsed_lines PASSED [ 38%]
tests/test_logs.py::TestStreamWorkflowLogs::test_strips_ansi_codes PASSED [ 40%]
tests/test_logs.py::TestStreamWorkflowLogs::test_handles_plain_text_lines PASSED [ 42%]
tests/test_logs.py::TestStreamWorkflowLogs::test_handles_disconnect PASSED [ 44%]
tests/test_logs.py::TestStreamWorkflowLogs::test_skips_blank_lines PASSED [ 46%]
tests/test_logs.py::TestStreamWorkflowLogs::test_terminal_workflow_forces_follow_false PASSED [ 48%]
tests/test_logs.py::TestStreamWorkflowLogs::test_terminal_empty_yields_archive_fallback PASSED [ 51%]
tests/test_logs.py::TestStreamWorkflowLogs::test_non_terminal_empty_does_not_yield_sentinel PASSED [ 53%]
tests/test_logs.py::TestStreamWorkflowLogs::test_read_timeout_yielded_as_sentinel PASSED [ 55%]
tests/test_logs.py::TestStreamWorkflowLogs::test_connect_error_yielded_as_sentinel PASSED [ 57%]
tests/test_logs.py::TestSearchBarToggle::test_slash_shows_search_bar PASSED [ 59%]
tests/test_logs.py::TestSearchBarToggle::test_escape_hides_search_bar PASSED [ 61%]
tests/test_logs.py::TestSearchBarToggle::test_follow_paused_during_search PASSED [ 63%]
tests/test_logs.py::TestSearchHighlightsMatches::test_typing_highlights_matching_lines PASSED [ 65%]
tests/test_logs.py::TestSearchHighlightsMatches::test_search_case_insensitive PASSED [ 67%]
tests/test_logs.py::TestSearchNavigation::test_n_navigates_forward PASSED [ 69%]
tests/test_logs.py::TestSearchNavigation::test_n_wraps_around PASSED     [ 71%]
tests/test_logs.py::TestSearchNavigation::test_shift_n_navigates_backward PASSED [ 73%]
tests/test_logs.py::TestSearchNavigation::test_n_no_op_with_no_matches PASSED [ 75%]
tests/test_logs.py::TestSearchNoMatches::test_no_matches_shows_zero PASSED [ 77%]
tests/test_logs.py::TestSearchClearsOnEscape::test_escape_clears_search_state PASSED [ 79%]
tests/test_logs.py::TestSearchStreamingInteraction::test_new_lines_match_during_search PASSED [ 81%]
tests/test_logs.py::TestSearchEdgeCases::test_empty_search_no_crash PASSED [ 83%]
tests/test_logs.py::TestSearchEdgeCases::test_search_rich_markup_chars PASSED [ 85%]
tests/test_logs.py::TestSearchEdgeCases::test_search_zero_lines PASSED   [ 87%]
tests/test_logs.py::TestGetNodeMainLog::test_returns_content_when_main_logs_artifact_present PASSED [ 89%]
tests/test_logs.py::TestGetNodeMainLog::test_returns_none_when_node_has_no_main_logs_artifact PASSED [ 91%]
tests/test_logs.py::TestGetNodeMainLog::test_returns_none_when_node_missing_from_status PASSED [ 93%]
tests/test_logs.py::TestGetNodeMainLog::test_artifact_endpoint_5xx_yields_log_fetch_result PASSED [ 95%]
tests/test_logs.py::TestArchiveFallbackRendering::test_workflow_level_concat_includes_node_headers PASSED [ 97%]
tests/test_logs.py::TestArchiveFallbackRendering::test_per_node_fallback_renders_archive_content PASSED [100%]

============================== 49 passed in 7.92s ==============================
