diff --git a/.gitignore b/.gitignore index af28a163..ec3c3b21 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,8 @@ config/nginx.conf config/skylight.yml tmp/ -log/ -logs/ +/log/ +/logs/ !vendor/travis-core/lib/travis/logs/ !vendor/travis-core/lib/travis/model/log/ diff --git a/lib/travis/api/v3/queries/log.rb b/lib/travis/api/v3/queries/log.rb new file mode 100644 index 00000000..d9d86892 --- /dev/null +++ b/lib/travis/api/v3/queries/log.rb @@ -0,0 +1,7 @@ +module Travis::API::V3 + class Queries::Log < Query + def find(job) + job.log + end + end +end diff --git a/lib/travis/api/v3/renderer/log.rb b/lib/travis/api/v3/renderer/log.rb new file mode 100644 index 00000000..33527a06 --- /dev/null +++ b/lib/travis/api/v3/renderer/log.rb @@ -0,0 +1,7 @@ +require 'travis/api/v3/renderer/model_renderer' + +module Travis::API::V3 + class Renderer::Log < Renderer::ModelRenderer + representation(:standard, :id, :content) + end +end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index 7767527e..dc45123e 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -43,6 +43,11 @@ module Travis::API::V3 post :cancel, '/cancel' post :restart, '/restart' post :debug, '/debug' + + resource :log do + route '/log' + get :find + end end resource :lint do diff --git a/lib/travis/api/v3/services.rb b/lib/travis/api/v3/services.rb index 8a48c895..60fb6409 100644 --- a/lib/travis/api/v3/services.rb +++ b/lib/travis/api/v3/services.rb @@ -16,6 +16,7 @@ module Travis::API::V3 Job = Module.new { extend Services } Jobs = Module.new { extend Services } Lint = Module.new { extend Services } + Log = Module.new { extend Services } Organization = Module.new { extend Services } Organizations = Module.new { extend Services } Owner = Module.new { extend Services } diff --git a/lib/travis/api/v3/services/log/find.rb b/lib/travis/api/v3/services/log/find.rb new file mode 100644 index 00000000..0bc78e72 --- /dev/null +++ b/lib/travis/api/v3/services/log/find.rb @@ -0,0 +1,10 @@ +module Travis::API::V3 + class Services::Log::Find < Service + params :id, prefix: :job + + def run! + job = find(:job) + query.find(job) + end + end +end diff --git a/spec/v3/services/log/find_spec.rb b/spec/v3/services/log/find_spec.rb new file mode 100644 index 00000000..6b1bc155 --- /dev/null +++ b/spec/v3/services/log/find_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +describe Travis::API::V3::Services::Log::Find, set_app: true do + let(:user) { Travis::API::V3::Models::User.find_by_login('svenfuchs') } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: user.login, name: 'minimal').first } + let(:build) { repo.builds.last } + let(:job) { Travis::API::V3::Models::Build.find(build.id).jobs.last } + let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: 1) } + let(:headers) { { 'HTTP_AUTHORIZATION' => "token #{token}" } } + let(:parsed_body) { JSON.load(body) } + + context 'when log stored in db' do + describe 'returns log as plain text' do + let(:log) { job.log } + + before { get("/v3/job/#{job.id}/log", {}, headers) } + + example { expect(last_response).to be_ok } + example do + expect(parsed_body).to eq( + '@href' => "/v3/job/#{job.id}/log", + '@representation' => 'standard', + '@type' => 'log', + 'content' => nil, + 'id' => log.id + ) + end + end + + describe 'returns log as chunked json' + end + + context 'when log not found in db but stored on S3' do + describe 'returns log as plain text' + describe 'returns log as chunked json' + end + + context 'when log not found anywhere' do + describe 'does not return log' + end + + context 'when log removed by user' do + describe 'does not return log' + end +end