feat: implement HeadlessRenderer for terminal-free UI testing #324

Merged
freemo merged 3 commits from feature/m2-headless-renderer into master 2026-03-16 19:56:16 +00:00
Owner

Summary

  • Implements HeadlessRenderer class as drop-in replacement for Ncurses/Composite stages in tests
  • Captures rendered output in memory for UI testing without terminal dependency
  • Provides test helpers for Cucumber step definitions via HeadlessRendererHelper module

Key Features

  • window_content(window_name) - returns content array for a window
  • last_frame - returns hash of all window contents from last frame
  • frame_count - tracks total frames rendered
  • clear_history - resets all captured state
  • last_bar_update(bar_name) - convenience method for status bar assertions
  • content_includes?(window, text) and bar_equals?(bar, value, max) test helpers
  • Auto-detection via HeadlessRenderer.headless_environment? when TERM unset or HEADLESS=1

Testing

  • 24 unit test scenarios (all passing)
  • 4 integration test scenarios (all passing)

Closes #309

## Summary - Implements `HeadlessRenderer` class as drop-in replacement for Ncurses/Composite stages in tests - Captures rendered output in memory for UI testing without terminal dependency - Provides test helpers for Cucumber step definitions via `HeadlessRendererHelper` module ## Key Features - `window_content(window_name)` - returns content array for a window - `last_frame` - returns hash of all window contents from last frame - `frame_count` - tracks total frames rendered - `clear_history` - resets all captured state - `last_bar_update(bar_name)` - convenience method for status bar assertions - `content_includes?(window, text)` and `bar_equals?(bar, value, max)` test helpers - Auto-detection via `HeadlessRenderer.headless_environment?` when TERM unset or HEADLESS=1 ## Testing - 24 unit test scenarios (all passing) - 4 integration test scenarios (all passing) ## Related Closes #309
freemo force-pushed feature/m2-headless-renderer from 1761d434db to 9ea7759011
Some checks failed
CI / lint (pull_request) Failing after 14s
CI / unit_tests (pull_request) Failing after 14s
CI / integration_tests (pull_request) Failing after 17s
CI / build (pull_request) Has been skipped
2026-03-16 16:57:55 +00:00
Compare
freemo force-pushed feature/m2-headless-renderer from 9ea7759011
Some checks failed
CI / lint (pull_request) Failing after 14s
CI / unit_tests (pull_request) Failing after 14s
CI / integration_tests (pull_request) Failing after 17s
CI / build (pull_request) Has been skipped
to 197653ce8a
Some checks failed
CI / lint (pull_request) Failing after 39s
CI / integration_tests (pull_request) Failing after 47s
CI / unit_tests (pull_request) Failing after 9m47s
CI / build (pull_request) Has been skipped
2026-03-16 17:32:37 +00:00
Compare
freemo force-pushed feature/m2-headless-renderer from 197653ce8a
Some checks failed
CI / lint (pull_request) Failing after 39s
CI / integration_tests (pull_request) Failing after 47s
CI / unit_tests (pull_request) Failing after 9m47s
CI / build (pull_request) Has been skipped
to e34f38212e
Some checks failed
CI / lint (push) Waiting to run
CI / unit_tests (push) Waiting to run
CI / integration_tests (push) Waiting to run
CI / build (push) Blocked by required conditions
CI / lint (pull_request) Failing after 40s
CI / integration_tests (pull_request) Failing after 49s
CI / unit_tests (pull_request) Failing after 11m40s
CI / build (pull_request) Has been skipped
2026-03-16 19:56:06 +00:00
Compare
freemo merged commit e34f38212e into master 2026-03-16 19:56:16 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aethyr/Aethyr!324
No description provided.