test/test_basic_help.rb
# frozen_string_literal: true

require 'helper'

module Cri
  class BasicHelpTestCase < Cri::TestCase
    def test_run_without_supercommand
      cmd = Cri::Command.new_basic_help

      assert_raises Cri::NoHelpAvailableError do
        cmd.run([])
      end
    end

    def test_run_with_supercommand
      cmd = Cri::Command.define do
        name 'meh'
      end

      help_cmd = Cri::Command.new_basic_help
      cmd.add_command(help_cmd)

      help_cmd.run([])
    end

    def test_run_with_chain_of_commands
      cmd = Cri::Command.define do
        name 'root'
        summary 'I am root!'

        subcommand do
          name 'foo'
          summary 'I am foo!'

          subcommand do
            name 'subsubby'
            summary 'I am subsubby!'
          end
        end
      end

      help_cmd = Cri::Command.new_basic_help
      cmd.add_command(help_cmd)

      # Simple call
      stdout, stderr = capture_io_while do
        help_cmd.run(['foo'])
      end
      assert_match(/I am foo!/m, stdout)
      assert_equal('', stderr)

      # Subcommand
      stdout, stderr = capture_io_while do
        help_cmd.run(%w[foo subsubby])
      end
      assert_match(/I am subsubby!/m, stdout)
      assert_equal('', stderr)

      # Non-existing subcommand
      stdout, stderr = capture_io_while do
        assert_raises SystemExit do
          help_cmd.run(%w[foo mysterycmd])
        end
      end
      assert_equal '', stdout
      assert_match(/foo: unknown command 'mysterycmd'/, stderr)
    end
  end
end
