2016-02-01 07:43:26 -05:00
# frozen_string_literal: true
2021-06-01 23:32:47 -04:00
require_relative 'helper'
2007-11-10 02:48:56 -05:00
require 'rubygems/command'
class Gem :: Command
public :parser
end
2011-01-28 18:46:47 -05:00
class TestGemCommand < Gem :: TestCase
2007-11-10 02:48:56 -05:00
def setup
super
@xopt = nil
2017-11-28 17:30:28 -05:00
@common_options = Gem :: Command . common_options . dup
2007-11-10 02:48:56 -05:00
Gem :: Command . common_options . clear
2019-02-14 07:59:03 -05:00
Gem :: Command . common_options << [
2007-11-10 02:48:56 -05:00
[ '-x' , '--exe' , 'Execute' ] , lambda do | * a |
@xopt = true
end
]
@cmd_name = 'doit'
@cmd = Gem :: Command . new @cmd_name , 'summary'
end
2017-11-28 17:30:28 -05:00
def teardown
super
Gem :: Command . common_options . replace @common_options
end
2007-11-10 02:48:56 -05:00
def test_self_add_specific_extra_args
added_args = %w[ --all ]
2020-06-10 13:46:05 -04:00
@cmd . add_option ( '--all' ) { | v , o | }
2007-11-10 02:48:56 -05:00
Gem :: Command . add_specific_extra_args @cmd_name , added_args
assert_equal added_args , Gem :: Command . specific_extra_args ( @cmd_name )
h = @cmd . add_extra_args [ ]
assert_equal added_args , h
end
def test_self_add_specific_extra_args_unknown
added_args = %w[ --definitely_not_there ]
Gem :: Command . add_specific_extra_args @cmd_name , added_args
assert_equal added_args , Gem :: Command . specific_extra_args ( @cmd_name )
h = @cmd . add_extra_args [ ]
assert_equal [ ] , h
end
2020-03-08 04:38:37 -04:00
def test_self_extra_args
verbose , $VERBOSE , separator = $VERBOSE , nil , $;
extra_args = Gem :: Command . extra_args
Gem :: Command . extra_args = %w[ --all ]
assert_equal %w[ --all ] , Gem :: Command . extra_args
Gem :: Command . extra_args = " --file --help "
assert_equal %w[ --file --help ] , Gem :: Command . extra_args
$; = " = "
Gem :: Command . extra_args = " --awesome=true --verbose "
assert_equal %w[ --awesome=true --verbose ] , Gem :: Command . extra_args
ensure
Gem :: Command . extra_args = extra_args
$; = separator
$VERBOSE = verbose
end
2007-11-10 02:48:56 -05:00
def test_basic_accessors
assert_equal " doit " , @cmd . command
assert_equal " gem doit " , @cmd . program_name
assert_equal " summary " , @cmd . summary
end
def test_common_option_in_class
assert Array === Gem :: Command . common_options
end
def test_defaults
@cmd . add_option ( '-h' , '--help [COMMAND]' , 'Get help on COMMAND' ) do | value , options |
options [ :help ] = value
end
@cmd . defaults = { :help = > true }
@cmd . when_invoked do | options |
assert options [ :help ] , " Help options should default true "
end
use_ui @ui do
@cmd . invoke
end
2020-03-24 14:51:43 -04:00
assert_match %r{ Usage: gem doit } , @ui . output
2007-11-10 02:48:56 -05:00
end
def test_invoke
done = false
@cmd . when_invoked { done = true }
use_ui @ui do
@cmd . invoke
end
assert done
end
2011-01-28 18:46:47 -05:00
def test_invoke_with_bad_options
2007-11-10 02:48:56 -05:00
use_ui @ui do
2019-02-14 07:59:03 -05:00
@cmd . when_invoked { true }
2007-11-10 02:48:56 -05:00
2021-05-10 23:25:46 -04:00
ex = assert_raise OptionParser :: InvalidOption do
2007-11-10 02:48:56 -05:00
@cmd . invoke ( '-zzz' )
end
assert_match ( / invalid option: / , ex . message )
end
end
def test_invoke_with_common_options
2019-02-14 07:59:03 -05:00
@cmd . when_invoked { true }
2007-11-10 02:48:56 -05:00
use_ui @ui do
@cmd . invoke " -x "
end
assert @xopt , " Should have done xopt "
end
2012-11-29 01:52:18 -05:00
def test_invoke_with_build_args
@cmd . when_invoked { true }
use_ui @ui do
@cmd . invoke_with_build_args [ " -x " ] , [ " --awesome=true " ]
end
assert_equal [ " --awesome=true " ] , @cmd . options [ :build_args ]
end
2007-11-10 02:48:56 -05:00
# Returning false from the command handler invokes the usage output.
def test_invoke_with_help
done = false
use_ui @ui do
@cmd . add_option ( '-h' , '--help [COMMAND]' , 'Get help on COMMAND' ) do | value , options |
options [ :help ] = true
done = true
end
@cmd . invoke ( '--help' )
assert done
end
assert_match ( / Usage / , @ui . output )
assert_match ( / gem doit / , @ui . output )
assert_match ( / \ [options \ ] / , @ui . output )
assert_match ( / -h / , @ui . output )
assert_match ( / --help \ [COMMAND \ ] / , @ui . output )
assert_match ( / Get help on COMMAND / , @ui . output )
assert_match ( / -x / , @ui . output )
assert_match ( / --exe / , @ui . output )
assert_match ( / Execute / , @ui . output )
assert_match ( / Common Options: / , @ui . output )
end
def test_invoke_with_options
@cmd . add_option ( '-h' , '--help [COMMAND]' , 'Get help on COMMAND' ) do | value , options |
options [ :help ] = true
end
@cmd . when_invoked do | opts |
assert opts [ :help ]
end
use_ui @ui do
@cmd . invoke '-h'
end
2020-03-24 14:51:43 -04:00
assert_match %r{ Usage: gem doit } , @ui . output
2007-11-10 02:48:56 -05:00
end
2021-05-28 06:47:49 -04:00
def test_add_option
assert_nothing_raised RuntimeError do
@cmd . add_option ( '--force' , 'skip validation of the spec' ) { | v , o | }
end
end
def test_add_option_with_empty
assert_raise RuntimeError , " Do not pass an empty string in opts " do
@cmd . add_option ( '' , 'skip validation of the spec' ) { | v , o | }
end
end
2007-11-10 02:48:56 -05:00
def test_option_recognition
@cmd . add_option ( '-h' , '--help [COMMAND]' , 'Get help on COMMAND' ) do | value , options |
options [ :help ] = true
end
@cmd . add_option ( '-f' , '--file FILE' , 'File option' ) do | value , options |
options [ :help ] = true
end
2017-10-07 21:32:18 -04:00
@cmd . add_option ( '--silent' , 'Silence RubyGems output' ) do | value , options |
2016-03-03 19:29:40 -05:00
options [ :silent ] = true
end
2007-11-10 02:48:56 -05:00
assert @cmd . handles? ( [ '-x' ] )
assert @cmd . handles? ( [ '-h' ] )
assert @cmd . handles? ( [ '-h' , 'command' ] )
assert @cmd . handles? ( [ '--help' , 'command' ] )
assert @cmd . handles? ( [ '-f' , 'filename' ] )
assert @cmd . handles? ( [ '--file=filename' ] )
2016-03-03 19:29:40 -05:00
assert @cmd . handles? ( [ '--silent' ] )
2009-06-09 17:38:59 -04:00
refute @cmd . handles? ( [ '-z' ] )
refute @cmd . handles? ( [ '-f' ] )
refute @cmd . handles? ( [ '--toothpaste' ] )
2007-11-10 02:48:56 -05:00
args = [ '-h' , 'command' ]
@cmd . handles? ( args )
assert_equal [ '-h' , 'command' ] , args
end
2019-12-13 06:19:08 -05:00
def test_deprecate_option
2019-02-14 07:59:03 -05:00
deprecate_msg = <<-EXPECTED
2019-12-13 06:19:08 -05:00
WARNING : The \ " --test \" option has been deprecated and will be removed in Rubygems 3.1.
2019-02-14 07:59:03 -05:00
EXPECTED
testCommand = Class . new ( Gem :: Command ) do
def initialize
super ( 'test' , 'Gem::Command instance for testing' )
add_option ( '-t' , '--test' , 'Test command' ) do | value , options |
options [ :test ] = true
end
2019-12-13 06:19:08 -05:00
deprecate_option ( '--test' , version : '3.1' )
2019-02-14 07:59:03 -05:00
end
def execute
true
end
end
cmd = testCommand . new
use_ui @ui do
cmd . invoke ( " --test " )
assert_equal deprecate_msg , @ui . error
end
end
def test_deprecate_option_no_version
deprecate_msg = <<-EXPECTED
2019-12-13 06:19:08 -05:00
WARNING : The \ " --test \" option has been deprecated and will be removed in future versions of Rubygems.
2019-02-14 07:59:03 -05:00
EXPECTED
testCommand = Class . new ( Gem :: Command ) do
def initialize
super ( 'test' , 'Gem::Command instance for testing' )
add_option ( '-t' , '--test' , 'Test command' ) do | value , options |
options [ :test ] = true
end
2019-12-13 06:19:08 -05:00
deprecate_option ( '--test' )
2019-02-14 07:59:03 -05:00
end
def execute
true
end
end
cmd = testCommand . new
use_ui @ui do
cmd . invoke ( " --test " )
assert_equal deprecate_msg , @ui . error
end
end
2019-12-13 06:19:08 -05:00
def test_deprecate_option_extra_message
2019-02-14 07:59:03 -05:00
deprecate_msg = <<-EXPECTED
2019-12-13 06:19:08 -05:00
WARNING : The \ " --test \" option has been deprecated and will be removed in Rubygems 3.1. Whether you set `--test` mode or not, this dummy app always runs in test mode.
2019-02-14 07:59:03 -05:00
EXPECTED
testCommand = Class . new ( Gem :: Command ) do
def initialize
super ( 'test' , 'Gem::Command instance for testing' )
add_option ( '-t' , '--test' , 'Test command' ) do | value , options |
options [ :test ] = true
end
2019-12-13 06:19:08 -05:00
deprecate_option ( '--test' , version : '3.1' , extra_msg : 'Whether you set `--test` mode or not, this dummy app always runs in test mode.' )
2019-02-14 07:59:03 -05:00
end
def execute
true
end
end
cmd = testCommand . new
use_ui @ui do
2019-12-13 06:19:08 -05:00
cmd . invoke ( " --test " )
assert_equal deprecate_msg , @ui . error
end
end
def test_deprecate_option_extra_message_and_no_version
deprecate_msg = <<-EXPECTED
WARNING : The \ " --test \" option has been deprecated and will be removed in future versions of Rubygems. Whether you set `--test` mode or not, this dummy app always runs in test mode.
EXPECTED
testCommand = Class . new ( Gem :: Command ) do
def initialize
super ( 'test' , 'Gem::Command instance for testing' )
add_option ( '-t' , '--test' , 'Test command' ) do | value , options |
options [ :test ] = true
end
deprecate_option ( '--test' , extra_msg : 'Whether you set `--test` mode or not, this dummy app always runs in test mode.' )
end
def execute
true
end
end
cmd = testCommand . new
use_ui @ui do
cmd . invoke ( " --test " )
2019-02-14 07:59:03 -05:00
assert_equal deprecate_msg , @ui . error
end
end
2014-09-13 23:30:02 -04:00
def test_show_lookup_failure_suggestions_local
correct = " non_existent_with_hint "
misspelled = " nonexistent_with_hint "
spec_fetcher do | fetcher |
fetcher . spec correct , 2
end
use_ui @ui do
@cmd . show_lookup_failure misspelled , Gem :: Requirement . default , [ ] , :local
end
expected = <<-EXPECTED
ERROR : Could not find a valid gem 'nonexistent_with_hint' ( > = 0 ) in any repository
EXPECTED
assert_equal expected , @ui . error
end
def test_show_lookup_failure_suggestions_none
spec_fetcher do | fetcher |
fetcher . spec 'correct' , 2
end
use_ui @ui do
@cmd . show_lookup_failure 'other' , Gem :: Requirement . default , [ ] , :remote
end
expected = <<-EXPECTED
ERROR : Could not find a valid gem 'other' ( > = 0 ) in any repository
EXPECTED
assert_equal expected , @ui . error
end
def test_show_lookup_failure_suggestions_remote
correct = " non_existent_with_hint "
misspelled = " nonexistent_with_hint "
spec_fetcher do | fetcher |
fetcher . spec correct , 2
end
use_ui @ui do
2019-07-26 01:54:06 -04:00
@cmd . show_lookup_failure misspelled , Gem :: Requirement . default , [ ]
2014-09-13 23:30:02 -04:00
end
expected = <<-EXPECTED
ERROR : Could not find a valid gem 'nonexistent_with_hint' ( > = 0 ) in any repository
ERROR : Possible alternatives : non_existent_with_hint
EXPECTED
assert_equal expected , @ui . error
end
2007-11-10 02:48:56 -05:00
end