diff --git a/Gemfile.lock b/Gemfile.lock index 5ed03d5e..7b578f37 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -139,7 +139,7 @@ GEM foreman (0.63.0) dotenv (>= 0.7) thor (>= 0.13.6) - gh (0.13.0) + gh (0.13.2) addressable backports faraday (~> 0.8) diff --git a/lib/travis/api/app/responders/xml.rb b/lib/travis/api/app/responders/xml.rb index 423fca46..410dec84 100644 --- a/lib/travis/api/app/responders/xml.rb +++ b/lib/travis/api/app/responders/xml.rb @@ -1,6 +1,22 @@ module Travis::Api::App::Responders + # This XML responder is used if the resource is a Repository, or a collection + # of Repositories. + # It returns XML data conforming to Multiple Project Summary Reporting Standard, + # as explained in http://confluence.public.thoughtworks.org/display/CI/Multiple+Project+Summary+Reporting+Standard class Xml < Base - TEMPLATE = File.read(__FILE__).split("__END__").last.strip + TEMPLATE_ERB = ERB.new <<-EOF + +<% @resource.each do |r| %> + +<% end %> + + EOF STATUS = { default: 'Unknown', @@ -16,13 +32,14 @@ module Travis::Api::App::Responders } def apply? - super && resource.is_a?(Repository) && last_build + @resource = Array(resource) + super && @resource.first.is_a?(Repository) end def apply super - TEMPLATE % data + TEMPLATE_ERB.result(binding) end private @@ -30,40 +47,5 @@ module Travis::Api::App::Responders def content_type 'application/xml;charset=utf-8' end - - def data - { - name: resource.slug, - url: File.join("https://", Travis.config.client_domain, resource.slug), - activity: activity, - label: last_build.try(:number), - status: status, - time: last_build.finished_at.try(:strftime, '%Y-%m-%dT%H:%M:%S.%L%z') - } - end - - def status - STATUS[last_build.state.to_sym] || STATUS[:default] - end - - def activity - ACTIVITY[last_build.state.to_sym] || ACTIVITY[:default] - end - - def last_build - @last_build ||= resource.last_build - end end end - -__END__ - - - - diff --git a/spec/integration/v2/repositories_spec.rb b/spec/integration/v2/repositories_spec.rb index 139c2c5c..30f2d100 100644 --- a/spec/integration/v2/repositories_spec.rb +++ b/spec/integration/v2/repositories_spec.rb @@ -107,9 +107,9 @@ describe 'Repos' do response.should deliver_cc_xml_for(Repository.by_slug('svenfuchs/minimal').first) end - it 'does not respond with cc.xml for /repos list' do + it 'responds with cc.xml for /repos list' do response = get '/repos', {}, 'HTTP_ACCEPT' => 'application/xml; version=2' - response.status.should == 406 + response.should deliver_cc_xml_for(Repository.timeline) end it 'responds with 404 when repo can\'t be found and format is png' do diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb index 798c9709..883a49f2 100644 --- a/spec/support/matchers.rb +++ b/spec/support/matchers.rb @@ -54,7 +54,7 @@ RSpec::Matchers.define :deliver_result_image_for do |name| end end -RSpec::Matchers.define :deliver_cc_xml_for do |repo| +RSpec::Matchers.define :deliver_cc_xml_for do |obj| match do |response| body = response.body @@ -62,6 +62,8 @@ RSpec::Matchers.define :deliver_cc_xml_for do |repo| "expected #{body} to be a valid cc.xml" end + repo = Array(obj).first + body.include?('') && body.include?(%(name="#{repo.slug}")) && body.include?("https://www.example.com/#{repo.slug}") end end