PageRenderTime 50ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/test/functional/bitbucket_hook_controller_test.rb

https://bitbucket.org/raindrop/redmine-bitbucket
Ruby | 102 lines | 86 code | 15 blank | 1 comment | 2 complexity | ea950abb16306da7fea3969a592d559e MD5 | raw file
  1. require File.dirname(__FILE__) + '/../test_helper'
  2. require 'mocha'
  3. class BitbucketHookControllerTest < ActionController::TestCase
  4. def setup
  5. # Sample JSON post from http://confluence.atlassian.com/display/BBDEV/Writing+Brokers+for+Bitbucket#the-payload
  6. @json = <<-EOF
  7. {"broker": "twitter",
  8. "commits": [{ "author": "jespern",
  9. "files": [{"file": "media/css/layout.css",
  10. "type": "modified"},
  11. {"file": "apps/bb/views.py",
  12. "type": "modified"},
  13. {"file": "templates/issues/issue.html",
  14. "type": "modified"}],
  15. "message": "adding bump button, issue #206 fixed",
  16. "node": "e71c63bcc05e",
  17. "revision": 1650,
  18. "size": 684}],
  19. "repository": { "absolute_url": "/jespern/bitbucket/",
  20. "name": "bitbucket",
  21. "owner": "jespern",
  22. "slug": "bitbucket",
  23. "website": "http://bitbucket.org/"},
  24. "service": {"password": "bar", "username": "foo"}}
  25. EOF
  26. @repository = Repository::Mercurial.new
  27. @repository.stubs(:fetch_changesets).returns(true)
  28. @project = Project.new
  29. @project.stubs(:repository).returns(@repository)
  30. Project.stubs(:find_by_identifier).with('bitbucket').returns(@project)
  31. @controller = BitbucketHookController.new
  32. @controller.stubs(:exec)
  33. Repository.expects(:fetch_changesets).never
  34. end
  35. def do_post(payload = nil)
  36. payload = @json if payload.nil?
  37. payload = payload.to_json if payload.is_a?(Hash)
  38. post :index, :payload => payload
  39. end
  40. def test_should_use_the_repository_name_as_project_identifier
  41. Project.expects(:find_by_identifier).with('bitbucket').returns(@project)
  42. do_post
  43. end
  44. def test_should_update_the_repository_using_hg_on_the_commandline
  45. Project.expects(:find_by_identifier).with('bitbucket').returns(@project)
  46. @controller.expects(:exec).returns(true)
  47. do_post
  48. end
  49. def test_should_render_ok_when_done
  50. do_post
  51. assert_response :success
  52. assert_equal 'OK', @response.body
  53. end
  54. def test_should_fetch_changesets_into_the_repository
  55. @repository.expects(:fetch_changesets).returns(true)
  56. do_post
  57. assert_response :success
  58. assert_equal 'OK', @response.body
  59. end
  60. def test_should_return_404_if_project_not_found
  61. assert_raises ActiveRecord::RecordNotFound do
  62. Project.expects(:find_by_identifier).with('foobar').returns(nil)
  63. do_post :repository => {:name => 'foobar'}
  64. end
  65. end
  66. def test_should_return_500_if_project_has_no_repository
  67. assert_raises TypeError do
  68. project = mock('project')
  69. project.expects(:repository).returns(nil)
  70. Project.expects(:find_by_identifier).with('bitbucket').returns(project)
  71. do_post :repository => {:name => 'bitbucket'}
  72. end
  73. end
  74. def test_should_return_500_if_repository_is_not_mercurial
  75. assert_raises TypeError do
  76. project = mock('project')
  77. repository = Repository::Subversion.new
  78. project.expects(:repository).at_least(1).returns(repository)
  79. Project.expects(:find_by_identifier).with('bitbucket').returns(project)
  80. do_post :repository => {:name => 'bitbucket'}
  81. end
  82. end
  83. def test_should_not_require_login
  84. @controller.expects(:check_if_login_required).never
  85. do_post
  86. end
  87. end