mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
f3bda8987e
Picked from 4b498709a0
180 lines
5.6 KiB
Ruby
180 lines
5.6 KiB
Ruby
# frozen_string_literal: true
|
|
require_relative 'helper'
|
|
require 'rubygems/commands/yank_command'
|
|
|
|
class TestGemCommandsYankCommand < Gem::TestCase
|
|
def setup
|
|
super
|
|
|
|
credential_setup
|
|
|
|
@cmd = Gem::Commands::YankCommand.new
|
|
@cmd.options[:host] = 'http://example'
|
|
|
|
@fetcher = Gem::RemoteFetcher.fetcher
|
|
|
|
Gem.configuration.rubygems_api_key = 'key'
|
|
Gem.configuration.api_keys[:KEY] = 'other'
|
|
end
|
|
|
|
def teardown
|
|
credential_teardown
|
|
|
|
super
|
|
end
|
|
|
|
def test_handle_options
|
|
@cmd.handle_options %w[a --version 1.0 --platform x86-darwin -k KEY --host HOST]
|
|
|
|
assert_equal %w[a], @cmd.options[:args]
|
|
assert_equal :KEY, @cmd.options[:key]
|
|
assert_equal "HOST", @cmd.options[:host]
|
|
assert_nil @cmd.options[:platform]
|
|
assert_equal req('= 1.0'), @cmd.options[:version]
|
|
end
|
|
|
|
def test_handle_options_missing_argument
|
|
%w[-v --version -p --platform].each do |option|
|
|
assert_raise Gem::OptionParser::MissingArgument do
|
|
@cmd.handle_options %W[a #{option}]
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_execute
|
|
yank_uri = 'http://example/api/v1/gems/yank'
|
|
@fetcher.data[yank_uri] = ['Successfully yanked', 200, 'OK']
|
|
|
|
@cmd.options[:args] = %w[a]
|
|
@cmd.options[:added_platform] = true
|
|
@cmd.options[:version] = req('= 1.0')
|
|
|
|
use_ui @ui do
|
|
@cmd.execute
|
|
end
|
|
|
|
assert_match %r{Yanking gem from http://example}, @ui.output
|
|
assert_match %r{Successfully yanked}, @ui.output
|
|
|
|
platform = Gem.platforms[1]
|
|
body = @fetcher.last_request.body.split('&').sort
|
|
assert_equal %W[gem_name=a platform=#{platform} version=1.0], body
|
|
|
|
assert_equal 'key', @fetcher.last_request['Authorization']
|
|
|
|
assert_equal [yank_uri], @fetcher.paths
|
|
end
|
|
|
|
def test_execute_with_otp_success
|
|
response_fail = 'You have enabled multifactor authentication but your request doesn\'t have the correct OTP code. Please check it and retry.'
|
|
yank_uri = 'http://example/api/v1/gems/yank'
|
|
@fetcher.data[yank_uri] = [
|
|
[response_fail, 401, 'Unauthorized'],
|
|
['Successfully yanked', 200, 'OK'],
|
|
]
|
|
|
|
@cmd.options[:args] = %w[a]
|
|
@cmd.options[:added_platform] = true
|
|
@cmd.options[:version] = req('= 1.0')
|
|
|
|
@otp_ui = Gem::MockGemUi.new "111111\n"
|
|
use_ui @otp_ui do
|
|
@cmd.execute
|
|
end
|
|
|
|
assert_match 'You have enabled multi-factor authentication. Please enter OTP code.', @otp_ui.output
|
|
assert_match 'Code: ', @otp_ui.output
|
|
assert_match %r{Yanking gem from http://example}, @otp_ui.output
|
|
assert_match %r{Successfully yanked}, @otp_ui.output
|
|
assert_equal '111111', @fetcher.last_request['OTP']
|
|
end
|
|
|
|
def test_execute_with_otp_failure
|
|
response = 'You have enabled multifactor authentication but your request doesn\'t have the correct OTP code. Please check it and retry.'
|
|
yank_uri = 'http://example/api/v1/gems/yank'
|
|
@fetcher.data[yank_uri] = [response, 401, 'Unauthorized']
|
|
|
|
@cmd.options[:args] = %w[a]
|
|
@cmd.options[:added_platform] = true
|
|
@cmd.options[:version] = req('= 1.0')
|
|
|
|
@otp_ui = Gem::MockGemUi.new "111111\n"
|
|
use_ui @otp_ui do
|
|
@cmd.execute
|
|
end
|
|
|
|
assert_match 'You have enabled multi-factor authentication. Please enter OTP code.', @otp_ui.output
|
|
assert_match response, @otp_ui.output
|
|
assert_match 'Code: ', @otp_ui.output
|
|
assert_equal '111111', @fetcher.last_request['OTP']
|
|
end
|
|
|
|
def test_execute_key
|
|
yank_uri = 'http://example/api/v1/gems/yank'
|
|
@fetcher.data[yank_uri] = ['Successfully yanked', 200, 'OK']
|
|
|
|
@cmd.options[:args] = %w[a]
|
|
@cmd.options[:version] = req('= 1.0')
|
|
@cmd.options[:key] = :KEY
|
|
|
|
use_ui @ui do
|
|
@cmd.execute
|
|
end
|
|
|
|
body = @fetcher.last_request.body.split('&').sort
|
|
assert_equal %w[gem_name=a version=1.0], body
|
|
assert_equal 'other', @fetcher.last_request['Authorization']
|
|
end
|
|
|
|
def test_execute_host
|
|
host = 'https://other.example'
|
|
yank_uri = "#{host}/api/v1/gems/yank"
|
|
@fetcher.data[yank_uri] = ['Successfully yanked', 200, 'OK']
|
|
|
|
@cmd.options[:args] = %w[a]
|
|
@cmd.options[:version] = req('= 1.0')
|
|
@cmd.options[:host] = host
|
|
|
|
use_ui @ui do
|
|
@cmd.execute
|
|
end
|
|
|
|
assert_match %r{Yanking gem from https://other.example}, @ui.output
|
|
assert_match %r{Successfully yanked}, @ui.output
|
|
|
|
body = @fetcher.last_request.body.split('&').sort
|
|
assert_equal %w[gem_name=a version=1.0], body
|
|
assert_equal 'key', @fetcher.last_request['Authorization']
|
|
assert_equal [yank_uri], @fetcher.paths
|
|
end
|
|
|
|
def test_yank_gem_unathorized_api_key
|
|
response_forbidden = "The API key doesn't have access"
|
|
response_success = 'Successfully yanked'
|
|
host = 'http://example'
|
|
|
|
@fetcher.data["#{host}/api/v1/gems/yank"] = [
|
|
[response_forbidden, 403, 'Forbidden'],
|
|
[response_success, 200, "OK"],
|
|
]
|
|
|
|
@fetcher.data["#{host}/api/v1/api_key"] = ["", 200, "OK"]
|
|
@cmd.options[:args] = %w[a]
|
|
@cmd.options[:added_platform] = true
|
|
@cmd.options[:version] = req('= 1.0')
|
|
@cmd.instance_variable_set :@host, host
|
|
@cmd.instance_variable_set :@scope, :yank_rubygem
|
|
|
|
@ui = Gem::MockGemUi.new "some@mail.com\npass\n"
|
|
use_ui @ui do
|
|
@cmd.execute
|
|
end
|
|
|
|
access_notice = "The existing key doesn't have access of yank_rubygem on http://example. Please sign in to update access."
|
|
assert_match access_notice, @ui.output
|
|
assert_match "Email:", @ui.output
|
|
assert_match "Password:", @ui.output
|
|
assert_match "Added yank_rubygem scope to the existing API key", @ui.output
|
|
assert_match response_success, @ui.output
|
|
end
|
|
end
|