gitlab-fogbugz 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|