hub_test.rb 38.5 KB
Newer Older
1
require 'helper'
2
require 'webmock/test_unit'
3
require 'rbconfig'
4
require 'yaml'
5
require 'forwardable'
6
require 'json'
C
Chris Wanstrath 已提交
7

8 9 10 11 12 13
WebMock::BodyPattern.class_eval do
  undef normalize_hash
  # override normalizing hash since it otherwise requires JSON
  def normalize_hash(hash) hash end
end

C
Chris Wanstrath 已提交
14
class HubTest < Test::Unit::TestCase
15 16
  extend Forwardable

17 18 19 20 21
  if defined? WebMock::API
    include WebMock::API
  else
    include WebMock
  end
C
Chris Wanstrath 已提交
22

23 24
  COMMANDS = []

25 26 27 28
  Hub::Context.class_eval do
    remove_method :which
    define_method :which do |name|
      COMMANDS.include?(name) ? "/usr/bin/#{name}" : nil
29 30 31
    end
  end

32 33 34 35
  attr_reader :git_reader
  include Hub::Context::GitReaderMethods
  def_delegators :git_reader, :stub_config_value, :stub_command_output

36
  def setup
37
    super
38
    COMMANDS.replace %w[open groff]
39
    Hub::Context::PWD.replace '/path/to/hub'
40

41 42 43
    @git_reader = Hub::Context::GitReader.new 'git' do |cache, cmd|
      unless cmd.index('config --get alias.') == 0
        raise ArgumentError, "`git #{cmd}` not stubbed"
M
Mislav Marohnić 已提交
44
      end
45 46 47 48 49 50
    end

    Hub::Commands.instance_variable_set :@git_reader, @git_reader
    Hub::Commands.instance_variable_set :@local_repo, nil

    @git_reader.stub! \
51
      'remote' => "mislav\norigin",
52
      'symbolic-ref -q HEAD' => 'refs/heads/master',
53 54
      'config --get github.user'   => 'tpw',
      'config --get github.token'  => 'abc123',
55 56
      'config --get-all remote.origin.url' => 'git://github.com/defunkt/hub.git',
      'config --get-all remote.mislav.url' => 'git://github.com/mislav/hub.git',
57
      'rev-parse --symbolic-full-name master@{upstream}' => 'refs/remotes/origin/master',
58 59 60
      'config --get --bool hub.http-clone' => 'false',
      'config --get hub.protocol' => nil,
      'rev-parse -q --git-dir' => '.git'
61 62
  end

C
Chris Wanstrath 已提交
63
  def test_private_clone
64 65
    input   = "clone -p rtomayko/ronn"
    command = "git clone git@github.com:rtomayko/ronn.git"
C
Chris Wanstrath 已提交
66
    assert_command input, command
C
Chris Wanstrath 已提交
67 68
  end

69 70 71 72 73 74
  def test_private_clone_noop
    input   = "--noop clone -p rtomayko/ronn"
    command = "git clone git@github.com:rtomayko/ronn.git\n"
    assert_output command, hub(input)
  end

75 76 77 78 79 80 81
  def test_https_clone
    stub_https_is_preferred
    input   = "clone rtomayko/ronn"
    command = "git clone https://github.com/rtomayko/ronn.git"
    assert_command input, command
  end

C
Chris Wanstrath 已提交
82
  def test_public_clone
83 84
    input   = "clone rtomayko/ronn"
    command = "git clone git://github.com/rtomayko/ronn.git"
C
Chris Wanstrath 已提交
85
    assert_command input, command
C
Chris Wanstrath 已提交
86 87
  end

88 89 90 91 92 93
  def test_your_private_clone
    input   = "clone -p resque"
    command = "git clone git@github.com:tpw/resque.git"
    assert_command input, command
  end

94
  def test_your_clone_is_always_private
95
    input   = "clone resque"
96
    command = "git clone git@github.com:tpw/resque.git"
97 98 99
    assert_command input, command
  end

100 101
  def test_clone_with_arguments
    input   = "clone --bare -o master resque"
102
    command = "git clone --bare -o master git@github.com:tpw/resque.git"
103 104 105
    assert_command input, command
  end

106 107 108 109
  def test_clone_with_arguments_and_destination
    assert_forwarded "clone --template=one/two git://github.com/tpw/resque.git --origin master resquetastic"
  end

110 111
  def test_your_private_clone_fails_without_config
    out = hub("clone -p mustache") do
112
      stub_github_user(nil)
113 114
    end

115
    assert_equal "** No GitHub user set. See http://help.github.com/set-your-user-name-email-and-github-token/\n", out
116 117 118 119
  end

  def test_your_public_clone_fails_without_config
    out = hub("clone mustache") do
120
      stub_github_user(nil)
121 122
    end

123
    assert_equal "** No GitHub user set. See http://help.github.com/set-your-user-name-email-and-github-token/\n", out
124 125
  end

126
  def test_private_clone_left_alone
127
    assert_forwarded "clone git@github.com:rtomayko/ronn.git"
128 129 130
  end

  def test_public_clone_left_alone
131
    assert_forwarded "clone git://github.com/rtomayko/ronn.git"
132
  end
C
Chris Wanstrath 已提交
133 134

  def test_normal_public_clone_with_path
135
    assert_forwarded "clone git://github.com/rtomayko/ronn.git ronn-dev"
C
Chris Wanstrath 已提交
136
  end
137 138

  def test_normal_clone_from_path
139
    assert_forwarded "clone ./test"
140
  end
141

142 143 144 145
  def test_clone_with_host_alias
    assert_forwarded "clone server:git/repo.git"
  end

M
Mislav Marohnić 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
  def test_alias_expand
    stub_alias 'c', 'clone --bare'
    input   = "c rtomayko/ronn"
    command = "git clone --bare git://github.com/rtomayko/ronn.git"
    assert_command input, command
  end

  def test_alias_expand_advanced
    stub_alias 'c', 'clone --template="white space"'
    input   = "c rtomayko/ronn"
    command = "git clone '--template=white space' git://github.com/rtomayko/ronn.git"
    assert_command input, command
  end

  def test_alias_doesnt_expand_for_unknown_commands
    stub_alias 'c', 'compute --fast'
    assert_forwarded "c rtomayko/ronn"
  end

165 166 167 168 169 170 171 172 173 174 175 176
  def test_remote_origin
    input   = "remote add origin"
    command = "git remote add origin git://github.com/tpw/hub.git"
    assert_command input, command
  end

  def test_private_remote_origin
    input   = "remote add -p origin"
    command = "git remote add origin git@github.com:tpw/hub.git"
    assert_command input, command
  end

177 178 179 180 181 182
  def test_public_remote_origin_as_normal
    input   = "remote add origin http://github.com/defunkt/resque.git"
    command = "git remote add origin http://github.com/defunkt/resque.git"
    assert_command input, command
  end

183
  def test_remote_from_rel_path
184
    assert_forwarded "remote add origin ./path"
185 186 187
  end

  def test_remote_from_abs_path
188
    assert_forwarded "remote add origin /path"
189 190
  end

191
  def test_remote_with_host_alias
192 193 194
    assert_forwarded "remote add origin server:/git/repo.git"
  end

195
  def test_private_remote_origin_as_normal
196
    assert_forwarded "remote add origin git@github.com:defunkt/resque.git"
C
Chris Wanstrath 已提交
197 198
  end

S
Stephen Celis 已提交
199 200
  def test_public_submodule
    input   = "submodule add wycats/bundler vendor/bundler"
J
Justin Ridgewell 已提交
201 202
    command = "git submodule add git://github.com/wycats/bundler.git vendor/bundler"
    assert_command input, command
S
Stephen Celis 已提交
203 204 205 206
  end

  def test_private_submodule
    input   = "submodule add -p grit vendor/grit"
J
Justin Ridgewell 已提交
207 208 209 210 211 212 213 214
    command = "git submodule add git@github.com:tpw/grit.git vendor/grit"
    assert_command input, command
  end

  def test_submodule_branch
    input   = "submodule add -b ryppl ryppl/pip vendor/pip"
    command = "git submodule add -b ryppl git://github.com/ryppl/pip.git vendor/pip"
    assert_command input, command
S
Stephen Celis 已提交
215 216 217 218 219
  end

  def test_submodule_with_args
    input   = "submodule -q add --bare -- grit grit"
    command = "git submodule -q add --bare -- git://github.com/tpw/grit.git grit"
J
Justin Ridgewell 已提交
220
    assert_command input, command
S
Stephen Celis 已提交
221 222
  end

C
Chris Wanstrath 已提交
223
  def test_private_remote
224
    input   = "remote add -p rtomayko"
C
Chris Wanstrath 已提交
225 226
    command = "git remote add rtomayko git@github.com:rtomayko/hub.git"
    assert_command input, command
C
Chris Wanstrath 已提交
227 228
  end

229 230 231 232 233 234 235
  def test_https_protocol_remote
    stub_https_is_preferred
    input   = "remote add rtomayko"
    command = "git remote add rtomayko https://github.com/rtomayko/hub.git"
    assert_command input, command
  end

C
Chris Wanstrath 已提交
236
  def test_public_remote
237
    input   = "remote add rtomayko"
C
Chris Wanstrath 已提交
238 239
    command = "git remote add rtomayko git://github.com/rtomayko/hub.git"
    assert_command input, command
C
Chris Wanstrath 已提交
240 241
  end

C
Chris Wanstrath 已提交
242 243 244 245 246 247
  def test_public_remote_f
    input   = "remote add -f rtomayko"
    command = "git remote add -f rtomayko git://github.com/rtomayko/hub.git"
    assert_command input, command
  end

248 249 250 251 252 253
  def test_named_public_remote
    input   = "remote add origin rtomayko"
    command = "git remote add origin git://github.com/rtomayko/hub.git"
    assert_command input, command
  end

254 255 256 257 258 259
  def test_named_public_remote_f
    input   = "remote add -f origin rtomayko"
    command = "git remote add -f origin git://github.com/rtomayko/hub.git"
    assert_command input, command
  end

C
Chris Wanstrath 已提交
260
  def test_private_remote_with_repo
261 262
    input   = "remote add -p jashkenas/coffee-script"
    command = "git remote add jashkenas git@github.com:jashkenas/coffee-script.git"
C
Chris Wanstrath 已提交
263 264 265 266
    assert_command input, command
  end

  def test_public_remote_with_repo
267 268
    input   = "remote add jashkenas/coffee-script"
    command = "git remote add jashkenas git://github.com/jashkenas/coffee-script.git"
269 270 271 272
    assert_command input, command
  end

  def test_public_remote_f_with_repo
273 274
    input   = "remote add -f jashkenas/coffee-script"
    command = "git remote add -f jashkenas git://github.com/jashkenas/coffee-script.git"
C
Chris Wanstrath 已提交
275 276 277
    assert_command input, command
  end

278
  def test_named_private_remote_with_repo
279 280
    input   = "remote add -p origin jashkenas/coffee-script"
    command = "git remote add origin git@github.com:jashkenas/coffee-script.git"
281 282 283
    assert_command input, command
  end

284
  def test_fetch_existing_remote
285
    assert_forwarded "fetch mislav"
286 287 288 289 290 291
  end

  def test_fetch_new_remote
    stub_remotes_group('xoebus', nil)
    stub_existing_fork('xoebus')

292 293 294
    assert_commands "git remote add xoebus git://github.com/xoebus/hub.git",
                    "git fetch xoebus",
                    "fetch xoebus"
295 296 297 298 299 300
  end

  def test_fetch_new_remote_with_options
    stub_remotes_group('xoebus', nil)
    stub_existing_fork('xoebus')

301 302 303
    assert_commands "git remote add xoebus git://github.com/xoebus/hub.git",
                    "git fetch --depth=1 --prune xoebus",
                    "fetch --depth=1 --prune xoebus"
304 305 306 307 308 309 310 311
  end

  def test_fetch_multiple_new_remotes
    stub_remotes_group('xoebus', nil)
    stub_remotes_group('rtomayko', nil)
    stub_existing_fork('xoebus')
    stub_existing_fork('rtomayko')

312 313 314 315
    assert_commands "git remote add xoebus git://github.com/xoebus/hub.git",
                    "git remote add rtomayko git://github.com/rtomayko/hub.git",
                    "git fetch --multiple xoebus rtomayko",
                    "fetch --multiple xoebus rtomayko"
316 317 318 319 320 321 322 323
  end

  def test_fetch_multiple_comma_separated_remotes
    stub_remotes_group('xoebus', nil)
    stub_remotes_group('rtomayko', nil)
    stub_existing_fork('xoebus')
    stub_existing_fork('rtomayko')

324 325 326 327
    assert_commands "git remote add xoebus git://github.com/xoebus/hub.git",
                    "git remote add rtomayko git://github.com/rtomayko/hub.git",
                    "git fetch --multiple xoebus rtomayko",
                    "fetch xoebus,rtomayko"
328 329 330 331 332 333 334 335 336 337 338 339 340 341
  end

  def test_fetch_multiple_new_remotes_with_filtering
    stub_remotes_group('xoebus', nil)
    stub_remotes_group('mygrp', 'one two')
    stub_remotes_group('typo', nil)
    stub_existing_fork('xoebus')
    stub_nonexisting_fork('typo')

    # mislav: existing remote; skipped
    # xoebus: new remote, fork exists; added
    # mygrp:  a remotes group; skipped
    # URL:    can't be a username; skipped
    # typo:   fork doesn't exist; skipped
342 343 344
    assert_commands "git remote add xoebus git://github.com/xoebus/hub.git",
                    "git fetch --multiple mislav xoebus mygrp git://example.com typo",
                    "fetch --multiple mislav xoebus mygrp git://example.com typo"
345 346
  end

347
  def test_cherry_pick
348
    assert_forwarded "cherry-pick a319d88"
349 350 351
  end

  def test_cherry_pick_url
352
    url = 'http://github.com/mislav/hub/commit/a319d88'
353
    assert_commands "git fetch mislav", "git cherry-pick a319d88", "cherry-pick #{url}"
354 355
  end

356 357
  def test_cherry_pick_url_with_fragment
    url = 'http://github.com/mislav/hub/commit/abcdef0123456789#comments'
358
    assert_commands "git fetch mislav", "git cherry-pick abcdef0123456789", "cherry-pick #{url}"
359 360
  end

361 362
  def test_cherry_pick_url_with_remote_add
    url = 'https://github.com/xoebus/hub/commit/a319d88'
363
    assert_commands "git remote add -f xoebus git://github.com/xoebus/hub.git",
364 365
                    "git cherry-pick a319d88",
                    "cherry-pick #{url}"
366 367 368 369
  end

  def test_cherry_pick_origin_url
    url = 'https://github.com/defunkt/hub/commit/a319d88'
370
    assert_commands "git fetch origin", "git cherry-pick a319d88", "cherry-pick #{url}"
371 372 373
  end

  def test_cherry_pick_github_user_notation
374
    assert_commands "git fetch mislav", "git cherry-pick 368af20", "cherry-pick mislav@368af20"
375 376 377 378
  end

  def test_cherry_pick_github_user_repo_notation
    # not supported
379
    assert_forwarded "cherry-pick mislav/hubbub@a319d88"
380 381 382
  end

  def test_cherry_pick_github_notation_too_short
383
    assert_forwarded "cherry-pick mislav@a319"
384 385 386
  end

  def test_cherry_pick_github_notation_with_remote_add
387 388 389
    assert_commands "git remote add -f xoebus git://github.com/xoebus/hub.git",
                    "git cherry-pick a319d88",
                    "cherry-pick xoebus@a319d88"
390 391
  end

392 393 394 395 396 397 398 399 400
  def test_am_untouched
    assert_forwarded "am some.patch"
  end

  def test_am_pull_request
    with_tmpdir('/tmp/') do
      assert_commands "curl -#LA 'hub #{Hub::Version}' https://github.com/defunkt/hub/pull/55.patch -o /tmp/55.patch",
                      "git am --signoff /tmp/55.patch -p2",
                      "am --signoff https://github.com/defunkt/hub/pull/55 -p2"
401 402 403

      cmd = Hub("am https://github.com/defunkt/hub/pull/55/files").command
      assert_includes '/pull/55.patch', cmd
404 405 406 407 408 409 410 411 412 413 414 415 416
    end
  end

  def test_am_commit_url
    with_tmpdir('/tmp/') do
      url = 'https://github.com/davidbalbert/hub/commit/fdb9921'

      assert_commands "curl -#LA 'hub #{Hub::Version}' #{url}.patch -o /tmp/fdb9921.patch",
                      "git am --signoff /tmp/fdb9921.patch -p2",
                      "am --signoff #{url} -p2"
    end
  end

417 418 419 420 421 422 423 424 425 426
  def test_am_gist
    with_tmpdir('/tmp/') do
      url = 'https://gist.github.com/8da7fb575debd88c54cf'

      assert_commands "curl -#LA 'hub #{Hub::Version}' #{url}.txt -o /tmp/gist-8da7fb575debd88c54cf.txt",
                      "git am --signoff /tmp/gist-8da7fb575debd88c54cf.txt -p2",
                      "am --signoff #{url} -p2"
    end
  end

427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
  def test_apply_untouched
    assert_forwarded "apply some.patch"
  end

  def test_apply_pull_request
    with_tmpdir('/tmp/') do
      assert_commands "curl -#LA 'hub #{Hub::Version}' https://github.com/defunkt/hub/pull/55.patch -o /tmp/55.patch",
                      "git apply /tmp/55.patch -p2",
                      "apply https://github.com/defunkt/hub/pull/55 -p2"

      cmd = Hub("apply https://github.com/defunkt/hub/pull/55/files").command
      assert_includes '/pull/55.patch', cmd
    end
  end

  def test_apply_commit_url
    with_tmpdir('/tmp/') do
      url = 'https://github.com/davidbalbert/hub/commit/fdb9921'

      assert_commands "curl -#LA 'hub #{Hub::Version}' #{url}.patch -o /tmp/fdb9921.patch",
                      "git apply /tmp/fdb9921.patch -p2",
                      "apply #{url} -p2"
    end
  end

  def test_apply_gist
    with_tmpdir('/tmp/') do
      url = 'https://gist.github.com/8da7fb575debd88c54cf'

      assert_commands "curl -#LA 'hub #{Hub::Version}' #{url}.txt -o /tmp/gist-8da7fb575debd88c54cf.txt",
                      "git apply /tmp/gist-8da7fb575debd88c54cf.txt -p2",
                      "apply #{url} -p2"
    end
  end

C
Chris Wanstrath 已提交
462
  def test_init
463
    assert_commands "git init", "git remote add origin git@github.com:tpw/hub.git", "init -g"
464 465 466 467
  end

  def test_init_no_login
    out = hub("init -g") do
468
      stub_github_user(nil)
469 470
    end

471
    assert_equal "** No GitHub user set. See http://help.github.com/set-your-user-name-email-and-github-token/\n", out
C
Chris Wanstrath 已提交
472 473
  end

474 475 476 477
  def test_push_untouched
    assert_forwarded "push"
  end

478
  def test_push_two
479 480
    assert_commands "git push origin cool-feature", "git push staging cool-feature",
                    "push origin,staging cool-feature"
481 482
  end

483 484 485 486 487 488
  def test_push_current_branch
    stub_branch('refs/heads/cool-feature')
    assert_commands "git push origin cool-feature", "git push staging cool-feature",
                    "push origin,staging"
  end

C
Chris Wanstrath 已提交
489
  def test_push_more
490 491 492 493
    assert_commands "git push origin cool-feature",
                    "git push staging cool-feature",
                    "git push qa cool-feature",
                    "push origin,staging,qa cool-feature"
C
Chris Wanstrath 已提交
494
  end
C
Chris Wanstrath 已提交
495

496
  def test_create
497
    stub_no_remotes
498
    stub_nonexisting_fork('tpw')
499 500
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/create").
      with(:body => { 'name' => 'hub' })
501

502
    expected = "remote add -f origin git@github.com:tpw/hub.git\n"
503
    expected << "created repository: tpw/hub\n"
504 505 506
    assert_equal expected, hub("create") { ENV['GIT'] = 'echo' }
  end

507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
  def test_create_custom_name
    stub_no_remotes
    stub_nonexisting_fork('tpw', 'hubbub')
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/create").
      with(:body => { 'name' => 'hubbub' })

    expected = "remote add -f origin git@github.com:tpw/hubbub.git\n"
    expected << "created repository: tpw/hubbub\n"
    assert_equal expected, hub("create hubbub") { ENV['GIT'] = 'echo' }
  end

  def test_create_in_organization
    stub_no_remotes
    stub_nonexisting_fork('acme', 'hubbub')
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/create").
      with(:body => { 'name' => 'acme/hubbub' })

    expected = "remote add -f origin git@github.com:acme/hubbub.git\n"
    expected << "created repository: acme/hubbub\n"
    assert_equal expected, hub("create acme/hubbub") { ENV['GIT'] = 'echo' }
  end

529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
  def test_create_no_openssl
    stub_no_remotes
    stub_nonexisting_fork('tpw')
    stub_request(:post, "http://#{auth}github.com/api/v2/yaml/repos/create").
      with(:body => { 'name' => 'hub' })

    expected = "remote add -f origin git@github.com:tpw/hub.git\n"
    expected << "created repository: tpw/hub\n"

    assert_equal expected, hub("create") {
      ENV['GIT'] = 'echo'
      require 'net/https'
      Object.send :remove_const, :OpenSSL
    }
  end

545 546 547
  def test_create_failed
    stub_no_remotes
    stub_nonexisting_fork('tpw')
548
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/create").
549 550
      to_return(:status => [401, "Your token is fail"])

551 552
    expected = "Error creating repository: Your token is fail (HTTP 401)\n"
    expected << "Check your token configuration (`git config github.token`)\n"
553 554 555
    assert_equal expected, hub("create") { ENV['GIT'] = 'echo' }
  end

556 557 558 559 560 561 562 563 564
  def test_create_with_env_authentication
    stub_no_remotes
    stub_nonexisting_fork('mojombo')

    old_user  = ENV['GITHUB_USER']
    old_token = ENV['GITHUB_TOKEN']
    ENV['GITHUB_USER']  = 'mojombo'
    ENV['GITHUB_TOKEN'] = '123abc'

565 566
    stub_request(:post, "https://#{auth('mojombo', '123abc')}github.com/api/v2/yaml/repos/create").
      with(:body => { 'name' => 'hub' })
567 568 569 570 571 572 573 574 575 576

    expected = "remote add -f origin git@github.com:mojombo/hub.git\n"
    expected << "created repository: mojombo/hub\n"
    assert_equal expected, hub("create") { ENV['GIT'] = 'echo' }

  ensure
    ENV['GITHUB_USER']  = old_user
    ENV['GITHUB_TOKEN'] = old_token
  end

577
  def test_create_private_repository
578
    stub_no_remotes
579
    stub_nonexisting_fork('tpw')
580 581
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/create").
      with(:body => { 'name' => 'hub', 'public' => '0' })
582

583
    expected = "remote add -f origin git@github.com:tpw/hub.git\n"
584
    expected << "created repository: tpw/hub\n"
585 586 587
    assert_equal expected, hub("create -p") { ENV['GIT'] = 'echo' }
  end

588
  def test_create_with_description_and_homepage
589
    stub_no_remotes
590
    stub_nonexisting_fork('tpw')
591 592
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/create").with(:body => {
      'name' => 'hub', 'description' => 'toyproject', 'homepage' => 'http://example.com'
593 594
    })

595
    expected = "remote add -f origin git@github.com:tpw/hub.git\n"
596
    expected << "created repository: tpw/hub\n"
597
    assert_equal expected, hub("create -d toyproject -h http://example.com") { ENV['GIT'] = 'echo' }
598 599
  end

600 601 602 603 604
  def test_create_with_invalid_arguments
    assert_equal "invalid argument: -a\n",   hub("create -a blah")   { ENV['GIT'] = 'echo' }
    assert_equal "invalid argument: bleh\n", hub("create blah bleh") { ENV['GIT'] = 'echo' }
  end

605
  def test_create_with_existing_repository
606
    stub_no_remotes
607 608 609 610
    stub_existing_fork('tpw')

    expected = "tpw/hub already exists on GitHub\n"
    expected << "remote add -f origin git@github.com:tpw/hub.git\n"
611
    expected << "set remote origin: tpw/hub\n"
612 613 614
    assert_equal expected, hub("create") { ENV['GIT'] = 'echo' }
  end

615 616 617 618 619 620 621 622 623 624 625
  def test_create_https_protocol
    stub_no_remotes
    stub_existing_fork('tpw')
    stub_https_is_preferred

    expected = "tpw/hub already exists on GitHub\n"
    expected << "remote add -f origin https://github.com/tpw/hub.git\n"
    expected << "set remote origin: tpw/hub\n"
    assert_equal expected, hub("create") { ENV['GIT'] = 'echo' }
  end

626
  def test_create_no_user
627
    stub_no_remotes
628 629 630
    out = hub("create") do
      stub_github_token(nil)
    end
631
    assert_equal "** No GitHub token set. See http://help.github.com/set-your-user-name-email-and-github-token/\n", out
632 633
  end

634
  def test_create_outside_git_repo
635
    stub_no_git_repo
636 637
    assert_equal "'create' must be run from inside a git repository\n", hub("create")
  end
638 639

  def test_create_origin_already_exists
C
Chris Wanstrath 已提交
640
    stub_nonexisting_fork('tpw')
641 642
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/create").
      with(:body => { 'name' => 'hub' })
C
Chris Wanstrath 已提交
643 644

    expected = "remote -v\ncreated repository: tpw/hub\n"
645 646
    assert_equal expected, hub("create") { ENV['GIT'] = 'echo' }
  end
C
Chris Wanstrath 已提交
647

648
  def test_fork
C
Chris Wanstrath 已提交
649
    stub_nonexisting_fork('tpw')
650
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/fork/defunkt/hub")
C
Chris Wanstrath 已提交
651

C
Chris Wanstrath 已提交
652
    expected = "remote add -f tpw git@github.com:tpw/hub.git\n"
653 654 655 656
    expected << "new remote: tpw\n"
    assert_equal expected, hub("fork") { ENV['GIT'] = 'echo' }
  end

657 658
  def test_fork_failed
    stub_nonexisting_fork('tpw')
659
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/fork/defunkt/hub").
660 661
      to_return(:status => [500, "Your fork is fail"])

662
    expected = "Error creating fork: Your fork is fail (HTTP 500)\n"
663 664 665
    assert_equal expected, hub("fork") { ENV['GIT'] = 'echo' }
  end

666
  def test_fork_no_remote
667
    stub_nonexisting_fork('tpw')
668
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/repos/fork/defunkt/hub")
C
Chris Wanstrath 已提交
669

670 671 672 673
    assert_equal "", hub("fork --no-remote") { ENV['GIT'] = 'echo' }
  end

  def test_fork_already_exists
674
    stub_existing_fork('tpw')
C
Chris Wanstrath 已提交
675

676
    expected = "tpw/hub already exists on GitHub\n"
C
Chris Wanstrath 已提交
677
    expected << "remote add -f tpw git@github.com:tpw/hub.git\n"
678 679 680
    expected << "new remote: tpw\n"
    assert_equal expected, hub("fork") { ENV['GIT'] = 'echo' }
  end
C
Chris Wanstrath 已提交
681

682 683 684 685 686 687 688 689 690 691
  def test_fork_https_protocol
    stub_existing_fork('tpw')
    stub_https_is_preferred

    expected = "tpw/hub already exists on GitHub\n"
    expected << "remote add -f tpw https://github.com/tpw/hub.git\n"
    expected << "new remote: tpw\n"
    assert_equal expected, hub("fork") { ENV['GIT'] = 'echo' }
  end

692
  def test_pullrequest
M
Mislav Marohnić 已提交
693 694 695
    expected = "Aborted: head branch is the same as base (\"master\")\n" <<
      "(use `-h <branch>` to specify an explicit pull request head)\n"
    assert_output expected, "pull-request hereyougo"
696 697
  end

M
Mislav Marohnić 已提交
698 699 700
  def test_pullrequest_with_unpushed_commits
    stub_tracking('master', 'mislav', 'master')
    stub_command_output "rev-list --cherry mislav/master...", "+abcd1234\n+bcde2345"
701

M
Mislav Marohnić 已提交
702
    expected = "Aborted: 2 commits are not yet pushed to mislav/master\n" <<
703
      "(use `-f` to force submit a pull request anyway)\n"
704 705 706 707 708 709
    assert_output expected, "pull-request hereyougo"
  end

  def test_pullrequest_from_branch
    stub_branch('refs/heads/feature')
    stub_tracking_nothing('feature')
M
Mislav Marohnić 已提交
710

711 712 713 714 715
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/defunkt/hub").
      with(:body => { 'pull' => {'base' => "master", 'head' => "tpw:feature", 'title' => "hereyougo"} }).
      to_return(:body => mock_pullreq_response(1))

    expected = "https://github.com/defunkt/hub/pull/1\n"
716
    assert_output expected, "pull-request hereyougo -f"
717 718 719 720
  end

  def test_pullrequest_from_tracking_branch
    stub_branch('refs/heads/feature')
M
Mislav Marohnić 已提交
721 722
    stub_tracking('feature', 'mislav', 'yay-feature')
    stub_command_output "rev-list --cherry mislav/master...", nil
723

724
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/defunkt/hub").
M
Mislav Marohnić 已提交
725
      with(:body => { 'pull' => {'base' => "master", 'head' => "mislav:yay-feature", 'title' => "hereyougo"} }).
726 727 728
      to_return(:body => mock_pullreq_response(1))

    expected = "https://github.com/defunkt/hub/pull/1\n"
729
    assert_output expected, "pull-request hereyougo -f"
730 731 732 733 734 735 736 737
  end

  def test_pullrequest_explicit_head
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/defunkt/hub").
      with(:body => { 'pull' => {'base' => "master", 'head' => "tpw:yay-feature", 'title' => "hereyougo"} }).
      to_return(:body => mock_pullreq_response(1))

    expected = "https://github.com/defunkt/hub/pull/1\n"
738
    assert_output expected, "pull-request hereyougo -h yay-feature -f"
739 740 741 742 743 744 745 746
  end

  def test_pullrequest_explicit_head_with_owner
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/defunkt/hub").
      with(:body => { 'pull' => {'base' => "master", 'head' => "mojombo:feature", 'title' => "hereyougo"} }).
      to_return(:body => mock_pullreq_response(1))

    expected = "https://github.com/defunkt/hub/pull/1\n"
747
    assert_output expected, "pull-request hereyougo -h mojombo:feature -f"
748 749 750 751
  end

  def test_pullrequest_explicit_base
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/defunkt/hub").
M
Mislav Marohnić 已提交
752
      with(:body => { 'pull' => {'base' => "feature", 'head' => "defunkt:master", 'title' => "hereyougo"} }).
753 754 755
      to_return(:body => mock_pullreq_response(1))

    expected = "https://github.com/defunkt/hub/pull/1\n"
756
    assert_output expected, "pull-request hereyougo -b feature -f"
757 758 759 760
  end

  def test_pullrequest_explicit_base_with_owner
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/mojombo/hub").
M
Mislav Marohnić 已提交
761
      with(:body => { 'pull' => {'base' => "feature", 'head' => "defunkt:master", 'title' => "hereyougo"} }).
762 763 764
      to_return(:body => mock_pullreq_response(1))

    expected = "https://github.com/defunkt/hub/pull/1\n"
765
    assert_output expected, "pull-request hereyougo -b mojombo:feature -f"
766 767
  end

768 769
  def test_pullrequest_explicit_base_with_repo
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/mojombo/hubbub").
M
Mislav Marohnić 已提交
770
      with(:body => { 'pull' => {'base' => "feature", 'head' => "defunkt:master", 'title' => "hereyougo"} }).
771 772 773
      to_return(:body => mock_pullreq_response(1))

    expected = "https://github.com/defunkt/hub/pull/1\n"
774
    assert_output expected, "pull-request hereyougo -b mojombo/hubbub:feature -f"
775 776 777
  end

  def test_pullrequest_existing_issue
M
Mislav Marohnić 已提交
778 779 780 781
    stub_branch('refs/heads/myfix')
    stub_tracking('myfix', 'mislav', 'awesomefix')
    stub_command_output "rev-list --cherry mislav/awesomefix...", nil

782
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/defunkt/hub").
M
Mislav Marohnić 已提交
783
      with(:body => { 'pull' => {'base' => "master", 'head' => "mislav:awesomefix", 'issue' => '92'} }).
784 785 786
      to_return(:body => mock_pullreq_response(92))

    expected = "https://github.com/defunkt/hub/pull/92\n"
M
Mislav Marohnić 已提交
787
    assert_output expected, "pull-request -i 92"
788 789
  end

790
  def test_pullrequest_existing_issue_url
M
Mislav Marohnić 已提交
791 792 793 794
    stub_branch('refs/heads/myfix')
    stub_tracking('myfix', 'mislav', 'awesomefix')
    stub_command_output "rev-list --cherry mislav/awesomefix...", nil

795
    stub_request(:post, "https://#{auth}github.com/api/v2/yaml/pulls/mojombo/hub").
M
Mislav Marohnić 已提交
796
      with(:body => { 'pull' => {'base' => "master", 'head' => "mislav:awesomefix", 'issue' => '92'} }).
797 798 799
      to_return(:body => mock_pullreq_response(92, 'mojombo/hub'))

    expected = "https://github.com/mojombo/hub/pull/92\n"
M
Mislav Marohnić 已提交
800
    assert_output expected, "pull-request https://github.com/mojombo/hub/issues/92#comment_4"
801 802
  end

803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836
  def test_checkout_no_changes
    assert_forwarded "checkout master"
  end

  def test_checkout_pullrequest
    stub_request(:get, "http://github.com/api/v2/json/pulls/defunkt/hub/73").
      to_return(:body => mock_pull_response('blueyed:feature'))

    assert_commands 'git remote add -f -t feature blueyed git://github.com/blueyed/hub.git',
      'git checkout -b blueyed-feature blueyed/feature',
      "checkout https://github.com/defunkt/hub/pull/73/files"
  end

  def test_checkout_pullrequest_custom_branch
    stub_request(:get, "http://github.com/api/v2/json/pulls/defunkt/hub/73").
      to_return(:body => mock_pull_response('blueyed:feature'))

    assert_commands 'git remote add -f -t feature blueyed git://github.com/blueyed/hub.git',
      'git checkout -b review blueyed/feature',
      "checkout https://github.com/defunkt/hub/pull/73/files review"
  end

  def test_checkout_pullrequest_existing_remote
    stub_command_output 'remote', "origin\nblueyed"

    stub_request(:get, "http://github.com/api/v2/json/pulls/defunkt/hub/73").
      to_return(:body => mock_pull_response('blueyed:feature'))

    assert_commands 'git remote set-branches --add blueyed feature',
      'git fetch blueyed +refs/heads/feature:refs/remotes/blueyed/feature',
      'git checkout -b blueyed-feature blueyed/feature',
      "checkout https://github.com/defunkt/hub/pull/73/files"
  end

C
Chris Wanstrath 已提交
837
  def test_version
838
    out = hub('--version')
839
    assert_includes "git version 1.7.0.4", out
C
Chris Wanstrath 已提交
840
    assert_includes "hub version #{Hub::Version}", out
C
Chris Wanstrath 已提交
841
  end
C
Chris Wanstrath 已提交
842

843 844 845 846 847 848 849
  def test_exec_path
    out = hub('--exec-path')
    assert_equal "/usr/lib/git-core\n", out
  end

  def test_exec_path_arg
    out = hub('--exec-path=/home/wombat/share/my-l33t-git-core')
850
    assert_equal improved_help_text, out
851 852 853 854 855 856 857
  end

  def test_html_path
    out = hub('--html-path')
    assert_equal "/usr/share/doc/git-doc\n", out
  end

C
Chris Wanstrath 已提交
858
  def test_help
859
    assert_equal improved_help_text, hub("help")
C
Chris Wanstrath 已提交
860 861 862
  end

  def test_help_by_default
863
    assert_equal improved_help_text, hub("")
C
Chris Wanstrath 已提交
864
  end
C
Chris Wanstrath 已提交
865

S
Stephen Celis 已提交
866
  def test_help_with_pager
867
    assert_equal improved_help_text, hub("-p")
S
Stephen Celis 已提交
868 869
  end

C
Chris Wanstrath 已提交
870 871 872 873
  def test_help_hub
    help_manpage = hub("help hub")
    assert_includes "git + hub = github", help_manpage
    assert_includes <<-config, help_manpage
C
Chris Wanstrath 已提交
874
Use git-config(1) to display the currently configured GitHub username:
C
Chris Wanstrath 已提交
875 876 877 878
config
  end

  def test_help_hub_no_groff
879 880
    stub_available_commands()
    assert_equal "** Can't find groff(1)\n", hub("help hub")
C
Chris Wanstrath 已提交
881
  end
882

883 884 885 886 887
  def test_hub_standalone
    help_standalone = hub("hub standalone")
    assert_equal Hub::Standalone.build, help_standalone
  end

C
Chris Wanstrath 已提交
888 889
  def test_hub_compare
    assert_command "compare refactor",
890
      "open https://github.com/defunkt/hub/compare/refactor"
891
  end
C
Chris Wanstrath 已提交
892

893 894 895 896
  def test_hub_compare_nothing
    expected = "Usage: hub compare [USER] [<START>...]<END>\n"
    assert_equal expected, hub("compare")
  end
C
Chris Wanstrath 已提交
897

898 899 900 901 902 903 904 905
  def test_hub_compare_tracking_nothing
    stub_tracking_nothing
    expected = "Usage: hub compare [USER] [<START>...]<END>\n"
    assert_equal expected, hub("compare")
  end

  def test_hub_compare_tracking_branch
    stub_branch('refs/heads/feature')
906
    stub_tracking('feature', 'mislav', 'experimental')
907 908

    assert_command "compare",
909
      "open https://github.com/mislav/hub/compare/experimental"
910 911
  end

912
  def test_hub_compare_range
C
Chris Wanstrath 已提交
913
    assert_command "compare 1.0...fix",
914
      "open https://github.com/defunkt/hub/compare/1.0...fix"
915
  end
C
Chris Wanstrath 已提交
916

917 918 919 920 921 922 923 924 925 926 927 928 929 930 931
  def test_hub_compare_range_fixes_two_dots_for_tags
    assert_command "compare 1.0..fix",
      "open https://github.com/defunkt/hub/compare/1.0...fix"
  end

  def test_hub_compare_range_fixes_two_dots_for_shas
    assert_command "compare 1234abc..3456cde",
      "open https://github.com/defunkt/hub/compare/1234abc...3456cde"
  end

  def test_hub_compare_range_ignores_two_dots_for_complex_ranges
    assert_command "compare @{a..b}..@{c..d}",
      "open https://github.com/defunkt/hub/compare/@{a..b}..@{c..d}"
  end

932 933 934 935 936 937
  def test_hub_compare_on_wiki
    stub_repo_url 'git://github.com/defunkt/hub.wiki.git'
    assert_command "compare 1.0...fix",
      "open https://github.com/defunkt/hub/wiki/_compare/1.0...fix"
  end

938
  def test_hub_compare_fork
C
Chris Wanstrath 已提交
939
    assert_command "compare myfork feature",
940
      "open https://github.com/myfork/hub/compare/feature"
941 942 943 944
  end

  def test_hub_compare_url
    assert_command "compare -u 1.0...1.1",
945
      "echo https://github.com/defunkt/hub/compare/1.0...1.1"
946 947 948
  end

  def test_hub_browse
949
    assert_command "browse mojombo/bert", "open https://github.com/mojombo/bert"
950 951
  end

952 953 954 955
  def test_hub_browse_commit
    assert_command "browse mojombo/bert commit/5d5582", "open https://github.com/mojombo/bert/commit/5d5582"
  end

956 957
  def test_hub_browse_tracking_nothing
    stub_tracking_nothing
958
    assert_command "browse mojombo/bert", "open https://github.com/mojombo/bert"
959 960
  end

961
  def test_hub_browse_url
962
    assert_command "browse -u mojombo/bert", "echo https://github.com/mojombo/bert"
963 964
  end

965
  def test_hub_browse_self
966
    assert_command "browse resque", "open https://github.com/tpw/resque"
967 968
  end

969 970
  def test_hub_browse_subpage
    assert_command "browse resque commits",
971
      "open https://github.com/tpw/resque/commits/master"
972
    assert_command "browse resque issues",
973
      "open https://github.com/tpw/resque/issues"
974
    assert_command "browse resque wiki",
975
      "open https://github.com/tpw/resque/wiki"
976 977 978 979
  end

  def test_hub_browse_on_branch
    stub_branch('refs/heads/feature')
980
    stub_tracking('feature', 'mislav', 'experimental')
981

982
    assert_command "browse resque", "open https://github.com/tpw/resque"
983
    assert_command "browse resque commits",
984
      "open https://github.com/tpw/resque/commits/master"
985 986

    assert_command "browse",
987
      "open https://github.com/mislav/hub/tree/experimental"
988
    assert_command "browse -- tree",
989
      "open https://github.com/mislav/hub/tree/experimental"
990
    assert_command "browse -- commits",
991
      "open https://github.com/mislav/hub/commits/experimental"
992
  end
993

994
  def test_hub_browse_current
995 996
    assert_command "browse", "open https://github.com/defunkt/hub"
    assert_command "browse --", "open https://github.com/defunkt/hub"
997 998
  end

999 1000 1001 1002
  def test_hub_browse_commit_from_current
    assert_command "browse -- commit/6616e4", "open https://github.com/defunkt/hub/commit/6616e4"
  end

1003 1004 1005 1006 1007 1008 1009
  def test_hub_browse_no_tracking
    stub_tracking_nothing
    assert_command "browse", "open https://github.com/defunkt/hub"
  end

  def test_hub_browse_no_tracking_on_branch
    stub_branch('refs/heads/feature')
1010
    stub_tracking_nothing('feature')
1011 1012 1013
    assert_command "browse", "open https://github.com/defunkt/hub"
  end

1014 1015 1016 1017 1018 1019 1020 1021 1022
  def test_hub_browse_current_wiki
    stub_repo_url 'git://github.com/defunkt/hub.wiki.git'

    assert_command "browse", "open https://github.com/defunkt/hub/wiki"
    assert_command "browse -- wiki", "open https://github.com/defunkt/hub/wiki"
    assert_command "browse -- commits", "open https://github.com/defunkt/hub/wiki/_history"
    assert_command "browse -- pages", "open https://github.com/defunkt/hub/wiki/_pages"
  end

1023 1024
  def test_hub_browse_current_subpage
    assert_command "browse -- network",
1025
      "open https://github.com/defunkt/hub/network"
1026
    assert_command "browse -- anything/everything",
1027
      "open https://github.com/defunkt/hub/anything/everything"
1028 1029
  end

1030 1031 1032 1033
  def test_hub_browse_deprecated_private
    with_browser_env('echo') do
      assert_includes "Warning: the `-p` flag has no effect anymore\n", hub("browse -p defunkt/hub")
    end
1034 1035
  end

1036 1037 1038
  def test_hub_browse_no_repo
    stub_repo_url(nil)
    assert_equal "Usage: hub browse [<USER>/]<REPOSITORY>\n", hub("browse")
1039
  end
1040 1041 1042 1043 1044 1045 1046 1047 1048 1049

  def test_custom_browser
    with_browser_env("custom") do
      assert_browser("custom")
    end
  end

  def test_linux_browser
    stub_available_commands "open", "xdg-open", "cygstart"
    with_browser_env(nil) do
1050
      with_host_os("i686-linux") do
1051 1052 1053 1054 1055 1056 1057 1058
        assert_browser("xdg-open")
      end
    end
  end

  def test_cygwin_browser
    stub_available_commands "open", "cygstart"
    with_browser_env(nil) do
1059
      with_host_os("i686-linux") do
1060 1061 1062 1063 1064 1065 1066 1067 1068
        assert_browser("cygstart")
      end
    end
  end

  def test_no_browser
    stub_available_commands()
    expected = "Please set $BROWSER to a web launcher to use this command.\n"
    with_browser_env(nil) do
1069
      with_host_os("i686-linux") do
1070 1071 1072 1073 1074
        assert_equal expected, hub("browse")
      end
    end
  end

1075
  def test_context_method_doesnt_hijack_git_command
1076
    assert_forwarded 'remotes'
1077 1078
  end

1079 1080 1081 1082 1083
  def test_not_choking_on_ruby_methods
    assert_forwarded 'id'
    assert_forwarded 'name'
  end

1084 1085
  def test_multiple_remote_urls
    stub_repo_url("git://example.com/other.git\ngit://github.com/my/repo.git")
1086
    assert_command "browse", "open https://github.com/my/repo"
1087 1088
  end

1089 1090 1091
  def test_global_flags_preserved
    cmd = '--no-pager --bare -c core.awesome=true -c name=value --git-dir=/srv/www perform'
    assert_command cmd, 'git --bare -c core.awesome=true -c name=value --git-dir=/srv/www --no-pager perform'
1092
    assert_equal %w[git --bare -c core.awesome=true -c name=value --git-dir=/srv/www], git_reader.executable
1093 1094
  end

1095 1096
  protected

1097
    def stub_github_user(name)
1098
      stub_config_value 'github.user', name
1099 1100
    end

1101
    def stub_github_token(token)
1102
      stub_config_value 'github.token', token
1103 1104
    end

M
Mislav Marohnić 已提交
1105 1106
    def stub_repo_url(value, remote_name = 'origin')
      stub_config_value "remote.#{remote_name}.url", value, '--get-all'
1107 1108 1109
    end

    def stub_branch(value)
1110
      stub_command_output 'symbolic-ref -q HEAD', value
1111 1112
    end

1113
    def stub_tracking(from, remote_name, remote_branch)
1114 1115
      stub_command_output "rev-parse --symbolic-full-name #{from}@{upstream}",
        remote_branch ? "refs/remotes/#{remote_name}/#{remote_branch}" : nil
1116 1117
    end

1118 1119
    def stub_tracking_nothing(from = 'master')
      stub_tracking(from, nil, nil)
1120 1121
    end

1122
    def stub_remotes_group(name, value)
1123
      stub_config_value "remotes.#{name}", value
1124 1125
    end

1126
    def stub_no_remotes
1127
      stub_command_output 'remote', nil
1128 1129 1130
    end

    def stub_no_git_repo
1131
      stub_command_output 'rev-parse -q --git-dir', nil
1132 1133
    end

M
Mislav Marohnić 已提交
1134
    def stub_alias(name, value)
1135
      stub_config_value "alias.#{name}", value
M
Mislav Marohnić 已提交
1136 1137
    end

1138 1139
    def stub_existing_fork(user, repo = 'hub')
      stub_fork(user, repo, 200)
1140 1141
    end

1142 1143
    def stub_nonexisting_fork(user, repo = 'hub')
      stub_fork(user, repo, 404)
1144 1145
    end

1146 1147
    def stub_fork(user, repo, status)
      stub_request(:get, "github.com/api/v2/yaml/repos/show/#{user}/#{repo}").
1148 1149 1150
        to_return(:status => status)
    end

1151 1152 1153 1154
    def stub_available_commands(*names)
      COMMANDS.replace names
    end

1155
    def stub_https_is_preferred
1156
      stub_config_value 'hub.protocol', 'https'
1157 1158
    end

1159 1160 1161 1162 1163 1164 1165
    def with_browser_env(value)
      browser, ENV['BROWSER'] = ENV['BROWSER'], value
      yield
    ensure
      ENV['BROWSER'] = browser
    end

1166 1167 1168 1169 1170 1171 1172
    def with_tmpdir(value)
      dir, ENV['TMPDIR'] = ENV['TMPDIR'], value
      yield
    ensure
      ENV['TMPDIR'] = dir
    end

1173
    def assert_browser(browser)
1174
      assert_command "browse", "#{browser} https://github.com/defunkt/hub"
1175 1176
    end

1177 1178 1179 1180 1181 1182 1183 1184
    def with_host_os(value)
      host_os = RbConfig::CONFIG['host_os']
      RbConfig::CONFIG['host_os'] = value
      begin
        yield
      ensure
        RbConfig::CONFIG['host_os'] = host_os
      end
1185 1186
    end

1187
    def auth(user = git_config('github.user'), password = git_config('github.token'))
1188 1189 1190
      "#{user}%2Ftoken:#{password}@"
    end

1191 1192 1193 1194 1195 1196
    def mock_pullreq_response(id, name_with_owner = 'defunkt/hub')
      YAML.dump('pull' => {
        'html_url' => "https://github.com/#{name_with_owner}/pull/#{id}"
      })
    end

1197 1198 1199 1200
    def mock_pull_response(label)
      JSON.generate('pull' => { 'head' => {'label' => label} })
    end

1201 1202 1203 1204
    def improved_help_text
      Hub::Commands.send :improved_help_text
    end

C
Chris Wanstrath 已提交
1205
end