gitlab-fogbugz 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +21 -0
- data/README.markdown +105 -0
- data/Rakefile +83 -0
- data/TODO +4 -0
- data/bin/gitlab-fogbugz +27 -0
- data/bin/gitlab-fogbugz-server +262 -0
- data/config/config.yml.example +24 -0
- data/lib/fogbugz_listener.rb +64 -0
- data/lib/fogbugz_service.rb +105 -0
- data/lib/message_parser.rb +513 -0
- data/lib/message_parser_machine.rb +43 -0
- data/samples/test-fogbugz-url.rb +12 -0
- data/samples/test-receive-commit.rb +33 -0
- data/test/fogbugz_listener_test.rb +62 -0
- data/test/fogbugz_service_case_editing_test.rb +61 -0
- data/test/fogbugz_service_logon_test.rb +47 -0
- data/test/fogbugz_service_test.rb +83 -0
- data/test/message_parser_test.rb +80 -0
- data/test/test_helper.rb +3 -0
- metadata +91 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
require "fogbugz_listener"
|
3
|
+
|
4
|
+
class FogbugzListenerTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@service = mock("fogbugz-service")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_accumulates_fix_plus_case_and_post
|
10
|
+
@listener = FogbugzListener.new(:sha1 => "a1231", :message => "The full commit message, fixes #1111.")
|
11
|
+
@listener.fix
|
12
|
+
@listener.case("1111")
|
13
|
+
@service.expects(:fix).with(:case => "1111", :message => "Commit: a1231\n\nThe full commit message, fixes #1111.")
|
14
|
+
@listener.update_fogbugz(@service)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_accumulates_reopen_plus_case_and_post
|
18
|
+
@listener = FogbugzListener.new(:sha1 => "c829a13", :message => "Reopens #3211")
|
19
|
+
@listener.reopen
|
20
|
+
@listener.case("3211")
|
21
|
+
@service.expects(:reopen).with(:case => "3211", :message => "Commit: c829a13\n\nReopens #3211")
|
22
|
+
@listener.update_fogbugz(@service)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_accumulates_implement_two_cases_and_post
|
26
|
+
@listener = FogbugzListener.new(:sha1 => "c829a13", :message => "Implements #3322 and #7219")
|
27
|
+
@listener.implement
|
28
|
+
@listener.case("3322")
|
29
|
+
@listener.case("7219")
|
30
|
+
@service.expects(:implement).with(:case => "3322", :message => "Commit: c829a13\n\nImplements #3322 and #7219")
|
31
|
+
@service.expects(:implement).with(:case => "7219", :message => "Commit: c829a13\n\nImplements #3322 and #7219")
|
32
|
+
@listener.update_fogbugz(@service)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_adds_link_to_github_in_message_if_repo_in_options
|
36
|
+
@listener = FogbugzListener.new(:sha1 => "c829a13", :message => "Reopens #3211", :commit_url => "http://github.com/johnreilly/github-fogbuz")
|
37
|
+
@listener.reopen
|
38
|
+
@listener.case("3211")
|
39
|
+
@service.expects(:reopen).with(:case => "3211", :message => "Commit: c829a13\nhttp://github.com/johnreilly/github-fogbuz\n\nReopens #3211")
|
40
|
+
@listener.update_fogbugz(@service)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_reference_adds_extra_text_to_link_cases_together
|
44
|
+
@listener = FogbugzListener.new(:sha1 => "c829a13", :message => "Implements #1112, references #9219, #9220", :commit_url => "http://github.com/johnreilly/github-fogbuz")
|
45
|
+
@listener.implement
|
46
|
+
@listener.case("1112")
|
47
|
+
@listener.reference
|
48
|
+
@listener.case("9219")
|
49
|
+
@listener.case("9220")
|
50
|
+
@service.expects(:implement).with(:case => "1112",
|
51
|
+
:message => "Commit: c829a13\nhttp://github.com/johnreilly/github-fogbuz\n\nImplements #1112, references #9219, #9220\n\nReferences case 9219, case 9220")
|
52
|
+
@listener.update_fogbugz(@service)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_reference_only_adds_message_to_proper_case
|
56
|
+
@listener = FogbugzListener.new(:sha1 => "c829a13", :message => "References #3211", :commit_url => "http://github.com/johnreilly/github-fogbuz/commit/c829a13")
|
57
|
+
@listener.reference
|
58
|
+
@listener.case("3211")
|
59
|
+
@service.expects(:append_message).with(:case => "3211", :message => "Commit: c829a13\nhttp://github.com/johnreilly/github-fogbuz/commit/c829a13\n\nReferences #3211")
|
60
|
+
@listener.update_fogbugz(@service)
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
require "fogbugz_service"
|
3
|
+
|
4
|
+
class FogbugzServiceCaseEditingTest < Test::Unit::TestCase
|
5
|
+
TOKEN = "andf09j"
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@service_uri = URI.parse("http://fogbugz.my-service.com/")
|
9
|
+
@service = FogbugzService.new(@service_uri, "/path/to/curl", TOKEN)
|
10
|
+
@service.stubs(:get).returns(REXML::Document.new(VALID_API_RESPONSE))
|
11
|
+
@uri = @service.validate!
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_implement_calls_fogbugz_with_cmd_set_to_resolve_and_status_set_to_implement
|
15
|
+
params = {"cmd" => "resolve", "ixBug" => "2211", "ixStatus" => FogbugzService::STATES[:implemented],
|
16
|
+
"sEvent" => "this is the message", "token" => TOKEN}
|
17
|
+
@service.expects(:get).with(@uri, params).returns(REXML::Document.new(VALID_EDIT_RESPONSE))
|
18
|
+
@service.implement(:case => "2211", :message => "this is the message")
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_fix_calls_fogbugz_with_cmd_set_to_resolve_and_status_set_to_fixed
|
22
|
+
params = {"cmd" => "resolve", "ixBug" => "2211", "ixStatus" => FogbugzService::STATES[:fixed],
|
23
|
+
"sEvent" => "this is the message", "token" => TOKEN}
|
24
|
+
@service.expects(:get).with(@uri, params).returns(REXML::Document.new(VALID_EDIT_RESPONSE))
|
25
|
+
@service.fix(:case => "2211", :message => "this is the message")
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_complete_calls_fogbugz_with_cmd_set_to_resolve_and_status_set_to_completed
|
29
|
+
params = {"cmd" => "resolve", "ixBug" => "2211", "ixStatus" => FogbugzService::STATES[:completed],
|
30
|
+
"sEvent" => "this is the message", "token" => TOKEN}
|
31
|
+
@service.expects(:get).with(@uri, params).returns(REXML::Document.new(VALID_EDIT_RESPONSE))
|
32
|
+
@service.complete(:case => "2211", :message => "this is the message")
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_close_calls_fogbugz_with_cmd_set_to_close
|
36
|
+
params = {"cmd" => "close", "ixBug" => "2211",
|
37
|
+
"sEvent" => "this is the message", "token" => TOKEN}
|
38
|
+
@service.expects(:get).with(@uri, params).returns(REXML::Document.new(VALID_EDIT_RESPONSE))
|
39
|
+
@service.close(:case => "2211", :message => "this is the message")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_append_message_calls_fogbugz_with_cmd_set_to_edit
|
43
|
+
params = {"cmd" => "edit", "ixBug" => "2211",
|
44
|
+
"sEvent" => "this is the message", "token" => TOKEN}
|
45
|
+
@service.expects(:get).with(@uri, params).returns(REXML::Document.new(VALID_EDIT_RESPONSE))
|
46
|
+
@service.append_message(:case => "2211", :message => "this is the message")
|
47
|
+
end
|
48
|
+
|
49
|
+
VALID_API_RESPONSE = <<-API
|
50
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
51
|
+
<response>
|
52
|
+
<version>3</version>
|
53
|
+
<minversion>1</minversion>
|
54
|
+
<url>api.asp?</url>
|
55
|
+
</response>
|
56
|
+
API
|
57
|
+
|
58
|
+
VALID_EDIT_RESPONSE = <<-API
|
59
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
60
|
+
API
|
61
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
require "fogbugz_service"
|
3
|
+
|
4
|
+
class FogbugzServiceLogonTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@service_uri = URI.parse("http://fogbugz.my-service.com/")
|
7
|
+
@service = FogbugzService.new(@service_uri, "/path/to/curl")
|
8
|
+
@service.stubs(:get).returns(REXML::Document.new(VALID_API_RESPONSE))
|
9
|
+
@uri = @service.validate!
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_logon_calls_fogbugz_to_retrieve_token
|
13
|
+
params = {"cmd" => "logon", "email" => "me@my-domain.com", "password" => "my-super-duper-password"}
|
14
|
+
@service.expects(:get).with(@uri, params).returns(REXML::Document.new(VALID_LOGON_RESPONSE))
|
15
|
+
@service.logon("me@my-domain.com", "my-super-duper-password")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_logon_returns_token
|
19
|
+
@service.stubs(:get).returns(REXML::Document.new(VALID_LOGON_RESPONSE))
|
20
|
+
assert_equal "24dsg34lok43un23", @service.logon("me@my-domain.com", "my-super-duper-password")
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_logon_raises_bad_credentials_when_logon_fails
|
24
|
+
@service.stubs(:get).returns(REXML::Document.new(FAILED_LOGON_RESPONSE))
|
25
|
+
assert_raise FogbugzService::BadCredentials do
|
26
|
+
@service.logon("me@my-domain.com", "my-super-duper-password")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
VALID_API_RESPONSE = <<-API
|
31
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
32
|
+
<response>
|
33
|
+
<version>3</version>
|
34
|
+
<minversion>1</minversion>
|
35
|
+
<url>api.asp?</url>
|
36
|
+
</response>
|
37
|
+
API
|
38
|
+
|
39
|
+
VALID_LOGON_RESPONSE = <<-API
|
40
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
41
|
+
<response><token>24dsg34lok43un23</token></response>
|
42
|
+
API
|
43
|
+
|
44
|
+
FAILED_LOGON_RESPONSE = <<-API
|
45
|
+
<response><error code="1">Error Message To Show User</error></response>
|
46
|
+
API
|
47
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
require "fogbugz_service"
|
3
|
+
|
4
|
+
class FogbugzServiceTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@service_uri = URI.parse("http://fogbugz.my-service.com/")
|
7
|
+
@service = FogbugzService.new(@service_uri, "/path/to/curl")
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_validate_connects_to_fogbugz_and_retrieves_the_api_url
|
11
|
+
@service.expects(:get).with(@service_uri.merge("api.xml")).returns(REXML::Document.new(VALID_API_RESPONSE))
|
12
|
+
@service.validate!
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_validate_parses_response_to_find_url
|
16
|
+
@service.stubs(:get).returns(REXML::Document.new(VALID_API_RESPONSE))
|
17
|
+
@service.validate!
|
18
|
+
assert_equal @service_uri.merge("api.asp?"), @service.api_uri
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_validate_returns_the_api_uri
|
22
|
+
@service.stubs(:get).returns(REXML::Document.new(VALID_API_RESPONSE))
|
23
|
+
assert_equal @service_uri.merge("api.asp?"), @service.validate!
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_validate_raises_if_minimum_version_is_not_one
|
27
|
+
@service.stubs(:get).returns(REXML::Document.new(RECENT_API_RESPONSE))
|
28
|
+
assert_raise(FogbugzService::ClientOutOfDate) do
|
29
|
+
@service.validate!
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_validate_raises_if_xhtml_returned
|
34
|
+
@service.stubs(:get).returns(REXML::Document.new(VALID_XHTML_RESPONSE))
|
35
|
+
assert_raise(FogbugzService::BadXml) do
|
36
|
+
@service.validate!
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_validate_does_validation_only_once
|
41
|
+
@service.expects(:get).once.returns(REXML::Document.new(VALID_API_RESPONSE))
|
42
|
+
@service.validate!
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_connect_calls_validate_and_yields
|
46
|
+
@service.expects(:validate!)
|
47
|
+
yielded = false
|
48
|
+
@service.connect do |service|
|
49
|
+
assert_equal service, @service
|
50
|
+
yielded = true
|
51
|
+
end
|
52
|
+
|
53
|
+
assert yielded
|
54
|
+
end
|
55
|
+
|
56
|
+
VALID_API_RESPONSE = <<-API
|
57
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
58
|
+
<response>
|
59
|
+
<version>3</version>
|
60
|
+
<minversion>1</minversion>
|
61
|
+
<url>api.asp?</url>
|
62
|
+
</response>
|
63
|
+
API
|
64
|
+
|
65
|
+
RECENT_API_RESPONSE = <<-API
|
66
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
67
|
+
<response>
|
68
|
+
<version>9</version>
|
69
|
+
<minversion>7</minversion>
|
70
|
+
<url>api.asp?</url>
|
71
|
+
</response>
|
72
|
+
API
|
73
|
+
|
74
|
+
VALID_XHTML_RESPONSE = <<-API
|
75
|
+
<html>
|
76
|
+
<head>
|
77
|
+
<title>Fogbugz API</title>
|
78
|
+
</head>
|
79
|
+
<body>
|
80
|
+
</body>
|
81
|
+
</html>
|
82
|
+
API
|
83
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
require "message_parser"
|
3
|
+
|
4
|
+
class MessageParserTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@listener = mock("listener")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_parse_message_without_fogbugz_data
|
10
|
+
assert_nothing_raised do
|
11
|
+
MessageParser.parse("this is a test", @listener)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_parse_message_with_reference_to_case_notifies_listener_about_case
|
16
|
+
@listener.expects(:reference)
|
17
|
+
@listener.expects(:case).with("1231").once
|
18
|
+
MessageParser.parse("This is a test. References #1231", @listener)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_parse_message_with_closing_case_notifies_listener
|
22
|
+
@listener.expects(:close)
|
23
|
+
@listener.expects(:case).with("3321").once
|
24
|
+
MessageParser.parse("Closes #3321", @listener)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_parse_fixes_with_two_cases_notifies_listener
|
28
|
+
@listener.expects(:fix)
|
29
|
+
@listener.expects(:case).with("3321").once
|
30
|
+
@listener.expects(:case).with("1234").once
|
31
|
+
MessageParser.parse("Fixes #3321, #1234", @listener)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_parse_reopens
|
35
|
+
@listener.expects(:reopen)
|
36
|
+
@listener.expects(:case).with("1234").once
|
37
|
+
MessageParser.parse("Reopens #1234", @listener)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_parse_implements
|
41
|
+
@listener.expects(:implement)
|
42
|
+
@listener.expects(:case).with("1334").once
|
43
|
+
MessageParser.parse("Implements #1334", @listener)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_parse_completes
|
47
|
+
@listener.expects(:complete)
|
48
|
+
@listener.expects(:case).with("1334").once
|
49
|
+
MessageParser.parse("Completes #1334", @listener)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_parse_bugzid_1
|
53
|
+
@listener.expects(:reference)
|
54
|
+
@listener.expects(:case).with("1234").once
|
55
|
+
MessageParser.parse("BugzID: #1234", @listener)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_parse_bugzid_2
|
59
|
+
@listener.expects(:reference)
|
60
|
+
@listener.expects(:case).with("1234").once
|
61
|
+
MessageParser.parse("BugzID #1234", @listener)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_parse_bugzid_3
|
65
|
+
@listener.expects(:reference)
|
66
|
+
@listener.expects(:case).with("1234").once
|
67
|
+
MessageParser.parse("bugid: #1234", @listener)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_parse_bugzid_4
|
71
|
+
@listener.expects(:reference)
|
72
|
+
@listener.expects(:case).with("1234").once
|
73
|
+
MessageParser.parse("bugsid #1234", @listener)
|
74
|
+
end
|
75
|
+
def test_parse_refs
|
76
|
+
@listener.expects(:reference)
|
77
|
+
@listener.expects(:case).with("1234").once
|
78
|
+
MessageParser.parse("refs #1234", @listener)
|
79
|
+
end
|
80
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gitlab-fogbugz
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- John Reilly
|
9
|
+
- François Beausoleil
|
10
|
+
- Markus Fischer
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2012-07-14 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: json
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.1.2
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 1.1.2
|
32
|
+
description: Fork of github-fogbugz, a gem that acts as the gateway between GitLab
|
33
|
+
and Fogbugz.
|
34
|
+
email:
|
35
|
+
- jr@trms.com
|
36
|
+
- francois@teksol.info
|
37
|
+
- markus@fischer.name
|
38
|
+
executables:
|
39
|
+
- gitlab-fogbugz-server
|
40
|
+
- gitlab-fogbugz
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files:
|
43
|
+
- README.markdown
|
44
|
+
- LICENSE
|
45
|
+
- TODO
|
46
|
+
files:
|
47
|
+
- LICENSE
|
48
|
+
- README.markdown
|
49
|
+
- Rakefile
|
50
|
+
- TODO
|
51
|
+
- lib/message_parser.rb
|
52
|
+
- lib/message_parser_machine.rb
|
53
|
+
- lib/fogbugz_listener.rb
|
54
|
+
- lib/fogbugz_service.rb
|
55
|
+
- test/fogbugz_service_logon_test.rb
|
56
|
+
- test/fogbugz_service_test.rb
|
57
|
+
- test/fogbugz_listener_test.rb
|
58
|
+
- test/fogbugz_service_case_editing_test.rb
|
59
|
+
- test/message_parser_test.rb
|
60
|
+
- test/test_helper.rb
|
61
|
+
- config/config.yml.example
|
62
|
+
- samples/test-fogbugz-url.rb
|
63
|
+
- samples/test-receive-commit.rb
|
64
|
+
- bin/gitlab-fogbugz-server
|
65
|
+
- bin/gitlab-fogbugz
|
66
|
+
homepage: http://github.com/mfn/gitlab-fogbugz
|
67
|
+
licenses: []
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
requirements: []
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 1.8.24
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Fork of github-fogbugz, a gem that acts as the gateway between GitLab and
|
90
|
+
Fogbugz.
|
91
|
+
test_files: []
|