hub_test.rb 25.3 KB
Newer Older
1 2
$LOAD_PATH.unshift File.dirname(__FILE__)
require 'helper'
3
require 'webmock/test_unit'
C
Chris Wanstrath 已提交
4

5 6 7 8 9 10
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 已提交
11
class HubTest < Test::Unit::TestCase
12 13 14 15 16
  if defined? WebMock::API
    include WebMock::API
  else
    include WebMock
  end
C
Chris Wanstrath 已提交
17

18 19 20 21 22 23 24 25 26
  COMMANDS = []

  Hub::Commands.class_eval do
    remove_method :command?
    define_method :command? do |name|
      COMMANDS.include?(name)
    end
  end

27
  def setup
28
    COMMANDS.replace %w[open groff]
29
    Hub::Context::DIRNAME.replace 'hub'
30
    Hub::Context::REMOTES.clear
31

32
    @git = Hub::Context::GIT_CONFIG.replace(Hash.new { |h, k|
M
Mislav Marohnić 已提交
33 34 35
      unless k.index('config alias.') == 0
        raise ArgumentError, "`git #{k}` not stubbed"
      end
36
    }).update(
37
      'remote' => "mislav\norigin",
38 39 40
      'symbolic-ref -q HEAD' => 'refs/heads/master',
      'config github.user'   => 'tpw',
      'config github.token'  => 'abc123',
41 42
      'config --get-all remote.origin.url' => 'git://github.com/defunkt/hub.git',
      'config --get-all remote.mislav.url' => 'git://github.com/mislav/hub.git',
43 44 45 46
      'config branch.master.remote'  => 'origin',
      'config branch.master.merge'   => 'refs/heads/master',
      'config branch.feature.remote' => 'mislav',
      'config branch.feature.merge'  => 'refs/heads/experimental',
47 48
      'config --bool hub.http-clone' => 'false',
      'config core.repositoryformatversion' => '0'
49
    )
50
    super
51 52
  end

C
Chris Wanstrath 已提交
53
  def test_private_clone
54 55
    input   = "clone -p rtomayko/ronn"
    command = "git clone git@github.com:rtomayko/ronn.git"
C
Chris Wanstrath 已提交
56
    assert_command input, command
C
Chris Wanstrath 已提交
57 58 59
  end

  def test_public_clone
60 61
    input   = "clone rtomayko/ronn"
    command = "git clone git://github.com/rtomayko/ronn.git"
C
Chris Wanstrath 已提交
62
    assert_command input, command
C
Chris Wanstrath 已提交
63 64
  end

65 66 67 68 69 70 71 72 73 74 75 76
  def test_your_private_clone
    input   = "clone -p resque"
    command = "git clone git@github.com:tpw/resque.git"
    assert_command input, command
  end

  def test_your_public_clone
    input   = "clone resque"
    command = "git clone git://github.com/tpw/resque.git"
    assert_command input, command
  end

77 78 79
  def test_clone_with_arguments
    input   = "clone --bare -o master resque"
    command = "git clone --bare -o master git://github.com/tpw/resque.git"
80 81 82
    assert_command input, command
  end

83 84 85 86
  def test_clone_with_arguments_and_destination
    assert_forwarded "clone --template=one/two git://github.com/tpw/resque.git --origin master resquetastic"
  end

87 88
  def test_your_private_clone_fails_without_config
    out = hub("clone -p mustache") do
89
      stub_github_user(nil)
90 91
    end

92
    assert_equal "** No GitHub user set. See http://help.github.com/git-email-settings/\n", out
93 94 95 96
  end

  def test_your_public_clone_fails_without_config
    out = hub("clone mustache") do
97
      stub_github_user(nil)
98 99
    end

100
    assert_equal "** No GitHub user set. See http://help.github.com/git-email-settings/\n", out
101 102
  end

103
  def test_private_clone_left_alone
104
    assert_forwarded "clone git@github.com:rtomayko/ronn.git"
105 106 107
  end

  def test_public_clone_left_alone
108
    assert_forwarded "clone git://github.com/rtomayko/ronn.git"
109
  end
C
Chris Wanstrath 已提交
110 111

  def test_normal_public_clone_with_path
112
    assert_forwarded "clone git://github.com/rtomayko/ronn.git ronn-dev"
C
Chris Wanstrath 已提交
113
  end
114 115

  def test_normal_clone_from_path
116
    assert_forwarded "clone ./test"
117
  end
118

M
Mislav Marohnić 已提交
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
  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

138 139 140 141 142 143 144 145 146 147 148 149
  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

150 151 152 153 154 155
  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

156
  def test_remote_from_rel_path
157
    assert_forwarded "remote add origin ./path"
158 159 160
  end

  def test_remote_from_abs_path
161
    assert_forwarded "remote add origin /path"
162 163
  end

164
  def test_private_remote_origin_as_normal
165
    assert_forwarded "remote add origin git@github.com:defunkt/resque.git"
C
Chris Wanstrath 已提交
166 167
  end

S
Stephen Celis 已提交
168 169
  def test_public_submodule
    input   = "submodule add wycats/bundler vendor/bundler"
J
Justin Ridgewell 已提交
170 171
    command = "git submodule add git://github.com/wycats/bundler.git vendor/bundler"
    assert_command input, command
S
Stephen Celis 已提交
172 173 174 175
  end

  def test_private_submodule
    input   = "submodule add -p grit vendor/grit"
J
Justin Ridgewell 已提交
176 177 178 179 180 181 182 183
    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 已提交
184 185 186 187 188
  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 已提交
189
    assert_command input, command
S
Stephen Celis 已提交
190 191
  end

C
Chris Wanstrath 已提交
192
  def test_private_remote
193
    input   = "remote add -p rtomayko"
C
Chris Wanstrath 已提交
194 195
    command = "git remote add rtomayko git@github.com:rtomayko/hub.git"
    assert_command input, command
C
Chris Wanstrath 已提交
196 197 198
  end

  def test_public_remote
199
    input   = "remote add rtomayko"
C
Chris Wanstrath 已提交
200 201
    command = "git remote add rtomayko git://github.com/rtomayko/hub.git"
    assert_command input, command
C
Chris Wanstrath 已提交
202 203
  end

C
Chris Wanstrath 已提交
204 205 206 207 208 209
  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

210 211 212 213 214 215
  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

216 217 218 219 220 221
  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 已提交
222
  def test_private_remote_with_repo
223 224
    input   = "remote add -p jashkenas/coffee-script"
    command = "git remote add jashkenas git@github.com:jashkenas/coffee-script.git"
C
Chris Wanstrath 已提交
225 226 227 228
    assert_command input, command
  end

  def test_public_remote_with_repo
229 230
    input   = "remote add jashkenas/coffee-script"
    command = "git remote add jashkenas git://github.com/jashkenas/coffee-script.git"
231 232 233 234
    assert_command input, command
  end

  def test_public_remote_f_with_repo
235 236
    input   = "remote add -f jashkenas/coffee-script"
    command = "git remote add -f jashkenas git://github.com/jashkenas/coffee-script.git"
C
Chris Wanstrath 已提交
237 238 239
    assert_command input, command
  end

240
  def test_named_private_remote_with_repo
241 242
    input   = "remote add -p origin jashkenas/coffee-script"
    command = "git remote add origin git@github.com:jashkenas/coffee-script.git"
243 244 245
    assert_command input, command
  end

246
  def test_fetch_existing_remote
247
    assert_forwarded "fetch mislav"
248 249 250 251 252 253
  end

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

254 255 256
    assert_commands "git remote add xoebus git://github.com/xoebus/hub.git",
                    "git fetch xoebus",
                    "fetch xoebus"
257 258 259 260 261 262
  end

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

263 264 265
    assert_commands "git remote add xoebus git://github.com/xoebus/hub.git",
                    "git fetch --depth=1 --prune xoebus",
                    "fetch --depth=1 --prune xoebus"
266 267 268 269 270 271 272 273
  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')

274 275 276 277
    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"
278 279 280 281 282 283 284 285
  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')

286 287 288 289
    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"
290 291 292 293 294 295 296 297 298 299 300 301 302 303
  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
304 305 306
    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"
307 308
  end

309
  def test_cherry_pick
310
    assert_forwarded "cherry-pick a319d88"
311 312 313
  end

  def test_cherry_pick_url
314
    url = 'http://github.com/mislav/hub/commit/a319d88'
315
    assert_commands "git fetch mislav", "git cherry-pick a319d88", "cherry-pick #{url}"
316 317
  end

318 319
  def test_cherry_pick_url_with_fragment
    url = 'http://github.com/mislav/hub/commit/abcdef0123456789#comments'
320
    assert_commands "git fetch mislav", "git cherry-pick abcdef0123456789", "cherry-pick #{url}"
321 322
  end

323 324
  def test_cherry_pick_url_with_remote_add
    url = 'https://github.com/xoebus/hub/commit/a319d88'
325
    assert_commands "git remote add -f xoebus git://github.com/xoebus/hub.git",
326 327
                    "git cherry-pick a319d88",
                    "cherry-pick #{url}"
328 329 330 331
  end

  def test_cherry_pick_origin_url
    url = 'https://github.com/defunkt/hub/commit/a319d88'
332
    assert_commands "git fetch origin", "git cherry-pick a319d88", "cherry-pick #{url}"
333 334 335
  end

  def test_cherry_pick_github_user_notation
336
    assert_commands "git fetch mislav", "git cherry-pick a319d88", "cherry-pick mislav@a319d88"
337 338 339 340
  end

  def test_cherry_pick_github_user_repo_notation
    # not supported
341
    assert_forwarded "cherry-pick mislav/hubbub@a319d88"
342 343 344
  end

  def test_cherry_pick_github_notation_too_short
345
    assert_forwarded "cherry-pick mislav@a319"
346 347 348
  end

  def test_cherry_pick_github_notation_with_remote_add
349 350 351
    assert_commands "git remote add -f xoebus git://github.com/xoebus/hub.git",
                    "git cherry-pick a319d88",
                    "cherry-pick xoebus@a319d88"
352 353
  end

354 355 356 357 358 359 360 361 362
  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"
363 364 365

      cmd = Hub("am https://github.com/defunkt/hub/pull/55/files").command
      assert_includes '/pull/55.patch', cmd
366 367 368 369 370 371 372 373 374 375 376 377 378
    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

379 380 381 382 383 384 385 386 387 388
  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

C
Chris Wanstrath 已提交
389
  def test_init
390
    assert_commands "git init", "git remote add origin git@github.com:tpw/hub.git", "init -g"
391 392 393 394
  end

  def test_init_no_login
    out = hub("init -g") do
395
      stub_github_user(nil)
396 397
    end

398
    assert_equal "** No GitHub user set. See http://help.github.com/git-email-settings/\n", out
C
Chris Wanstrath 已提交
399 400
  end

401
  def test_push_two
402 403
    assert_commands "git push origin cool-feature", "git push staging cool-feature",
                    "push origin,staging cool-feature"
404 405
  end

C
Chris Wanstrath 已提交
406
  def test_push_more
407 408 409 410
    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 已提交
411
  end
C
Chris Wanstrath 已提交
412

413
  def test_create
414
    stub_no_remotes
415
    stub_nonexisting_fork('tpw')
416 417 418
    stub_request(:post, "github.com/api/v2/yaml/repos/create").
      with(:body => { 'login'=>'tpw', 'token'=>'abc123', 'name' => 'hub' })

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

424 425 426 427 428 429 430 431 432 433
  def test_create_failed
    stub_no_remotes
    stub_nonexisting_fork('tpw')
    stub_request(:post, "github.com/api/v2/yaml/repos/create").
      to_return(:status => [401, "Your token is fail"])

    expected = "error creating repository: Your token is fail (HTTP 401)\n"
    assert_equal expected, hub("create") { ENV['GIT'] = 'echo' }
  end

434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
  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'

    stub_request(:post, "github.com/api/v2/yaml/repos/create").
      with(:body => { 'login'=>'mojombo', 'token'=>'123abc', 'name' => 'hub' })

    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

455
  def test_create_private_repository
456
    stub_no_remotes
457
    stub_nonexisting_fork('tpw')
458 459 460
    stub_request(:post, "github.com/api/v2/yaml/repos/create").
      with(:body => { 'login'=>'tpw', 'token'=>'abc123', 'name' => 'hub', 'public' => '0' })

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

466
  def test_create_with_description_and_homepage
467
    stub_no_remotes
468
    stub_nonexisting_fork('tpw')
469 470 471 472 473
    stub_request(:post, "github.com/api/v2/yaml/repos/create").with(:body => {
      'login'=>'tpw', 'token'=>'abc123', 'name' => 'hub',
      'description' => 'toyproject', 'homepage' => 'http://example.com'
    })

474
    expected = "remote add -f origin git@github.com:tpw/hub.git\n"
475
    expected << "created repository: tpw/hub\n"
476
    assert_equal expected, hub("create -d toyproject -h http://example.com") { ENV['GIT'] = 'echo' }
477 478 479
  end

  def test_create_with_existing_repository
480
    stub_no_remotes
481 482 483 484
    stub_existing_fork('tpw')

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

489
  def test_create_no_user
490
    stub_no_remotes
491 492 493
    out = hub("create") do
      stub_github_token(nil)
    end
494
    assert_equal "** No GitHub token set. See http://help.github.com/git-email-settings/\n", out
495 496
  end

497
  def test_create_outside_git_repo
498
    stub_no_git_repo
499 500
    assert_equal "'create' must be run from inside a git repository\n", hub("create")
  end
501 502

  def test_create_origin_already_exists
C
Chris Wanstrath 已提交
503
    stub_nonexisting_fork('tpw')
504 505
    stub_request(:post, "github.com/api/v2/yaml/repos/create").
      with(:body => { 'login'=>'tpw', 'token'=>'abc123', 'name' => 'hub' })
C
Chris Wanstrath 已提交
506 507

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

511
  def test_fork
C
Chris Wanstrath 已提交
512
    stub_nonexisting_fork('tpw')
513 514
    stub_request(:post, "github.com/api/v2/yaml/repos/fork/defunkt/hub").
      with(:body => { 'login'=>'tpw', 'token'=>'abc123' })
C
Chris Wanstrath 已提交
515

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

521 522 523 524 525 526 527 528 529
  def test_fork_failed
    stub_nonexisting_fork('tpw')
    stub_request(:post, "github.com/api/v2/yaml/repos/fork/defunkt/hub").
      to_return(:status => [500, "Your fork is fail"])

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

530
  def test_fork_no_remote
531
    stub_nonexisting_fork('tpw')
532
    stub_request(:post, "github.com/api/v2/yaml/repos/fork/defunkt/hub")
C
Chris Wanstrath 已提交
533

534 535 536 537
    assert_equal "", hub("fork --no-remote") { ENV['GIT'] = 'echo' }
  end

  def test_fork_already_exists
538
    stub_existing_fork('tpw')
C
Chris Wanstrath 已提交
539

540
    expected = "tpw/hub already exists on GitHub\n"
C
Chris Wanstrath 已提交
541
    expected << "remote add -f tpw git@github.com:tpw/hub.git\n"
542 543 544
    expected << "new remote: tpw\n"
    assert_equal expected, hub("fork") { ENV['GIT'] = 'echo' }
  end
C
Chris Wanstrath 已提交
545

C
Chris Wanstrath 已提交
546
  def test_version
547
    out = hub('--version')
548
    assert_includes "git version 1.7.0.4", out
C
Chris Wanstrath 已提交
549
    assert_includes "hub version #{Hub::Version}", out
C
Chris Wanstrath 已提交
550
  end
C
Chris Wanstrath 已提交
551

552 553 554 555 556 557 558 559 560 561 562 563 564 565 566
  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')
    assert_equal Hub::Commands.improved_help_text, hub("")
  end

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

C
Chris Wanstrath 已提交
567 568 569 570 571 572 573
  def test_help
    assert_equal Hub::Commands.improved_help_text, hub("help")
  end

  def test_help_by_default
    assert_equal Hub::Commands.improved_help_text, hub("")
  end
C
Chris Wanstrath 已提交
574

S
Stephen Celis 已提交
575 576 577 578
  def test_help_with_pager
    assert_equal Hub::Commands.improved_help_text, hub("-p")
  end

C
Chris Wanstrath 已提交
579 580 581 582
  def test_help_hub
    help_manpage = hub("help hub")
    assert_includes "git + hub = github", help_manpage
    assert_includes <<-config, help_manpage
C
Chris Wanstrath 已提交
583
Use git-config(1) to display the currently configured GitHub username:
C
Chris Wanstrath 已提交
584 585 586 587
config
  end

  def test_help_hub_no_groff
588 589
    stub_available_commands()
    assert_equal "** Can't find groff(1)\n", hub("help hub")
C
Chris Wanstrath 已提交
590
  end
591

592 593 594 595 596
  def test_hub_standalone
    help_standalone = hub("hub standalone")
    assert_equal Hub::Standalone.build, help_standalone
  end

C
Chris Wanstrath 已提交
597 598
  def test_hub_compare
    assert_command "compare refactor",
599
      "open https://github.com/defunkt/hub/compare/refactor"
600
  end
C
Chris Wanstrath 已提交
601

602 603 604 605
  def test_hub_compare_nothing
    expected = "Usage: hub compare [USER] [<START>...]<END>\n"
    assert_equal expected, hub("compare")
  end
C
Chris Wanstrath 已提交
606

607 608 609 610 611 612 613 614 615 616
  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')

    assert_command "compare",
617
      "open https://github.com/mislav/hub/compare/experimental"
618 619
  end

620
  def test_hub_compare_range
C
Chris Wanstrath 已提交
621
    assert_command "compare 1.0...fix",
622
      "open https://github.com/defunkt/hub/compare/1.0...fix"
623
  end
C
Chris Wanstrath 已提交
624

625 626 627 628 629 630
  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

631
  def test_hub_compare_fork
C
Chris Wanstrath 已提交
632
    assert_command "compare myfork feature",
633
      "open https://github.com/myfork/hub/compare/feature"
634 635 636 637
  end

  def test_hub_compare_url
    assert_command "compare -u 1.0...1.1",
638
      "echo https://github.com/defunkt/hub/compare/1.0...1.1"
639 640 641
  end

  def test_hub_browse
642
    assert_command "browse mojombo/bert", "open https://github.com/mojombo/bert"
643 644
  end

645 646
  def test_hub_browse_tracking_nothing
    stub_tracking_nothing
647
    assert_command "browse mojombo/bert", "open https://github.com/mojombo/bert"
648 649
  end

650
  def test_hub_browse_url
651
    assert_command "browse -u mojombo/bert", "echo https://github.com/mojombo/bert"
652 653
  end

654
  def test_hub_browse_self
655
    assert_command "browse resque", "open https://github.com/tpw/resque"
656 657
  end

658 659
  def test_hub_browse_subpage
    assert_command "browse resque commits",
660
      "open https://github.com/tpw/resque/commits/master"
661
    assert_command "browse resque issues",
662
      "open https://github.com/tpw/resque/issues"
663
    assert_command "browse resque wiki",
664
      "open https://github.com/tpw/resque/wiki"
665 666 667 668 669
  end

  def test_hub_browse_on_branch
    stub_branch('refs/heads/feature')

670
    assert_command "browse resque", "open https://github.com/tpw/resque"
671
    assert_command "browse resque commits",
672
      "open https://github.com/tpw/resque/commits/master"
673 674

    assert_command "browse",
675
      "open https://github.com/mislav/hub/tree/experimental"
676
    assert_command "browse -- tree",
677
      "open https://github.com/mislav/hub/tree/experimental"
678
    assert_command "browse -- commits",
679
      "open https://github.com/mislav/hub/commits/experimental"
680
  end
681

682
  def test_hub_browse_current
683 684
    assert_command "browse", "open https://github.com/defunkt/hub"
    assert_command "browse --", "open https://github.com/defunkt/hub"
685 686
  end

687 688 689 690 691 692 693 694 695
  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

696 697
  def test_hub_browse_current_subpage
    assert_command "browse -- network",
698
      "open https://github.com/defunkt/hub/network"
699
    assert_command "browse -- anything/everything",
700
      "open https://github.com/defunkt/hub/anything/everything"
701 702
  end

703 704 705 706
  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
707 708
  end

709 710 711
  def test_hub_browse_no_repo
    stub_repo_url(nil)
    assert_equal "Usage: hub browse [<USER>/]<REPOSITORY>\n", hub("browse")
712
  end
713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747

  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
      with_ruby_platform("i686-linux") do
        assert_browser("xdg-open")
      end
    end
  end

  def test_cygwin_browser
    stub_available_commands "open", "cygstart"
    with_browser_env(nil) do
      with_ruby_platform("i686-linux") do
        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
      with_ruby_platform("i686-linux") do
        assert_equal expected, hub("browse")
      end
    end
  end

748
  def test_context_method_doesnt_hijack_git_command
749
    assert_forwarded 'remotes'
750 751
  end

752 753 754 755 756
  def test_not_choking_on_ruby_methods
    assert_forwarded 'id'
    assert_forwarded 'name'
  end

757 758
  def test_multiple_remote_urls
    stub_repo_url("git://example.com/other.git\ngit://github.com/my/repo.git")
759
    assert_command "browse", "open https://github.com/my/repo"
760 761
  end

762 763
  protected

764 765 766 767
    def stub_github_user(name)
      @git['config github.user'] = name
    end

768 769 770 771
    def stub_github_token(token)
      @git['config github.token'] = token
    end

772
    def stub_repo_url(value)
773
      @git['config --get-all remote.origin.url'] = value
774 775 776 777 778 779 780 781 782 783 784 785
      Hub::Context::REMOTES.clear
    end

    def stub_branch(value)
      @git['symbolic-ref -q HEAD'] = value
    end

    def stub_tracking_nothing
      @git['config branch.master.remote'] = nil
      @git['config branch.master.merge'] = nil
    end

786 787 788 789
    def stub_remotes_group(name, value)
      @git["config remotes.#{name}"] = value
    end

790 791 792 793 794 795 796 797
    def stub_no_remotes
      @git['remote'] = ''
    end

    def stub_no_git_repo
      @git.replace({})
    end

M
Mislav Marohnić 已提交
798 799 800 801
    def stub_alias(name, value)
      @git["config alias.#{name}"] = value
    end

802 803 804 805 806 807 808 809 810 811 812 813 814
    def stub_existing_fork(user)
      stub_fork(user, 200)
    end

    def stub_nonexisting_fork(user)
      stub_fork(user, 404)
    end

    def stub_fork(user, status)
      stub_request(:get, "github.com/api/v2/yaml/repos/show/#{user}/hub").
        to_return(:status => status)
    end

815 816 817 818 819 820 821 822 823 824 825
    def stub_available_commands(*names)
      COMMANDS.replace names
    end

    def with_browser_env(value)
      browser, ENV['BROWSER'] = ENV['BROWSER'], value
      yield
    ensure
      ENV['BROWSER'] = browser
    end

826 827 828 829 830 831 832
    def with_tmpdir(value)
      dir, ENV['TMPDIR'] = ENV['TMPDIR'], value
      yield
    ensure
      ENV['TMPDIR'] = dir
    end

833
    def assert_browser(browser)
834
      assert_command "browse", "#{browser} https://github.com/defunkt/hub"
835 836 837 838 839 840 841 842 843 844 845 846
    end

    def with_ruby_platform(value)
      platform = RUBY_PLATFORM
      Object.send(:remove_const, :RUBY_PLATFORM)
      Object.const_set(:RUBY_PLATFORM, value)
      yield
    ensure
      Object.send(:remove_const, :RUBY_PLATFORM)
      Object.const_set(:RUBY_PLATFORM, platform)
    end

C
Chris Wanstrath 已提交
847
end