go_cd_feed 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.rvmrc +1 -0
  4. data/.zeroci.yml +1 -0
  5. data/Gemfile +4 -0
  6. data/Gemfile.lock +32 -0
  7. data/README.textile +36 -0
  8. data/Rakefile +39 -0
  9. data/bin/go_api_client +3 -0
  10. data/go_api_client.gemspec +27 -0
  11. data/lib/go_api_client.rb +60 -0
  12. data/lib/go_api_client/atom.rb +4 -0
  13. data/lib/go_api_client/atom/author.rb +42 -0
  14. data/lib/go_api_client/atom/entry.rb +34 -0
  15. data/lib/go_api_client/atom/feed.rb +44 -0
  16. data/lib/go_api_client/atom/feed_page.rb +49 -0
  17. data/lib/go_api_client/commit.rb +30 -0
  18. data/lib/go_api_client/helpers.rb +1 -0
  19. data/lib/go_api_client/helpers/simple_attribute_support.rb +11 -0
  20. data/lib/go_api_client/http_fetcher.rb +43 -0
  21. data/lib/go_api_client/job.rb +64 -0
  22. data/lib/go_api_client/pipeline.rb +49 -0
  23. data/lib/go_api_client/stage.rb +57 -0
  24. data/lib/go_api_client/user.rb +36 -0
  25. data/lib/go_api_client/version.rb +9 -0
  26. data/ssh_keys/git-ci.zeroci.com +27 -0
  27. data/ssh_keys/git-ci.zeroci.com.pub +1 -0
  28. data/ssh_keys/git-ssh +3 -0
  29. data/test/fixtures/building/job_1.xml +41 -0
  30. data/test/fixtures/building/job_2.xml +43 -0
  31. data/test/fixtures/building/job_3.xml +40 -0
  32. data/test/fixtures/building/job_4.xml +40 -0
  33. data/test/fixtures/building/pipeline_1.xml +45 -0
  34. data/test/fixtures/building/pipeline_2.xml +39 -0
  35. data/test/fixtures/building/pipeline_3.xml +71 -0
  36. data/test/fixtures/building/stages.xml +180 -0
  37. data/test/fixtures/building/stages_1.xml +16 -0
  38. data/test/fixtures/building/stages_2.xml +16 -0
  39. data/test/fixtures/building/stages_3.xml +16 -0
  40. data/test/fixtures/building/stages_4.xml +16 -0
  41. data/test/fixtures/job_1_console.log.txt +82 -0
  42. data/test/fixtures/job_2_console.log.txt +82 -0
  43. data/test/fixtures/jobs_1.xml +29 -0
  44. data/test/fixtures/jobs_2.xml +29 -0
  45. data/test/fixtures/jobs_with_no_properties.xml +42 -0
  46. data/test/fixtures/ordering/go/api/jobs/1.xml +29 -0
  47. data/test/fixtures/ordering/go/api/jobs/10.xml +31 -0
  48. data/test/fixtures/ordering/go/api/jobs/2.xml +29 -0
  49. data/test/fixtures/ordering/go/api/jobs/3.xml +29 -0
  50. data/test/fixtures/ordering/go/api/jobs/4.xml +29 -0
  51. data/test/fixtures/ordering/go/api/jobs/5.xml +29 -0
  52. data/test/fixtures/ordering/go/api/jobs/6.xml +29 -0
  53. data/test/fixtures/ordering/go/api/jobs/7.xml +31 -0
  54. data/test/fixtures/ordering/go/api/jobs/8.xml +31 -0
  55. data/test/fixtures/ordering/go/api/jobs/9.xml +31 -0
  56. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/1.xml +31 -0
  57. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/2.xml +26 -0
  58. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/3.xml +26 -0
  59. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/4.xml +27 -0
  60. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/5.xml +33 -0
  61. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/stages.xml +255 -0
  62. data/test/fixtures/ordering/go/api/stages/1.xml +14 -0
  63. data/test/fixtures/ordering/go/api/stages/10.xml +14 -0
  64. data/test/fixtures/ordering/go/api/stages/2.xml +14 -0
  65. data/test/fixtures/ordering/go/api/stages/3.xml +14 -0
  66. data/test/fixtures/ordering/go/api/stages/4.xml +14 -0
  67. data/test/fixtures/ordering/go/api/stages/5.xml +14 -0
  68. data/test/fixtures/ordering/go/api/stages/6.xml +14 -0
  69. data/test/fixtures/ordering/go/api/stages/7.xml +14 -0
  70. data/test/fixtures/ordering/go/api/stages/8.xml +14 -0
  71. data/test/fixtures/ordering/go/api/stages/9.xml +14 -0
  72. data/test/fixtures/pagination/stages.xml +636 -0
  73. data/test/fixtures/pagination/stages_before_7916973.xml +615 -0
  74. data/test/fixtures/pagination/stages_before_7959831.xml +615 -0
  75. data/test/fixtures/pipelines_1.xml +32 -0
  76. data/test/fixtures/stages.xml +63 -0
  77. data/test/fixtures/stages_1.xml +14 -0
  78. data/test/fixtures/stages_2.xml +14 -0
  79. data/test/fixtures/stages_empty.xml +9 -0
  80. data/test/go_api_client/atom/author_test.rb +27 -0
  81. data/test/go_api_client/atom/entry_test.rb +27 -0
  82. data/test/go_api_client/atom/feed_page_test.rb +41 -0
  83. data/test/go_api_client/atom/feed_test.rb +25 -0
  84. data/test/go_api_client/building_test.rb +38 -0
  85. data/test/go_api_client/commit_test.rb +38 -0
  86. data/test/go_api_client/job_test.rb +42 -0
  87. data/test/go_api_client/pipeline_test.rb +34 -0
  88. data/test/go_api_client/stage_test.rb +75 -0
  89. data/test/go_api_client/user_test.rb +27 -0
  90. data/test/test_helper.rb +31 -0
  91. metadata +272 -0
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+
3
+ <pipeline name="defaultPipeline" counter="99" label="1">
4
+ <link rel="self" href="http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml"/>
5
+ <id><![CDATA[urn:x-go.studios.thoughtworks.com:job-id:defaultPipeline:1]]></id>
6
+ <scheduleTime>2012-02-23T17:16:15+05:30</scheduleTime>
7
+ <materials>
8
+ <material materialUri="http://localhost:8153/go/api/materials/1.xml" type="GitMaterial" url="git@github.com:oogabooga/zinger.git" branch="master">
9
+ <modifications>
10
+ <changeset changesetUri="http://localhost:8153/go/api/materials/1/changeset/9f77888d7a594699894a17f4d61fc9dfac3cfb74.xml">
11
+ <user><![CDATA[oogabooga <twgosaas@gmail.com>]]></user>
12
+ <checkinTime>2012-02-21T15:41:30+05:30</checkinTime>
13
+ <revision><![CDATA[9f77888d7a594699894a17f4d61fc9dfac3cfb74]]></revision>
14
+ <message><![CDATA[Update README]]></message>
15
+ <file name="README" action="modified"/>
16
+ </changeset>
17
+ <changeset changesetUri="http://localhost:8153/go/api/materials/1/changeset/ded20c6210172daee9c100364679e65bded20c6210172daee9c10036467.xml">
18
+ <user><![CDATA[Ketan Padegaonkar <KetanPadegaonkar@gmail.com>]]></user>
19
+ <checkinTime>2012-02-23T15:42:10+05:30</checkinTime>
20
+ <revision><![CDATA[ded20c6210172daee9c100364679e65bded20c6210172daee9c10036467]]></revision>
21
+ <message><![CDATA[Fixed build]]></message>
22
+ <file name="Rakefile" action="modified"/>
23
+ </changeset>
24
+ </modifications>
25
+ </material>
26
+ </materials>
27
+ <stages>
28
+ <stage href="http://localhost:8153/go/api/stages/1.xml"/>
29
+ <stage href="http://localhost:8153/go/api/stages/2.xml"/>
30
+ </stages>
31
+ <approvedBy><![CDATA[changes]]></approvedBy>
32
+ </pipeline>
@@ -0,0 +1,63 @@
1
+ <feed xmlns="http://www.w3.org/2005/Atom" xmlns:go="http://www.thoughtworks-studios.com/ns/go">
2
+ <title><![CDATA[defaultPipeline]]></title>
3
+ <id>http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml</id>
4
+ <author>
5
+ <name>Go</name>
6
+ </author>
7
+ <updated>2012-02-23T17:19:31+05:30</updated>
8
+ <link rel="self" href="http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml"/>
9
+
10
+
11
+ <!-- <link rel="next" href="http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml?before=6"/> -->
12
+
13
+
14
+
15
+ <entry>
16
+ <title><![CDATA[defaultPipeline(1) stage Acceptance(1) Failed]]></title>
17
+ <updated>2012-02-23T17:19:31+05:30</updated>
18
+ <id>http://localhost:8153/go/pipelines/defaultPipeline/1/Acceptance/1</id>
19
+
20
+
21
+ <author>
22
+ <name><![CDATA[oogabooga <twgosaas@gmail.com>]]></name>
23
+ </author>
24
+
25
+
26
+ <link title="Acceptance Stage Detail" href="http://localhost:8153/go/api/stages/2.xml" rel="alternate" type="application/vnd.go+xml"/>
27
+ <link title="Acceptance Stage Detail" href="http://localhost:8153/go/pipelines/defaultPipeline/1/Acceptance/1" rel="alternate" type="text/html"/>
28
+
29
+ <link title="defaultPipeline Pipeline Detail" href="http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml" rel="http://www.thoughtworks-studios.com/ns/relations/go/pipeline" type="application/vnd.go+xml"/>
30
+ <link title="defaultPipeline Pipeline Detail" href="http://localhost:8153/go/pipelines/defaultPipeline/1/Acceptance/1/pipeline" rel="http://www.thoughtworks-studios.com/ns/relations/go/pipeline" type="text/html"/>
31
+
32
+
33
+
34
+ <category scheme="http://www.thoughtworks-studios.com/ns/categories/go" term="stage" label="Stage" />
35
+ <category scheme="http://www.thoughtworks-studios.com/ns/categories/go" term="completed" label="Completed" />
36
+ <category scheme="http://www.thoughtworks-studios.com/ns/categories/go" term="failed" label="Failed" />
37
+ </entry>
38
+
39
+ <entry>
40
+ <title><![CDATA[defaultPipeline(1) stage Units(1) Failed]]></title>
41
+ <updated>2012-02-23T17:16:41+05:30</updated>
42
+ <id>http://localhost:8153/go/pipelines/defaultPipeline/1/Units/1</id>
43
+
44
+
45
+ <author>
46
+ <name><![CDATA[oogabooga <twgosaas@gmail.com>]]></name>
47
+ </author>
48
+
49
+
50
+ <link title="Units Stage Detail" href="http://localhost:8153/go/api/stages/1.xml" rel="alternate" type="application/vnd.go+xml"/>
51
+ <link title="Units Stage Detail" href="http://localhost:8153/go/pipelines/defaultPipeline/1/Units/1" rel="alternate" type="text/html"/>
52
+
53
+ <link title="defaultPipeline Pipeline Detail" href="http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml" rel="http://www.thoughtworks-studios.com/ns/relations/go/pipeline" type="application/vnd.go+xml"/>
54
+ <link title="defaultPipeline Pipeline Detail" href="http://localhost:8153/go/pipelines/defaultPipeline/1/Units/1/pipeline" rel="http://www.thoughtworks-studios.com/ns/relations/go/pipeline" type="text/html"/>
55
+
56
+
57
+
58
+ <category scheme="http://www.thoughtworks-studios.com/ns/categories/go" term="stage" label="Stage" />
59
+ <category scheme="http://www.thoughtworks-studios.com/ns/categories/go" term="completed" label="Completed" />
60
+ <category scheme="http://www.thoughtworks-studios.com/ns/categories/go" term="failed" label="Failed" />
61
+ </entry>
62
+
63
+ </feed>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+
3
+ <stage name="Units" counter="1">
4
+ <link rel="self" href="http://localhost:8153/go/api/stages/1.xml"/>
5
+ <id><![CDATA[urn:x-go.studios.thoughtworks.com:stage-id:defaultPipeline:1:Units:1]]></id>
6
+ <pipeline name="defaultPipeline" counter="1" label="1" href="http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml"/>
7
+ <updated>2012-02-23T17:16:41+05:30</updated>
8
+ <result>Failed</result>
9
+ <state>Completed</state>
10
+ <approvedBy><![CDATA[changes]]></approvedBy>
11
+ <jobs>
12
+ <job href="http://localhost:8153/go/api/jobs/1.xml"/>
13
+ </jobs>
14
+ </stage>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+
3
+ <stage name="Acceptance" counter="1">
4
+ <link rel="self" href="http://localhost:8153/go/api/stages/2.xml"/>
5
+ <id><![CDATA[urn:x-go.studios.thoughtworks.com:stage-id:defaultPipeline:1:Acceptance:1]]></id>
6
+ <pipeline name="defaultPipeline" counter="1" label="1" href="http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml"/>
7
+ <updated>2012-02-23T17:19:31+05:30</updated>
8
+ <result>Failed</result>
9
+ <state>Completed</state>
10
+ <approvedBy><![CDATA[anonymous]]></approvedBy>
11
+ <jobs>
12
+ <job href="http://localhost:8153/go/api/jobs/2.xml"/>
13
+ </jobs>
14
+ </stage>
@@ -0,0 +1,9 @@
1
+ <feed xmlns="http://www.w3.org/2005/Atom" xmlns:go="http://www.thoughtworks-studios.com/ns/go">
2
+ <title><![CDATA[defaultPipeline]]></title>
3
+ <id>http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml</id>
4
+ <author>
5
+ <name>Go</name>
6
+ </author>
7
+ <updated>2012-03-07T11:15:10+05:30</updated>
8
+ <link rel="self" href="http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml"/>
9
+ </feed>
@@ -0,0 +1,27 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ module Atom
5
+ class AuthorTest < Test::Unit::TestCase
6
+
7
+ test "should be able to parse author's info" do
8
+ doc = Nokogiri::XML(%Q{<author xmlns="http://www.w3.org/2005/Atom"><name><![CDATA[oogabooga <twgosaas@gmail.com>]]></name><uri>http://oogabooga.example.com<uri></author>})
9
+ author = Author.new(doc.root).parse!
10
+ assert_equal Author.new(nil, :name => 'oogabooga', :email => 'twgosaas@gmail.com', :uri => 'http://oogabooga.example.com'), author
11
+ end
12
+
13
+ test "should be able to parse author xml with no email and uri" do
14
+ doc = Nokogiri::XML(%Q{<author xmlns="http://www.w3.org/2005/Atom"><name><![CDATA[oogabooga]]></name></author>})
15
+ author = Author.new(doc.root).parse!
16
+ assert_equal Author.new(nil, :name => 'oogabooga'), author
17
+ end
18
+
19
+ test "should be able to parse author xml with email specified in the name tag" do
20
+ doc = Nokogiri::XML(%Q{<author xmlns="http://www.w3.org/2005/Atom"><name><![CDATA[oogabooga <twgosaas@gmail.com>]]></name></author>})
21
+ author = Author.new(doc.root).parse!
22
+ assert_equal Author.new(nil, :name => 'oogabooga', :email => 'twgosaas@gmail.com'), author
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ module Atom
5
+ class EntryTest < Test::Unit::TestCase
6
+ setup do
7
+ doc = Nokogiri::XML(file_contents('pagination/stages.xml'))
8
+ @root = doc.root
9
+ @entry_node = @root.xpath('./xmlns:entry')[12]
10
+ end
11
+
12
+ test "should parse entry node" do
13
+ entry = Entry.new(@entry_node).parse!
14
+ assert_equal 'https://go-server.example.com/go/pipelines/tlb/177/ant_count_go/1', entry.id
15
+ assert_equal Time.parse('2012-01-22 11:32:57 UTC'), entry.updated_at
16
+ assert_equal 'tlb(177) stage ant_count_go(1) Passed', entry.title
17
+ assert_equal 'https://go-server.example.com/go/api/stages/210161.xml', entry.stage_href
18
+ expected_authors = [
19
+ Author.new(nil, :name => 'Pavan', :email => 'itspanzi@gmail.com'),
20
+ Author.new(nil, :name => 'Pavan Sudarshan', :email => 'itspanzi@gmail.com')
21
+ ]
22
+
23
+ assert_equal expected_authors, entry.authors
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ module Atom
5
+ class FeedPageTest < Test::Unit::TestCase
6
+
7
+ setup do
8
+ doc = Nokogiri::XML(file_contents("pagination/stages.xml"))
9
+ @feed_page = FeedPage.new(doc.root).parse!
10
+ end
11
+
12
+ test "should be able to parse one page of the paginated Go atom feed" do
13
+ assert_equal 25, @feed_page.entries.count
14
+ assert_equal 'https://go-server.example.com/go/api/pipelines/tlb/stages.xml', @feed_page.url
15
+ assert_equal 'https://go-server.example.com/go/api/pipelines/tlb/stages.xml?before=7959831', @feed_page.next_page
16
+ assert_equal Time.parse('2012-04-17 10:56:53 UTC'), @feed_page.updated_at
17
+ end
18
+
19
+ test "should answer if an entry id is present in the feed page" do
20
+ assert @feed_page.contains_entry?(@feed_page.entries[5].id)
21
+ assert_false @feed_page.contains_entry?("foo")
22
+ end
23
+
24
+ test "should answer if an entry object is present in the feed page" do
25
+ assert @feed_page.contains_entry?(@feed_page.entries[5])
26
+ assert_false @feed_page.contains_entry?(Entry.new(nil))
27
+ end
28
+
29
+ test "should return entries after a particular entry (top entries in feed)" do
30
+ entry = @feed_page.entries[5]
31
+
32
+ assert_equal @feed_page.entries_after(entry.id), @feed_page.entries_after(entry)
33
+
34
+ assert_equal 5, @feed_page.entries_after(entry.id).count
35
+ assert_equal 5, @feed_page.entries_after(entry).count
36
+
37
+ assert_false @feed_page.entries_after(entry).include?(entry)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ module Atom
5
+ class FeedTest < Test::Unit::TestCase
6
+ setup do
7
+ stub_request(:get, "https://go-server.example.com/go/api/pipelines/tlb/stages.xml").to_return(:body => file_contents("pagination/stages.xml"))
8
+ stub_request(:get, "https://go-server.example.com/go/api/pipelines/tlb/stages.xml?before=7959831").to_return(:body => file_contents("pagination/stages_before_7959831.xml"))
9
+ end
10
+
11
+ test "should stop at last seen atom entry id" do
12
+ feed = GoApiClient::Atom::Feed.new('https://go-server.example.com/go/api/pipelines/tlb/stages.xml', 'https://go-server.example.com/go/pipelines/tlb/175/ant_count_tlb/1').fetch!
13
+ assert_equal (25+4), feed.entries.count
14
+ end
15
+
16
+ test "should stop at first page if entry id not specified" do
17
+ stub_request(:get, "https://go-server.example.com/go/api/pipelines/tlb/stages.xml?before=7916973").to_return(:body => file_contents("pagination/stages_before_7916973.xml"))
18
+
19
+ feed = GoApiClient::Atom::Feed.new('https://go-server.example.com/go/api/pipelines/tlb/stages.xml').fetch!
20
+ assert_equal 25*3, feed.entries.count
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ class BuildingTest < Test::Unit::TestCase
5
+
6
+ test "should report that Go is building if atleast 1 project is building" do
7
+ feed = %Q{
8
+ <?xml version="1.0" encoding="utf-8"?>
9
+ <Projects>
10
+ <Project name="defaultPipeline :: RailsTests" activity="Building" lastBuildStatus="Success" lastBuildLabel="4" lastBuildTime="2012-07-19T10:03:04" webUrl="http://go-server.2.project:8153/go/pipelines/defaultPipeline/5/RailsTests/1" />
11
+ <Project name="defaultPipeline :: RailsTests :: Test" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="4" lastBuildTime="2012-07-19T10:03:04" webUrl="http://go-server.2.project:8153/go/tab/build/detail/defaultPipeline/5/RailsTests/1/Test" />
12
+ </Projects>
13
+ }
14
+ stub_request(:get, "http://go-server.2.project:8153/go/cctray.xml").
15
+ to_return(:body => feed)
16
+ assert GoApiClient.build_in_progress?(:host => 'go-server.2.project')
17
+ end
18
+
19
+ test "should report that Go is sleeping if all projects are sleeping" do
20
+ feed = %Q{
21
+ <?xml version="1.0" encoding="utf-8"?>
22
+ <Projects>
23
+ <Project name="defaultPipeline :: RailsTests" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="4" lastBuildTime="2012-07-19T10:03:04" webUrl="http://go-server.2.project:8153/go/pipelines/defaultPipeline/5/RailsTests/1" />
24
+ <Project name="defaultPipeline :: RailsTests :: Test" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="4" lastBuildTime="2012-07-19T10:03:04" webUrl="http://go-server.2.project:8153/go/tab/build/detail/defaultPipeline/5/RailsTests/1/Test" />
25
+ </Projects>
26
+ }
27
+ stub_request(:get, "http://go-server.2.project:8153/go/cctray.xml").
28
+ to_return(:body => feed)
29
+ assert_false GoApiClient.build_in_progress?(:host => 'go-server.2.project')
30
+ end
31
+
32
+ test "should handle empty feeds" do
33
+ stub_request(:get, "http://go-server.2.project:8153/go/cctray.xml").
34
+ to_return(:body => nil)
35
+ assert_false GoApiClient.build_in_progress?(:host => 'go-server.2.project')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ class CommitTest < Test::Unit::TestCase
5
+
6
+ test "should parse a changeset xml node" do
7
+ doc = Nokogiri::XML.parse %q{<changeset changesetUri="http://localhost:8153/go/api/materials/1/changeset/9f77888d7a594699894a17f4d61fc9dfac3cfb74.xml">
8
+ <bar>
9
+ <revision>jhgasdfjkhgads</revision>
10
+ <message>some message</message>
11
+ <checkinTime>unparsable cruft</checkinTime>
12
+ <user>unparsable cruft</user>
13
+ </bar>
14
+
15
+ <user><![CDATA[oogabooga <twgosaas@gmail.com>]]></user>
16
+ <checkinTime>2012-02-21T15:41:30+05:30</checkinTime>
17
+ <revision><![CDATA[9f77888d7a594699894a17f4d61fc9dfac3cfb74]]></revision>
18
+ <message><![CDATA[Update README]]></message>
19
+ <file name="README" action="modified"/>
20
+ <foo>
21
+ <revision>jhgasdfjkhgads</revision>
22
+ <message>some message</message>
23
+ <checkinTime>unparsable cruft</checkinTime>
24
+ <user>unparsable cruft</user>
25
+ </foo>
26
+ </changeset>
27
+ }
28
+
29
+ commit = Commit.new(doc.root).parse!
30
+
31
+ assert_equal '9f77888d7a594699894a17f4d61fc9dfac3cfb74', commit.revision
32
+ assert_equal 'Update README', commit.message
33
+ assert_equal Time.parse("2012-02-21 10:11:30 UTC"), commit.time
34
+ assert_equal User.parse("oogabooga <twgosaas@gmail.com>"), commit.user
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,42 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ class JobTest < Test::Unit::TestCase
5
+ test "should fetch the job xml and populate itself" do
6
+ stub_request(:get, "http://localhost:8153/go/api/jobs/1.xml").to_return(:body => file_contents("jobs_1.xml"))
7
+
8
+ link = "http://localhost:8153/go/api/jobs/1.xml"
9
+ job = GoApiClient::Job.from(link)
10
+
11
+ assert_equal 'http://localhost:8153/go/api/jobs/1.xml', job.url
12
+ assert_equal 'http://localhost:8153/go/files/defaultPipeline/1/Units/1/Test', job.artifacts_uri
13
+ assert_equal 'http://localhost:8153/go/files/defaultPipeline/1/Units/1/Test/cruise-output/console.log', job.console_log_url
14
+
15
+
16
+ assert_equal 'urn:x-go.studios.thoughtworks.com:job-id:defaultPipeline:1:Units:1:Test', job.identifier
17
+
18
+ assert_equal 900, job.duration
19
+ assert_equal "Test", job.name
20
+ assert_equal "Failed", job.result
21
+ assert_equal Time.parse('2012-02-23 11:46:15 UTC'), job.scheduled
22
+ assert_equal Time.parse('2012-02-23 11:46:27 UTC'), job.assigned
23
+ assert_equal Time.parse('2012-02-23 11:46:37 UTC'), job.preparing
24
+ assert_equal Time.parse('2012-02-23 11:46:41 UTC'), job.building
25
+ assert_equal Time.parse('2012-02-23 11:46:42 UTC'), job.completing
26
+ assert_equal Time.parse('2012-02-23 11:46:45 UTC'), job.completed
27
+ end
28
+
29
+ test "should parse job even when some properties are missing" do
30
+ stub_request(:get, "http://go-server.1.project:8153/go/api/jobs/1.xml").to_return(:body => file_contents("jobs_with_no_properties.xml"))
31
+ link = "http://go-server.1.project:8153/go/api/jobs/1.xml"
32
+ job = GoApiClient::Job.from(link)
33
+
34
+ assert_equal 80, job.duration
35
+ assert_equal "Failed", job.result
36
+ %w(scheduled assigned preparing building completing completed).each do |property|
37
+ assert_nil job.send(property)
38
+ end
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ class PipelineTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ stub_request(:get, "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml").to_return(:body => file_contents("pipelines_1.xml"))
8
+ end
9
+
10
+ test "should fetch the pipeline xml and populate itself" do
11
+ link = "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml"
12
+ pipeline = GoApiClient::Pipeline.from(link)
13
+
14
+ assert_equal "1", pipeline.label
15
+ assert_equal 99, pipeline.counter
16
+ assert_equal "defaultPipeline", pipeline.name
17
+ assert_equal "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml", pipeline.url
18
+ assert_equal ["Update README", "Fixed build"], pipeline.commits.collect(&:message)
19
+ assert_equal "urn:x-go.studios.thoughtworks.com:job-id:defaultPipeline:1", pipeline.identifier
20
+ assert_equal Time.parse('2012-02-23 11:46:15 UTC'), pipeline.schedule_time
21
+ end
22
+
23
+ test "should return a list of authors from the first stage" do
24
+ link = "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml"
25
+ pipeline = GoApiClient::Pipeline.from(link)
26
+ author_foo = Atom::Author.new(nil, :name => 'foo', :email => 'foo@example.com', :uri => 'http://foo.example.com')
27
+ author_bar = Atom::Author.new(nil, :name => 'bar', :email => 'bar@example.com', :uri => 'http://bar.example.com')
28
+
29
+ pipeline.stages << OpenStruct.new(:authors => [author_foo, author_bar])
30
+ assert_equal [author_foo, author_bar], pipeline.authors
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,75 @@
1
+ require "test_helper"
2
+
3
+ module GoApiClient
4
+ class StageTest < Test::Unit::TestCase
5
+
6
+ test "should return stages in order" do
7
+ stub_request(:any, /.*go-server.2.project.*/).
8
+ to_return(
9
+ lambda do |request|
10
+ { :body => file_contents("ordering/#{request.uri.path}")}
11
+ end
12
+ ).times(9999)
13
+
14
+ runs = GoApiClient.runs(:host => 'go-server.2.project')
15
+
16
+ assert_equal runs[:pipelines].collect(&:counter).sort, runs[:pipelines].collect(&:counter)
17
+
18
+ runs[:pipelines].each do |pipeline|
19
+ assert_equal pipeline.stages.collect(&:completed_at).sort, pipeline.stages.collect(&:completed_at)
20
+ end
21
+ end
22
+
23
+ test "should parse stage" do
24
+ stub_request(:get, "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml").to_return(:body => file_contents("pipelines_1.xml"))
25
+ stub_request(:get, "http://localhost:8153/go/api/stages/1.xml").to_return(:body => file_contents("stages_1.xml"))
26
+ stub_request(:get, "http://localhost:8153/go/api/stages/2.xml").to_return(:body => file_contents("stages_2.xml"))
27
+ stub_request(:get, "http://localhost:8153/go/api/jobs/1.xml").to_return(:body => file_contents("jobs_1.xml"))
28
+ stub_request(:get, "http://localhost:8153/go/api/jobs/2.xml").to_return(:body => file_contents("jobs_2.xml"))
29
+
30
+ stub_request(:get, "http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml").to_return(:body => file_contents("stages.xml"))
31
+ runs = GoApiClient.runs(:host => "localhost", :port => 8153)
32
+ pipelines = runs[:pipelines]
33
+ assert_equal "http://localhost:8153/go/pipelines/defaultPipeline/1/Acceptance/1", runs[:latest_atom_entry_id]
34
+ stages = pipelines.first.stages
35
+
36
+ assert_equal 1, pipelines.count
37
+ assert_equal 2, stages.count
38
+
39
+ assert_equal "http://localhost:8153/go/api/stages/1.xml", stages.first.url
40
+ assert_equal "http://localhost:8153/go/api/stages/2.xml", stages.last.url
41
+
42
+ assert_equal 1, stages.first.counter
43
+ assert_equal 1, stages.last.counter
44
+
45
+ assert_equal [Time.parse("2012-02-23T17:16:41+05:30").utc, Time.parse("2012-02-23T17:19:31+05:30").utc], stages.collect(&:completed_at)
46
+
47
+ assert_equal [Atom::Author.new(nil, :name => 'oogabooga', :email => 'twgosaas@gmail.com')], pipelines.first.authors
48
+
49
+ stages.each do |stage|
50
+ assert_equal Atom::Author.new(nil, :name => 'oogabooga', :email => 'twgosaas@gmail.com'), stage.authors.first
51
+ assert_equal "Failed", stage.result
52
+ assert stage.failed?
53
+ assert false == stage.passed?
54
+ end
55
+
56
+ assert_equal "Units", stages.first.name
57
+ assert_equal "Acceptance", stages.last.name
58
+
59
+ assert_equal ["Update README", "Fixed build"], pipelines.first.commits.collect(&:message)
60
+
61
+ assert_equal "http://localhost:8153/go/files/defaultPipeline/1/Units/1/Test/cruise-output/console.log", stages.first.jobs.first.console_log_url
62
+ assert_equal "http://localhost:8153/go/files/defaultPipeline/1/Acceptance/1/Test/cruise-output/console.log", stages.last.jobs.first.console_log_url
63
+
64
+ assert_equal 'urn:x-go.studios.thoughtworks.com:stage-id:defaultPipeline:1:Units:1', stages.first.identifier
65
+ assert_equal 'urn:x-go.studios.thoughtworks.com:stage-id:defaultPipeline:1:Acceptance:1', stages.last.identifier
66
+ end
67
+
68
+ test "empty atom feed should not throw up" do
69
+ stub_request(:get, "http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml").to_return(:body => file_contents("stages_empty.xml"))
70
+ runs = GoApiClient.runs(:host => "localhost", :port => 8153)
71
+
72
+ assert runs[:pipelines].empty?
73
+ end
74
+ end
75
+ end