Module: Ace::TestSupport::CliHelpers

Defined in:
lib/ace/test_support/cli_helpers.rb

Overview

CLI test helpers for ace-support-cli based CLIs

This module provides reusable patterns for testing CLI commands during the Thor to ace-support-cli migration (Task 179).

Examples:

Usage in test file

require 'ace/test_support'

class CliRoutingTest < Minitest::Test
  include Ace::TestSupport::CliHelpers

  def test_routes_to_version
    result = invoke_cli(MyGem::CLI, ["--version"])
    assert_match(/\d+\.\d+\.\d+/, result[:stdout])
  end
end

Instance Method Summary collapse

Instance Method Details

#assert_cli_output_matches(cli_class, args, pattern, message = nil) ⇒ Object

Assert CLI output matches pattern

Examples:

assert_cli_output_matches(Ace::Search::CLI, ["version"], /\d+\.\d+/)

Parameters:

  • cli_class (Class)

    The CLI module/class with a .start method

  • args (Array<String>)

    Command line arguments

  • pattern (Regexp, String)

    Pattern to match against stdout

  • message (String, nil) (defaults to: nil)

    Optional assertion message



96
97
98
99
100
# File 'lib/ace/test_support/cli_helpers.rb', line 96

def assert_cli_output_matches(cli_class, args, pattern, message = nil)
  result = invoke_cli(cli_class, args)
  assert_match pattern, result[:stdout],
    message || "Expected stdout to match #{pattern.inspect}"
end

#assert_cli_success(cli_class, args, message = nil) ⇒ Object

Assert CLI returns success (exit code 0)

Examples:

assert_cli_success(Ace::Search::CLI, ["version"])

Parameters:

  • cli_class (Class)

    The CLI module/class with a .start method

  • args (Array<String>)

    Command line arguments

  • message (String, nil) (defaults to: nil)

    Optional assertion message



81
82
83
84
85
# File 'lib/ace/test_support/cli_helpers.rb', line 81

def assert_cli_success(cli_class, args, message = nil)
  result = invoke_cli(cli_class, args)
  assert_equal 0, result[:result],
    message || "Expected CLI to return 0, got #{result[:result]}. stderr: #{result[:stderr]}"
end

#invoke_cli(cli_class, args) ⇒ Hash

Note:

ace-support-cli calls exit(0) for –help, so we catch SystemExit. Commands raise Ace::Support::Cli::Error for controlled failures (exception-based exit code pattern per ADR-023).

Invoke a ace-support-cli CLI and capture output

This helper provides a consistent pattern for testing CLI routing and command execution. It wraps CLI.start with capture_io to capture stdout/stderr.

Examples:

Basic usage

result = invoke_cli(Ace::Search::CLI, ["version"])
assert_match(/\d+\.\d+/, result[:stdout])

Testing with options

result = invoke_cli(Ace::Search::CLI, ["search", "TODO", "--max-results", "10"])
assert_equal 0, result[:result]

Parameters:

  • cli_class (Class)

    The CLI module/class with a .start method

  • args (Array<String>)

    Command line arguments

Returns:

  • (Hash)

    Result hash with :stdout, :stderr, :result keys



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/ace/test_support/cli_helpers.rb', line 43

def invoke_cli(cli_class, args)
  stdout, stderr = capture_io do
    @_cli_result = cli_class.start(args)
  rescue SystemExit => e
    @_cli_result = e.status
  rescue Ace::Support::Cli::Error => e
    warn e.message
    @_cli_result = e.exit_code
  end

  {
    stdout: stdout,
    stderr: stderr,
    result: @_cli_result
  }
end

#invoke_cli_stdout(cli_class, args) ⇒ String

Invoke CLI and return only stdout (convenience method)

Examples:

output = invoke_cli_stdout(Ace::Search::CLI, ["version"])
assert_match(/\d+\.\d+/, output)

Parameters:

  • cli_class (Class)

    The CLI module/class with a .start method

  • args (Array<String>)

    Command line arguments

Returns:

  • (String)

    Standard output



69
70
71
# File 'lib/ace/test_support/cli_helpers.rb', line 69

def invoke_cli_stdout(cli_class, args)
  invoke_cli(cli_class, args)[:stdout]
end