diff --git a/lib/travis/api/v3/access_control/generic.rb b/lib/travis/api/v3/access_control/generic.rb index c6bab377..7f006029 100644 --- a/lib/travis/api/v3/access_control/generic.rb +++ b/lib/travis/api/v3/access_control/generic.rb @@ -55,6 +55,10 @@ module Travis::API::V3 visible? branch.repository end + def job_visible?(job) + visible? job.repository + end + def organization_visible?(organization) full_access? or public_api? end diff --git a/lib/travis/api/v3/models/build.rb b/lib/travis/api/v3/models/build.rb index 219a6913..cecf242d 100644 --- a/lib/travis/api/v3/models/build.rb +++ b/lib/travis/api/v3/models/build.rb @@ -5,7 +5,11 @@ module Travis::API::V3 belongs_to :request belongs_to :repository, autosave: true belongs_to :owner, polymorphic: true - has_many :jobs, as: :source, order: :id, dependent: :destroy + + has_many :jobs, + as: :source, + order: :id, + dependent: :destroy has_one :branch, foreign_key: [:repository_id, :name], diff --git a/lib/travis/api/v3/models/job.rb b/lib/travis/api/v3/models/job.rb index 2db5df10..852f515c 100644 --- a/lib/travis/api/v3/models/job.rb +++ b/lib/travis/api/v3/models/job.rb @@ -1,5 +1,8 @@ module Travis::API::V3 class Models::Job < Model + + self.inheritance_column = :_type_disabled + has_one :log, dependent: :destroy belongs_to :repository belongs_to :commit diff --git a/lib/travis/api/v3/queries/job.rb b/lib/travis/api/v3/queries/job.rb new file mode 100644 index 00000000..b25781cb --- /dev/null +++ b/lib/travis/api/v3/queries/job.rb @@ -0,0 +1,10 @@ +module Travis::API::V3 + class Queries::Job < Query + params :id + + def find + return Models::Job.find_by_id(id) if id + raise WrongParams, 'missing build.id'.freeze + end + end +end diff --git a/lib/travis/api/v3/renderer.rb b/lib/travis/api/v3/renderer.rb index efb0434b..2ee8ca15 100644 --- a/lib/travis/api/v3/renderer.rb +++ b/lib/travis/api/v3/renderer.rb @@ -48,6 +48,7 @@ module Travis::API::V3 when Time then value.strftime('%Y-%m-%dT%H:%M:%SZ') when Model then render_model(value, **options) when ActiveRecord::Relation then render_value(value.to_a, **options) + when ActiveRecord::Associations::CollectionProxy then render_value(value.to_a, **options) else raise ArgumentError, 'cannot render %p (%p)' % [value.class, value] end end diff --git a/lib/travis/api/v3/renderer/build.rb b/lib/travis/api/v3/renderer/build.rb index 0151e65f..a57e5136 100644 --- a/lib/travis/api/v3/renderer/build.rb +++ b/lib/travis/api/v3/renderer/build.rb @@ -2,7 +2,7 @@ require 'travis/api/v3/renderer/model_renderer' module Travis::API::V3 class Renderer::Build < Renderer::ModelRenderer - representation(:minimal, :id, :number, :state, :duration, :event_type, :previous_state, :started_at, :finished_at) - representation(:standard, *representations[:minimal], :repository, :branch, :commit) + representation(:minimal, :id, :number, :state, :duration, :event_type, :previous_state, :started_at, :finished_at, :jobs) + representation(:standard, *representations[:minimal], :repository, :branch, :commit ) end end diff --git a/lib/travis/api/v3/renderer/job.rb b/lib/travis/api/v3/renderer/job.rb new file mode 100644 index 00000000..bb04fda0 --- /dev/null +++ b/lib/travis/api/v3/renderer/job.rb @@ -0,0 +1,8 @@ +require 'travis/api/v3/renderer/model_renderer' + +module Travis::API::V3 + class Renderer::Job < Renderer::ModelRenderer + representation(:minimal, :id) + representation(:standard, *representations[:minimal], :number, :state, :started_at, :finished_at, :build, :queue, :repository, :commit, :owner ) + end +end diff --git a/lib/travis/api/v3/renderer/jobs.rb b/lib/travis/api/v3/renderer/jobs.rb new file mode 100644 index 00000000..14ede7c8 --- /dev/null +++ b/lib/travis/api/v3/renderer/jobs.rb @@ -0,0 +1,6 @@ +module Travis::API::V3 + class Renderer::Jobs < Renderer::CollectionRenderer + type :jobs + collection_key :jobs + end +end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index 710621b0..cf0a3731 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -50,6 +50,12 @@ module Travis::API::V3 get :find end + resource :job do + capture id: :digit + route '/job/{job.id}' + get :find + end + resource :user do capture id: :digit route '/user' diff --git a/lib/travis/api/v3/services.rb b/lib/travis/api/v3/services.rb index 85ecef01..a25984f1 100644 --- a/lib/travis/api/v3/services.rb +++ b/lib/travis/api/v3/services.rb @@ -6,6 +6,7 @@ module Travis::API::V3 Branch = Module.new { extend Services } Build = Module.new { extend Services } Builds = Module.new { extend Services } + Job = 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/job/find.rb b/lib/travis/api/v3/services/job/find.rb new file mode 100644 index 00000000..e8d20316 --- /dev/null +++ b/lib/travis/api/v3/services/job/find.rb @@ -0,0 +1,7 @@ +module Travis::API::V3 + class Services::Job::Find < Service + def run! + find + end + end +end diff --git a/spec/v3/extensions/belongs_to_spec.rb b/spec/v3/extensions/belongs_to_spec.rb index b7a28042..8ed9d92a 100644 --- a/spec/v3/extensions/belongs_to_spec.rb +++ b/spec/v3/extensions/belongs_to_spec.rb @@ -15,4 +15,4 @@ describe Travis::API::V3::Extensions::BelongsTo do example { expect(::Repository.find(repo.id).owner).to be_a(::User) } example { expect(user.repositories).to include(repo) } end -end \ No newline at end of file +end diff --git a/spec/v3/services/accounts/for_current_user_spec.rb b/spec/v3/services/accounts/for_current_user_spec.rb index 823e2361..e81a4f59 100644 --- a/spec/v3/services/accounts/for_current_user_spec.rb +++ b/spec/v3/services/accounts/for_current_user_spec.rb @@ -1,15 +1,15 @@ require 'spec_helper' describe Travis::API::V3::Services::Accounts::ForCurrentUser do - let(:repo) { Repository.by_slug('svenfuchs/minimal').first } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} - before { Permission.create(repository: repo, user: repo.owner, pull: true) } + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } before { repo.update_attribute(:private, true) } after { repo.update_attribute(:private, false) } - let(:org) { Organization.new(login: 'example-org', github_id: 42) } + let(:org) { Travis::API::V3::Models::Organization.new(login: 'example-org', github_id: 42) } before { org.save! } before { org.memberships.create(user: repo.owner) } after { org.delete } diff --git a/spec/v3/services/branch/find_spec.rb b/spec/v3/services/branch/find_spec.rb index 277c6874..5fb56102 100644 --- a/spec/v3/services/branch/find_spec.rb +++ b/spec/v3/services/branch/find_spec.rb @@ -1,13 +1,15 @@ require 'spec_helper' describe Travis::API::V3::Services::Repository::Find do - let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:build) { repo.builds.first } + let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } before { repo.default_branch.save! } describe "public repository, existing branch" do before { get("/v3/repo/#{repo.id}/branch/master") } example { expect(last_response).to be_ok } - example { expect(JSON.load(body)).to be == { + example { expect(JSON.load(body)).to be == { "@type" => "branch", "@href" => "/v3/repo/#{repo.id}/branch/master", "@representation" => "standard", @@ -29,6 +31,24 @@ describe Travis::API::V3::Services::Repository::Find do "event_type" => "push", "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", - "finished_at" => nil}}} + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id}, + {"@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id}, + {"@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id}, + {"@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" =>jobs[3].id}]} + }} end end diff --git a/spec/v3/services/build/find_spec.rb b/spec/v3/services/build/find_spec.rb new file mode 100644 index 00000000..05ffd26f --- /dev/null +++ b/spec/v3/services/build/find_spec.rb @@ -0,0 +1,147 @@ +require 'spec_helper' + +describe Travis::API::V3::Services::Build::Find do + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:build) { repo.builds.first } + let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } + let(:parsed_body) { JSON.load(body) } + + describe "fetching build on a public repository " do + before { get("/v3/build/#{build.id}") } + example { expect(last_response).to be_ok } + end + + describe "fetching a non-existing build" do + before { get("/v3/build/1231987129387218") } + example { expect(last_response).to be_not_found } + example { expect(parsed_body).to be == { + "@type" => "error", + "error_type" => "not_found", + "error_message" => "build not found (or insufficient access)", + "resource_type" => "build" + }} + end + + describe "build on public repository" do + before { get("/v3/build/#{build.id}") } + example { expect(last_response).to be_ok } + example { expect(parsed_body).to be == { + "@type" => "build", + "@href" => "/v3/build/#{build.id}", + "@representation" => "standard", + "id" => build.id, + "number" => build.number, + "state" => build.state, + "duration" => nil, + "event_type" => "push", + "previous_state" => build.previous_state, + "started_at" => "2010-11-12T13:00:00Z", + "finished_at" => nil, + "jobs" =>[ + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=> "minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=> "minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=> "minimal", + "id" => jobs[3].id}], + "repository" => { + "@type" => "repository", + "@href" => "/v3/repo/#{repo.id}", + "@representation"=> "minimal", + "id" => repo.id, + "slug" => "svenfuchs/minimal" }, + "branch" => { + "@type" => "branch", + "@href" => "/v3/repo/#{repo.id}/branch/master", + "@representation"=> "minimal", + "name" => "master", + "last_build" => { + "@href" => "/v3/build/#{build.id}" }}, + "commit" => { + "@type" => "commit", + "@representation"=> "minimal", + "id" => 5, + "sha" => "add057e66c3e1d59ef1f", + "ref" => "refs/heads/master", + "message" => "unignore Gemfile.lock", + "compare_url" => "https://github.com/svenfuchs/minimal/compare/master...develop", + "committed_at" => "2010-11-12T12:55:00Z"} + }} + end + + describe "build private repository, private API, authenticated as user with access" do + let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } + let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } + before { repo.update_attribute(:private, true) } + before { get("/v3/build/#{build.id}", {}, headers) } + after { repo.update_attribute(:private, false) } + example { expect(last_response).to be_ok } + example { expect(parsed_body).to be == { + "@type" => "build", + "@href" => "/v3/build/#{build.id}", + "@representation" => "standard", + "id" => build.id, + "number" => build.number, + "state" => build.state, + "duration" => nil, + "event_type" => "push", + "previous_state" => build.previous_state, + "started_at" => "2010-11-12T13:00:00Z", + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id}, + {"@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id}, + {"@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id}, + {"@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" =>jobs[3].id}], + "repository" => { + "@type" => "repository", + "@href" => "/v3/repo/#{repo.id}", + "@representation"=> "minimal", + "id" => repo.id, + "slug" => "svenfuchs/minimal" }, + "branch" => { + "@type" => "branch", + "@href" => "/v3/repo/#{repo.id}/branch/master", + "@representation"=> "minimal", + "name" => "master", + "last_build" => { + "@href" => "/v3/build/#{build.id}" }}, + "commit" => { + "@type" => "commit", + "@representation"=> "minimal", + "id" => 5, + "sha" => "add057e66c3e1d59ef1f", + "ref" => "refs/heads/master", + "message" => "unignore Gemfile.lock", + "compare_url" => "https://github.com/svenfuchs/minimal/compare/master...develop", + "committed_at" => "2010-11-12T12:55:00Z"} + }} + end +end diff --git a/spec/v3/services/builds/find_spec.rb b/spec/v3/services/builds/find_spec.rb index c882d78a..65801147 100644 --- a/spec/v3/services/builds/find_spec.rb +++ b/spec/v3/services/builds/find_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' describe Travis::API::V3::Services::Builds::Find do let(:repo) { Repository.by_slug('svenfuchs/minimal').first } let(:build) { repo.builds.last } + let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } let(:parsed_body) { JSON.load(body) } describe "fetching builds on a public repository by slug" do @@ -59,6 +60,27 @@ describe Travis::API::V3::Services::Builds::Find do "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", "finished_at" => nil, + "jobs" =>[ + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=> "minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=> "minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=> "minimal", + "id" => jobs[3].id}], "repository" => { "@type" => "repository", "@href" => "/v3/repo/#{repo.id}", @@ -80,19 +102,20 @@ describe Travis::API::V3::Services::Builds::Find do "ref" => "refs/heads/master", "message" => "unignore Gemfile.lock", "compare_url" => "https://github.com/svenfuchs/minimal/compare/master...develop", - "committed_at" => "2010-11-12T12:55:00Z"}}], - }} + "committed_at" => "2010-11-12T12:55:00Z"}, + }] + }} end describe "builds private repository, private API, authenticated as user with access" do let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} - before { Permission.create(repository: repo, user: repo.owner, pull: true) } + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } before { repo.update_attribute(:private, true) } before { get("/v3/repo/#{repo.id}/builds?limit=1", {}, headers) } after { repo.update_attribute(:private, false) } example { expect(last_response).to be_ok } - example { expect(parsed_body).to be == { + example { expect(parsed_body).to be == { "@type" => "builds", "@href" => "/v3/repo/#{repo.id}/builds?limit=1", "@representation" => "standard", @@ -105,7 +128,7 @@ describe Travis::API::V3::Services::Builds::Find do "next" => { "@href" => "/v3/repo/#{repo.id}/builds?limit=1&offset=1", "offset" => 1, - "limit" => 1 }, + "limit" => 1}, "prev" => nil, "first" => { "@href" => "/v3/repo/#{repo.id}/builds?limit=1", @@ -127,19 +150,40 @@ describe Travis::API::V3::Services::Builds::Find do "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", "finished_at" => nil, + "jobs" =>[ + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=> "minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=> "minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=> "minimal", + "id" => jobs[3].id}], "repository" => { "@type" => "repository", "@href" => "/v3/repo/#{repo.id}", "@representation"=> "minimal", "id" => repo.id, - "slug" => "svenfuchs/minimal"}, + "slug" => "svenfuchs/minimal" }, "branch" => { "@type" => "branch", "@href" => "/v3/repo/#{repo.id}/branch/master", "@representation"=> "minimal", "name" => "master", "last_build" => { - "@href" => "/v3/build/#{build.id}"}}, + "@href" => "/v3/build/#{build.id}" }}, "commit" => { "@type" => "commit", "@representation"=> "minimal", @@ -148,7 +192,8 @@ describe Travis::API::V3::Services::Builds::Find do "ref" => "refs/heads/master", "message" => "unignore Gemfile.lock", "compare_url" => "https://github.com/svenfuchs/minimal/compare/master...develop", - "committed_at" => "2010-11-12T12:55:00Z"}}] + "committed_at" => "2010-11-12T12:55:00Z"} + }] }} end diff --git a/spec/v3/services/job/find_spec.rb b/spec/v3/services/job/find_spec.rb new file mode 100644 index 00000000..fba9c4f0 --- /dev/null +++ b/spec/v3/services/job/find_spec.rb @@ -0,0 +1,163 @@ +require 'spec_helper' + +describe Travis::API::V3::Services::Job::Find do + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:owner_href) { repo.owner_type.downcase } + let(:owner_type) { repo.owner_type.constantize } + let(:owner) { owner_type.find(repo.owner_id)} + let(:build) { repo.builds.last } + let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } + let(:job) { Travis::API::V3::Models::Build.find(build.id).jobs.last } + let(:commit) { job.commit } + let(:parsed_body) { JSON.load(body) } + + describe "fetching job on a public repository" do + before { get("/v3/job/#{job.id}") } + example { expect(last_response).to be_ok } + example { expect(parsed_body).to be == { + "@type" => "job", + "@href" => "/v3/job/#{job.id}", + "@representation" => "standard", + "id" => job.id, + "number" => job.number, + "state" => job.state, + "started_at" => "2010-11-12T12:00:00Z", + "finished_at" => "2010-11-12T12:00:10Z", + "build" => { + "@type" => "build", + "@href" => "/v3/build/#{build.id}", + "@representation" => "minimal", + "id" => build.id, + "number" => build.number, + "state" => build.state, + "duration" => build.duration, + "event_type" => build.event_type, + "previous_state" => build.previous_state, + "started_at" => "2010-11-12T12:00:00Z", + "finished_at" => "2010-11-12T12:00:10Z", + "jobs" =>[ + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=> "minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=> "minimal", + "id" => jobs[2].id}, + { + "@href" => "/v3/job/#{jobs[3].id}"}]}, + "queue" => job.queue, + "repository" => { + "@type" => "repository", + "@href" => "/v3/repo/#{repo.id}", + "@representation" => "minimal", + "id" => repo.id, + "slug" => repo.slug}, + "commit" => { + "@type" => "commit", + "@representation" => "minimal", + "id" => commit.id, + "sha" => commit.commit, + "ref" => commit.ref, + "message" => commit.message, + "compare_url" => commit.compare_url, + "committed_at" => "2010-11-12T11:50:00Z"}, + "owner" => { + "@type" => owner_type.to_s.downcase, + "@href" => "/v3/#{owner_href}/#{owner.id}", + "@representation" => "minimal", + "id" => owner.id, + "login" => owner.login} + }} + end + + describe "fetching a non-existing job" do + before { get("/v3/job/1233456789") } + example { expect(last_response).to be_not_found } + example { expect(parsed_body).to be == { + "@type" => "error", + "error_type" => "not_found", + "error_message" => "job not found (or insufficient access)", + "resource_type" => "job" + }} + end + + describe "fetching job on private repository, private API, authenticated as user with access" do + let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } + let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } + before { repo.update_attribute(:private, true) } + before { get("/v3/job/#{job.id}", {}, headers) } + after { repo.update_attribute(:private, false) } + example { expect(last_response).to be_ok } + example { expect(parsed_body).to be == { + "@type" => "job", + "@href" => "/v3/job/#{job.id}", + "@representation" => "standard", + "id" => job.id, + "number" => job.number, + "state" => job.state, + "started_at" => "2010-11-12T12:00:00Z", + "finished_at" => "2010-11-12T12:00:10Z", + "build" => { + "@type" => "build", + "@href" => "/v3/build/#{build.id}", + "@representation" => "minimal", + "id" => build.id, + "number" => build.number, + "state" => build.state, + "duration" => build.duration, + "event_type" => build.event_type, + "previous_state" => build.previous_state, + "started_at" => "2010-11-12T12:00:00Z", + "finished_at" => "2010-11-12T12:00:10Z", + "jobs" =>[ + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=> "minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=> "minimal", + "id" => jobs[2].id}, + { + "@href" => "/v3/job/#{jobs[3].id}"}]}, + "queue" => job.queue, + "repository" => { + "@type" => "repository", + "@href" => "/v3/repo/#{repo.id}", + "@representation" => "minimal", + "id" => repo.id, + "slug" => repo.slug}, + "commit" => { + "@type" => "commit", + "@representation" => "minimal", + "id" => commit.id, + "sha" => commit.commit, + "ref" => commit.ref, + "message" => commit.message, + "compare_url" => commit.compare_url, + "committed_at" => "2010-11-12T11:50:00Z"}, + "owner" => { + "@type" => owner_type.to_s.downcase, + "@href" => "/v3/#{owner_href}/#{owner.id}", + "@representation" => "minimal", + "id" => owner.id, + "login" => owner.login} + }} + end +end diff --git a/spec/v3/services/organization/find_spec.rb b/spec/v3/services/organization/find_spec.rb index c0b2e3e4..216265f6 100644 --- a/spec/v3/services/organization/find_spec.rb +++ b/spec/v3/services/organization/find_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Travis::API::V3::Services::Organization::Find do - let(:org) { Organization.new(login: 'example-org') } + let(:org) { Travis::API::V3::Models::Organization.new(login: 'example-org') } before { org.save! } after { org.delete } diff --git a/spec/v3/services/organizations/for_current_user_spec.rb b/spec/v3/services/organizations/for_current_user_spec.rb index 04e5dd0e..eb978cac 100644 --- a/spec/v3/services/organizations/for_current_user_spec.rb +++ b/spec/v3/services/organizations/for_current_user_spec.rb @@ -1,15 +1,15 @@ require 'spec_helper' describe Travis::API::V3::Services::Organizations::ForCurrentUser do - let(:repo) { Repository.by_slug('svenfuchs/minimal').first } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} - before { Permission.create(repository: repo, user: repo.owner, pull: true) } + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } before { repo.update_attribute(:private, true) } after { repo.update_attribute(:private, false) } - let(:org) { Organization.new(login: 'example-org') } + let(:org) { Travis::API::V3::Models::Organization.new(login: 'example-org') } before { org.save! } before { org.memberships.create(user: repo.owner) } after { org.delete } diff --git a/spec/v3/services/owner/find_spec.rb b/spec/v3/services/owner/find_spec.rb index 61f253ce..2399d2c6 100644 --- a/spec/v3/services/owner/find_spec.rb +++ b/spec/v3/services/owner/find_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' describe Travis::API::V3::Services::Owner::Find do describe "organization" do - let(:org) { Organization.new(login: 'example-org') } + let(:org) { Travis::API::V3::Models::Organization.new(login: 'example-org') } before { org.save! } after { org.delete } @@ -23,7 +23,7 @@ describe Travis::API::V3::Services::Owner::Find do end describe 'eager loading repositories via organization.repositories' do - let(:repo) { Repository.new(name: 'example-repo', owner_name: 'example-org', owner_id: org.id, owner_type: 'Organization')} + let(:repo) { Travis::API::V3::Models::Repository.new(name: 'example-repo', owner_name: 'example-org', owner_id: org.id, owner_type: 'Organization')} before { repo.save! } after { repo.destroy } @@ -69,7 +69,7 @@ describe Travis::API::V3::Services::Owner::Find do end describe 'eager loading repositories via owner.repositories' do - let(:repo) { Repository.new(name: 'example-repo', owner_name: 'example-org', owner_id: org.id, owner_type: 'Organization')} + let(:repo) { Travis::API::V3::Models::Repository.new(name: 'example-repo', owner_name: 'example-org', owner_id: org.id, owner_type: 'Organization')} before { repo.save! } after { repo.destroy } @@ -131,7 +131,7 @@ describe Travis::API::V3::Services::Owner::Find do end describe "does not allow overriding org id" do - let(:other) { Organization.new(login: 'other-org') } + let(:other) { Travis::API::V3::Models::Organization.new(login: 'other-org') } before { other.save! } after { other.delete } @@ -157,7 +157,7 @@ describe Travis::API::V3::Services::Owner::Find do end describe "user" do - let(:user) { User.new(login: 'example-user') } + let(:user) { Travis::API::V3::Models::User.new(login: 'example-user') } before { user.save! } after { user.delete } @@ -198,7 +198,7 @@ describe Travis::API::V3::Services::Owner::Find do end describe "does not allow overriding user id" do - let(:other) { User.new(login: 'other-user') } + let(:other) { Travis::API::V3::Models::User.new(login: 'other-user') } before { other.save! } after { other.delete } diff --git a/spec/v3/services/owner/repositories_spec.rb b/spec/v3/services/owner/repositories_spec.rb index 450a5abd..48c4673b 100644 --- a/spec/v3/services/owner/repositories_spec.rb +++ b/spec/v3/services/owner/repositories_spec.rb @@ -1,21 +1,23 @@ require 'spec_helper' describe Travis::API::V3::Services::Owner::Repositories do - let(:repo) { Repository.by_slug('svenfuchs/minimal').first } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:build) { repo.builds.first } + let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} - before { Permission.create(repository: repo, user: repo.owner, pull: true) } + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } before { repo.update_attribute(:private, true) } after { repo.update_attribute(:private, false) } describe "private repository, private API, authenticated as user with access" do - before { get("/v3/owner/svenfuchs/repos", {}, headers) } - example { expect(last_response).to be_ok } + before { get("/v3/owner/svenfuchs/repos", {}, headers) } + example { expect(last_response).to be_ok } example { expect(JSON.load(body)).to be == { "@type" => "repositories", "@href" => "/v3/owner/svenfuchs/repos", - "@representation" => "standard", + "@representation" => "standard", "repositories" => [{ "@type" => "repository", "@href" => "/v3/repo/#{repo.id}", @@ -25,21 +27,21 @@ describe Travis::API::V3::Services::Owner::Repositories do "enable" => false, "disable" => false, "create_request" => false}, - "id" => repo.id, - "name" => "minimal", - "slug" => "svenfuchs/minimal", + "id" => repo.id, + "name" => "minimal", + "slug" => "svenfuchs/minimal", "description" => nil, "github_language" => nil, "active" => true, "private" => true, "owner" => { "@type" => "user", - "@href" => "/v3/user/#{repo.owner_id}", "id" => repo.owner_id, - "login" => "svenfuchs" }, + "login" => "svenfuchs", + "@href" => "/v3/user/#{repo.owner_id}" }, "last_build" => { "@type" => "build", - "@href" => "/v3/build/#{repo.last_build_id}", + "@href" => "/v3/build/#{repo.last_build.id}", "id" => repo.last_build_id, "number" => "2", "state" => "passed", @@ -53,16 +55,38 @@ describe Travis::API::V3::Services::Owner::Repositories do "name" => "master", "last_build" => { "@type" => "build", - "@href" => "/v3/build/#{repo.last_build.id}", + "@href" => "/v3/build/#{repo.default_branch.last_build.id}", "@representation"=> "minimal", - "id" => repo.last_build.id, + "id" => repo.default_branch.last_build.id, "number" => "3", "state" => "configured", "duration" => nil, "event_type" => "push", "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", - "finished_at" => nil}}}] + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=>"minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" => jobs[3].id}] + + }}}] }} end diff --git a/spec/v3/services/repositories/for_current_user_spec.rb b/spec/v3/services/repositories/for_current_user_spec.rb index 202e4253..79138a7c 100644 --- a/spec/v3/services/repositories/for_current_user_spec.rb +++ b/spec/v3/services/repositories/for_current_user_spec.rb @@ -1,11 +1,13 @@ require 'spec_helper' describe Travis::API::V3::Services::Repositories::ForCurrentUser do - let(:repo) { Repository.by_slug('svenfuchs/minimal').first } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:build) { repo.builds.first } + let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} - before { Permission.create(repository: repo, user: repo.owner, pull: true, push: true) } + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true, push: true) } before { repo.update_attribute(:private, true) } after { repo.update_attribute(:private, false) } @@ -53,16 +55,37 @@ describe Travis::API::V3::Services::Repositories::ForCurrentUser do "name" => "master", "last_build" => { "@type" => "build", - "@href" => "/v3/build/#{repo.last_build.id}", + "@href" => "/v3/build/#{repo.default_branch.last_build.id}", "@representation"=> "minimal", - "id" => repo.last_build.id, + "id" => repo.default_branch.last_build.id, "number" => "3", "state" => "configured", "duration" => nil, "event_type" => "push", "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", - "finished_at" => nil}}}] + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=>"minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" => jobs[3].id}] + }}}] }} end diff --git a/spec/v3/services/repository/find_spec.rb b/spec/v3/services/repository/find_spec.rb index 5f4998d8..9bc6b750 100644 --- a/spec/v3/services/repository/find_spec.rb +++ b/spec/v3/services/repository/find_spec.rb @@ -1,7 +1,9 @@ require 'spec_helper' describe Travis::API::V3::Services::Repository::Find do - let(:repo) { Repository.by_slug('svenfuchs/minimal').first } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:build) { repo.builds.first } + let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } let(:parsed_body) { JSON.load(body) } describe "fetching a public repository by slug" do @@ -41,10 +43,10 @@ describe Travis::API::V3::Services::Repository::Find do "active" => true, "private" => false, "owner" => { - "@type" => "user", - "@href" => "/v3/user/#{repo.owner_id}", "id" => repo.owner_id, - "login" => "svenfuchs" }, + "login" => "svenfuchs", + "@type" => "user", + "@href" => "/v3/user/#{repo.owner_id}"}, "last_build" => { "@type" => "build", "@href" => "/v3/build/#{repo.last_build_id}", @@ -61,16 +63,37 @@ describe Travis::API::V3::Services::Repository::Find do "name" => "master", "last_build" => { "@type" => "build", - "@href" => "/v3/build/#{repo.last_build.id}", + "@href" => "/v3/build/#{repo.default_branch.last_build.id}", "@representation"=> "minimal", - "id" => repo.last_build.id, + "id" => repo.default_branch.last_build.id, "number" => "3", "state" => "configured", "duration" => nil, "event_type" => "push", "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", - "finished_at" => nil}} + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=>"minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" => jobs[3].id}] + }} }} end @@ -114,7 +137,7 @@ describe Travis::API::V3::Services::Repository::Find do describe "private repository, private API, authenticated as user with access" do let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} - before { Permission.create(repository: repo, user: repo.owner, pull: true) } + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } before { repo.update_attribute(:private, true) } before { get("/v3/repo/#{repo.id}", {}, headers) } after { repo.update_attribute(:private, false) } @@ -136,10 +159,10 @@ describe Travis::API::V3::Services::Repository::Find do "active" => true, "private" => true, "owner" => { - "@type" => "user", - "@href" => "/v3/user/#{repo.owner_id}", "id" => repo.owner_id, - "login" => "svenfuchs" }, + "login" => "svenfuchs", + "@type" => "user", + "@href" => "/v3/user/#{repo.owner_id}"}, "last_build" => { "@type" => "build", "@href" => "/v3/build/#{repo.last_build_id}", @@ -156,16 +179,37 @@ describe Travis::API::V3::Services::Repository::Find do "name" => "master", "last_build" => { "@type" => "build", - "@href" => "/v3/build/#{repo.last_build.id}", + "@href" => "/v3/build/#{repo.default_branch.last_build.id}", "@representation"=> "minimal", - "id" => repo.last_build.id, + "id" => repo.default_branch.last_build.id, "number" => "3", "state" => "configured", "duration" => nil, "event_type" => "push", "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", - "finished_at" => nil}} + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=>"minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" => jobs[3].id}] + }} }} end @@ -216,10 +260,10 @@ describe Travis::API::V3::Services::Repository::Find do "active" => true, "private" => true, "owner" => { - "@type" => "user", - "@href" => "/v3/user/#{repo.owner_id}", "id" => repo.owner_id, - "login" => "svenfuchs" }, + "login" => "svenfuchs", + "@type" => "user", + "@href" => "/v3/user/#{repo.owner_id}"}, "last_build" => { "@type" => "build", "@href" => "/v3/build/#{repo.last_build_id}", @@ -236,16 +280,37 @@ describe Travis::API::V3::Services::Repository::Find do "name" => "master", "last_build" => { "@type" => "build", - "@href" => "/v3/build/#{repo.last_build.id}", + "@href" => "/v3/build/#{repo.default_branch.last_build.id}", "@representation"=> "minimal", - "id" => repo.last_build.id, + "id" => repo.default_branch.last_build.id, "number" => "3", "state" => "configured", "duration" => nil, "event_type" => "push", "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", - "finished_at" => nil}} + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=>"minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" => jobs[3].id}] + }} }} end @@ -302,10 +367,10 @@ describe Travis::API::V3::Services::Repository::Find do "active" => true, "private" => true, "owner" => { - "@type" => "user", - "@href" => "/v3/user/#{repo.owner_id}", "id" => repo.owner_id, - "login" => "svenfuchs" }, + "login" => "svenfuchs", + "@type" => "user", + "@href" => "/v3/user/#{repo.owner_id}"}, "last_build" => { "@type" => "build", "@href" => "/v3/build/#{repo.last_build_id}", @@ -322,16 +387,37 @@ describe Travis::API::V3::Services::Repository::Find do "name" => "master", "last_build" => { "@type" => "build", - "@href" => "/v3/build/#{repo.last_build.id}", + "@href" => "/v3/build/#{repo.default_branch.last_build.id}", "@representation"=> "minimal", - "id" => repo.last_build.id, + "id" => repo.default_branch.last_build.id, "number" => "3", "state" => "configured", "duration" => nil, "event_type" => "push", "previous_state" => "passed", "started_at" => "2010-11-12T13:00:00Z", - "finished_at" => nil}} + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=>"minimal", + "id" => jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" => jobs[3].id}] + }} }} end diff --git a/spec/v3/services/user/current_spec.rb b/spec/v3/services/user/current_spec.rb index ac6d38cc..4557ee2b 100644 --- a/spec/v3/services/user/current_spec.rb +++ b/spec/v3/services/user/current_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Travis::API::V3::Services::User::Current do - let(:user) { User.find_by_login('svenfuchs') } + let(:user) { Travis::API::V3::Models::User.find_by_login('svenfuchs') } let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} diff --git a/spec/v3/services/user/find_spec.rb b/spec/v3/services/user/find_spec.rb index 1c0517ec..9155cb63 100644 --- a/spec/v3/services/user/find_spec.rb +++ b/spec/v3/services/user/find_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Travis::API::V3::Services::User::Find do - let(:user) { User.find_by_login('svenfuchs') } + let(:user) { Travis::API::V3::Models::User.find_by_login('svenfuchs') } let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }}