зеркало из https://github.com/mislav/hub.git
189 строки
4.9 KiB
Ruby
189 строки
4.9 KiB
Ruby
require 'aruba/cucumber'
|
|
require 'fileutils'
|
|
require 'forwardable'
|
|
require 'tmpdir'
|
|
|
|
system_git = `which git 2>/dev/null`.chomp
|
|
bin_dir = File.expand_path('../fakebin', __FILE__)
|
|
hub_dir = Dir.mktmpdir('hub_build')
|
|
raise 'hub build failed' unless system("./script/build -o #{hub_dir}/hub")
|
|
|
|
Before do
|
|
# speed up load time by skipping RubyGems
|
|
set_env 'RUBYOPT', '--disable-gems' if RUBY_VERSION > '1.9'
|
|
# put fakebin on the PATH
|
|
set_env 'PATH', "#{hub_dir}:#{bin_dir}:#{ENV['PATH']}"
|
|
# clear out GIT if it happens to be set
|
|
set_env 'GIT', nil
|
|
# exclude this project's git directory from use in testing
|
|
set_env 'GIT_CEILING_DIRECTORIES', File.expand_path('../../..', __FILE__)
|
|
# sabotage git commands that might try to access a remote host
|
|
set_env 'GIT_PROXY_COMMAND', 'echo'
|
|
# avoids reading from current user's "~/.gitconfig"
|
|
set_env 'HOME', File.expand_path(File.join(current_dir, 'home'))
|
|
set_env 'TMPDIR', File.expand_path(File.join(current_dir, 'tmp'))
|
|
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html#variables
|
|
set_env 'XDG_CONFIG_HOME', nil
|
|
set_env 'XDG_CONFIG_DIRS', nil
|
|
# used in fakebin/git
|
|
set_env 'HUB_SYSTEM_GIT', system_git
|
|
# ensure that api.github.com is actually never hit in tests
|
|
set_env 'HUB_TEST_HOST', 'http://127.0.0.1:0'
|
|
# ensure we use fakebin `open` to test browsing
|
|
set_env 'BROWSER', 'open'
|
|
# sabotage opening a commit message editor interactively
|
|
set_env 'GIT_EDITOR', 'false'
|
|
# reset current localization settings
|
|
set_env 'LANG', nil
|
|
set_env 'LANGUAGE', nil
|
|
set_env 'LC_ALL', 'en_US.UTF-8'
|
|
# ignore current user's token
|
|
set_env 'GITHUB_TOKEN', nil
|
|
set_env 'GITHUB_USER', nil
|
|
set_env 'GITHUB_PASSWORD', nil
|
|
set_env 'GITHUB_HOST', nil
|
|
|
|
author_name = "Hub"
|
|
author_email = "hub@test.local"
|
|
set_env 'GIT_AUTHOR_NAME', author_name
|
|
set_env 'GIT_COMMITTER_NAME', author_name
|
|
set_env 'GIT_AUTHOR_EMAIL', author_email
|
|
set_env 'GIT_COMMITTER_EMAIL', author_email
|
|
|
|
set_env 'HUB_VERSION', 'dev'
|
|
set_env 'HUB_REPORT_CRASH', 'never'
|
|
set_env 'HUB_PROTOCOL', nil
|
|
|
|
FileUtils.mkdir_p ENV['HOME']
|
|
|
|
# increase process exit timeout from the default of 3 seconds
|
|
@aruba_timeout_seconds = 10
|
|
# don't be "helpful"
|
|
@aruba_keep_ansi = true
|
|
end
|
|
|
|
After do
|
|
@server.stop if defined? @server and @server
|
|
FileUtils.rm_f("#{bin_dir}/vim")
|
|
end
|
|
|
|
RSpec::Matchers.define :be_successful_command do
|
|
match do |cmd|
|
|
cmd.success?
|
|
end
|
|
|
|
failure_message do |cmd|
|
|
%(command "#{cmd}" exited with status #{cmd.status}:) <<
|
|
cmd.output.gsub(/^/, ' ' * 2)
|
|
end
|
|
end
|
|
|
|
class SimpleCommand
|
|
attr_reader :output
|
|
extend Forwardable
|
|
|
|
def_delegator :@status, :exitstatus, :status
|
|
def_delegators :@status, :success?
|
|
|
|
def initialize cmd
|
|
@cmd = cmd
|
|
end
|
|
|
|
def to_s
|
|
@cmd
|
|
end
|
|
|
|
def self.run cmd
|
|
command = new(cmd)
|
|
command.run
|
|
command
|
|
end
|
|
|
|
def run
|
|
@output = `#{@cmd} 2>&1`.chomp
|
|
@status = $?
|
|
$?.success?
|
|
end
|
|
end
|
|
|
|
World Module.new {
|
|
# If there are multiple inputs, e.g., type in username and then type in password etc.,
|
|
# the Go program will freeze on the second input. Giving it a small time interval
|
|
# temporarily solves the problem.
|
|
# See https://github.com/cucumber/aruba/blob/7afbc5c0cbae9c9a946d70c4c2735ccb86e00f08/lib/aruba/api.rb#L379-L382
|
|
def type(*args)
|
|
super.tap { sleep 0.1 }
|
|
end
|
|
|
|
def history
|
|
histfile = File.join(ENV['HOME'], '.history')
|
|
if File.exist? histfile
|
|
File.readlines histfile
|
|
else
|
|
[]
|
|
end
|
|
end
|
|
|
|
def assert_command_run cmd
|
|
cmd += "\n" unless cmd[-1..-1] == "\n"
|
|
expect(history).to include(cmd)
|
|
end
|
|
|
|
def edit_hub_config
|
|
config = File.join(ENV['HOME'], '.config/hub')
|
|
FileUtils.mkdir_p File.dirname(config)
|
|
if File.exist? config
|
|
data = YAML.load File.read(config)
|
|
else
|
|
data = {}
|
|
end
|
|
yield data
|
|
File.open(config, 'w') { |cfg| cfg << YAML.dump(data) }
|
|
end
|
|
|
|
define_method(:text_editor_script) do |bash_code|
|
|
File.open("#{bin_dir}/vim", 'w', 0755) { |exe|
|
|
exe.puts "#!/bin/bash"
|
|
exe.puts "set -e"
|
|
exe.puts bash_code
|
|
}
|
|
end
|
|
|
|
def run_silent cmd
|
|
in_current_dir do
|
|
command = SimpleCommand.run(cmd)
|
|
expect(command).to be_successful_command
|
|
command.output
|
|
end
|
|
end
|
|
|
|
def empty_commit(message = nil)
|
|
unless message
|
|
@empty_commit_count = defined?(@empty_commit_count) ? @empty_commit_count + 1 : 1
|
|
message = "empty #{@empty_commit_count}"
|
|
end
|
|
run_silent "git commit --quiet -m '#{message}' --allow-empty"
|
|
end
|
|
|
|
# Aruba unnecessarily creates new Announcer instance on each invocation
|
|
def announcer
|
|
@announcer ||= super
|
|
end
|
|
|
|
def shell_escape(message)
|
|
message.to_s.gsub(/['"\\ $]/) { |m| "\\#{m}" }
|
|
end
|
|
|
|
%w[output_from stdout_from stderr_from all_stdout all_stderr].each do |m|
|
|
define_method(m) do |*args|
|
|
home = ENV['HOME'].to_s
|
|
output = super(*args)
|
|
if home.empty?
|
|
output
|
|
else
|
|
output.gsub(home, '$HOME')
|
|
end
|
|
end
|
|
end
|
|
}
|