moar work on acceptance tests
This commit is contained in:
parent
9851d1b276
commit
7eceeb2842
|
@ -6,7 +6,7 @@ class Travis::Api::App
|
||||||
# artifacts
|
# artifacts
|
||||||
class Artifacts < Endpoint
|
class Artifacts < Endpoint
|
||||||
# Fetches an artifact by it's *id*.
|
# Fetches an artifact by it's *id*.
|
||||||
get('/:id') do |id|
|
get '/:id' do |id|
|
||||||
body one(params).run
|
body one(params).run
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@ require 'travis/api/app'
|
||||||
class Travis::Api::App
|
class Travis::Api::App
|
||||||
class Endpoint
|
class Endpoint
|
||||||
class Branches < Endpoint
|
class Branches < Endpoint
|
||||||
get('/') do
|
get '/' do
|
||||||
body all(params).run, type: :branches
|
body all(params).run, type: :branches
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,11 +3,11 @@ require 'travis/api/app'
|
||||||
class Travis::Api::App
|
class Travis::Api::App
|
||||||
class Endpoint
|
class Endpoint
|
||||||
class Hooks < Endpoint
|
class Hooks < Endpoint
|
||||||
get('/', scope: :private) do
|
get '/', scope: :private do
|
||||||
body all(params).run, type: :hooks
|
body all(params).run, type: :hooks
|
||||||
end
|
end
|
||||||
|
|
||||||
put('/:id?', scope: :private) do
|
put '/:id?', scope: :private do
|
||||||
update(id: params[:id] || params[:hook][:id], active: params[:hook][:active]).run
|
update(id: params[:id] || params[:hook][:id], active: params[:hook][:active]).run
|
||||||
204
|
204
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,11 +3,11 @@ require 'travis/api/app'
|
||||||
class Travis::Api::App
|
class Travis::Api::App
|
||||||
class Endpoint
|
class Endpoint
|
||||||
class Jobs < Endpoint
|
class Jobs < Endpoint
|
||||||
get('/') do
|
get '/' do
|
||||||
body all(params).run
|
body all(params).run
|
||||||
end
|
end
|
||||||
|
|
||||||
get('/:id') do
|
get '/:id' do
|
||||||
body one(params).run
|
body one(params).run
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,13 +7,9 @@ class Travis::Api::App
|
||||||
body all(params).run
|
body all(params).run
|
||||||
end
|
end
|
||||||
|
|
||||||
get('/:id') do
|
get '/:id' do
|
||||||
body one(params).run
|
body one(params).run
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO make sure status images and cc.xml work
|
|
||||||
# rescue ActiveRecord::RecordNotFound
|
|
||||||
# raise unless params[:format] == 'png'
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
13
lib/travis/api/app/endpoint/result_image.rb
Normal file
13
lib/travis/api/app/endpoint/result_image.rb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
require 'travis/api/app'
|
||||||
|
|
||||||
|
class Travis::Api::App
|
||||||
|
class Endpoint
|
||||||
|
class ResultImage < Endpoint
|
||||||
|
set(:prefix) { '/' }
|
||||||
|
|
||||||
|
get '/:owner_name/:name.png' do
|
||||||
|
result_image service(:repositories, :one, params).run(:raise => false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -3,11 +3,11 @@ require 'travis/api/app'
|
||||||
class Travis::Api::App
|
class Travis::Api::App
|
||||||
class Endpoint
|
class Endpoint
|
||||||
class Stats < Endpoint
|
class Stats < Endpoint
|
||||||
get('/repos') do
|
get '/repos' do
|
||||||
{ :stats => service(:daily_repos) }
|
{ :stats => service(:daily_repos) }
|
||||||
end
|
end
|
||||||
|
|
||||||
get('/tests') do
|
get '/tests' do
|
||||||
{ :stats => service(:daily_tests) }
|
{ :stats => service(:daily_tests) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@ require 'travis/api/app'
|
||||||
class Travis::Api::App
|
class Travis::Api::App
|
||||||
class Endpoint
|
class Endpoint
|
||||||
class Workers < Endpoint
|
class Workers < Endpoint
|
||||||
get('/') do
|
get '/' do
|
||||||
body all(params).run
|
body all(params).run
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
27
lib/travis/api/app/helpers/result_image.rb
Normal file
27
lib/travis/api/app/helpers/result_image.rb
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
require 'travis/api/app'
|
||||||
|
require 'cgi'
|
||||||
|
|
||||||
|
module Travis::Api::App::Helpers
|
||||||
|
module ResultImage
|
||||||
|
RESULT_NAMES = { nil => 'unknown', 0 => 'passing', 1 => 'failing' }
|
||||||
|
|
||||||
|
def result_image(resource)
|
||||||
|
headers['Expires'] = CGI.rfc1123_date(Time.now.utc)
|
||||||
|
filename = filename(resource)
|
||||||
|
env['travis.sending-file'] = filename
|
||||||
|
send_file filename, type: :png, disposition: :inline
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def filename(resource)
|
||||||
|
root = File.expand_path("#{settings.root}/../../../../../") # TODO wat.
|
||||||
|
"#{root}/public/images/result/#{result(resource)}.png"
|
||||||
|
end
|
||||||
|
|
||||||
|
def result(resource)
|
||||||
|
RESULT_NAMES[resource.try(:last_build_result_on, branch: params[:branch])]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -23,7 +23,7 @@ class Travis::Api::App
|
||||||
enable :raise_errors
|
enable :raise_errors
|
||||||
# disable :dump_errors
|
# disable :dump_errors
|
||||||
register :subclass_tracker
|
register :subclass_tracker
|
||||||
helpers :json_renderer
|
helpers :json_renderer, :result_image
|
||||||
end
|
end
|
||||||
|
|
||||||
configure :development do
|
configure :development do
|
||||||
|
|
BIN
public/images/result/failing.png
Normal file
BIN
public/images/result/failing.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
BIN
public/images/result/passing.png
Normal file
BIN
public/images/result/passing.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
public/images/result/unknown.png
Normal file
BIN
public/images/result/unknown.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
62
spec/integration/result_image_spec.rb
Normal file
62
spec/integration/result_image_spec.rb
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe 'Result images' do
|
||||||
|
let!(:repo) { Factory(:repository, owner_name: 'svenfuchs', name: 'minimal') }
|
||||||
|
|
||||||
|
describe 'GET /svenfuchs/minimal.png' do
|
||||||
|
it '"unknown" when the repository does not exist' do
|
||||||
|
get('/svenfuchs/does-not-exist.png').should deliver_result_image_for('unknown')
|
||||||
|
end
|
||||||
|
|
||||||
|
it '"unknown" when it only has one build that is not finished' do
|
||||||
|
repo.update_attributes!(last_build_result: nil)
|
||||||
|
get('/svenfuchs/minimal.png').should deliver_result_image_for('unknown')
|
||||||
|
end
|
||||||
|
|
||||||
|
it '"failing" when the last build has failed' do
|
||||||
|
repo.update_attributes!(last_build_result: 1)
|
||||||
|
get('/svenfuchs/minimal.png').should deliver_result_image_for('failing')
|
||||||
|
end
|
||||||
|
|
||||||
|
it '"passing" when the last build has passed' do
|
||||||
|
repo.update_attributes!(last_build_result: 0)
|
||||||
|
get('/svenfuchs/minimal.png').should deliver_result_image_for('passing')
|
||||||
|
end
|
||||||
|
|
||||||
|
it '"passing" when there is a running build but the previous one has passed' do
|
||||||
|
Factory(:build, repository: repo, state: :finished, result: nil, previous_result: 0)
|
||||||
|
repo.update_attributes!(last_build_result: nil)
|
||||||
|
get('/svenfuchs/minimal.png').should deliver_result_image_for('passing')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'GET /svenfuchs/minimal.png' do
|
||||||
|
let(:commit) { Factory(:commit, branch: 'dev') }
|
||||||
|
|
||||||
|
it '"unknown" when the repository does not exist' do
|
||||||
|
get('/svenfuchs/does-not-exist.png?branch=dev').should deliver_result_image_for('unknown')
|
||||||
|
end
|
||||||
|
|
||||||
|
it '"unknown" when it only has a build that is not finished' do
|
||||||
|
Factory(:build, repository: repo, state: :started, result: nil, commit: commit)
|
||||||
|
get('/svenfuchs/minimal.png?branch=dev').should deliver_result_image_for('unknown')
|
||||||
|
end
|
||||||
|
|
||||||
|
it '"failing" when the last build has failed' do
|
||||||
|
Factory(:build, repository: repo, state: :finished, result: 1, commit: commit)
|
||||||
|
get('/svenfuchs/minimal.png?branch=dev').should deliver_result_image_for('failing')
|
||||||
|
end
|
||||||
|
|
||||||
|
it '"passing" when the last build has passed' do
|
||||||
|
Factory(:build, repository: repo, state: :finished, result: 0, commit: commit)
|
||||||
|
get('/svenfuchs/minimal.png?branch=dev').should deliver_result_image_for('passing')
|
||||||
|
end
|
||||||
|
|
||||||
|
it '"passing" when there is a running build but the previous one has passed' do
|
||||||
|
Factory(:build, repository: repo, state: :finished, result: 0, commit: commit)
|
||||||
|
Factory(:build, repository: repo, state: :started, result: nil, commit: commit)
|
||||||
|
repo.update_attributes!(last_build_result: nil)
|
||||||
|
get('/svenfuchs/minimal.png?branch=dev').should deliver_result_image_for('passing')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -28,6 +28,27 @@ RSpec::Matchers.define :deliver_json_for do |resource, options = {}|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
RSpec::Matchers.define :deliver_result_image_for do |name|
|
||||||
|
match do |response|
|
||||||
|
actual = files.detect do |(name, content)|
|
||||||
|
response.body.force_encoding('ascii') == content.force_encoding('ascii') # TODO ummmmmmmm?
|
||||||
|
end
|
||||||
|
actual = actual && actual[0]
|
||||||
|
|
||||||
|
failure_message_for_should do
|
||||||
|
"expected #{actual.inspect} to equal #{name.inspect}"
|
||||||
|
end
|
||||||
|
|
||||||
|
actual == name
|
||||||
|
end
|
||||||
|
|
||||||
|
def files
|
||||||
|
files = Hash[*Dir['public/images/result/*.png'].map do |file|
|
||||||
|
[File.basename(file, '.png'), File.read(file)]
|
||||||
|
end.flatten]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Travis.logger = Logger.new(StringIO.new)
|
Travis.logger = Logger.new(StringIO.new)
|
||||||
Travis::Api::App.setup
|
Travis::Api::App.setup
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user