diff --git a/Gemfile b/Gemfile index 9334227c..f305cbbc 100644 --- a/Gemfile +++ b/Gemfile @@ -36,6 +36,7 @@ gem 'jemalloc' group :test do gem 'rspec', '~> 2.13' + gem 'webmock' gem 'factory_girl', '~> 2.4.0' gem 'mocha', '~> 0.12' gem 'database_cleaner', '~> 0.8.0' diff --git a/Gemfile.lock b/Gemfile.lock index 31c70b7b..bf306a9c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -157,6 +157,8 @@ GEM composite_primary_keys (5.0.14) activerecord (~> 3.2.0, >= 3.2.9) connection_pool (2.1.1) + crack (0.4.2) + safe_yaml (~> 1.0.0) dalli (2.7.2) data_migrations (0.0.1) activerecord @@ -184,6 +186,7 @@ GEM multi_json (~> 1.0) net-http-persistent (>= 2.7) net-http-pipeline + hashdiff (0.2.3) hashr (0.0.22) hike (1.2.3) hitimes (1.2.3) @@ -270,6 +273,7 @@ GEM rspec-expectations (2.99.2) diff-lcs (>= 1.1.3, < 2.0) rspec-mocks (2.99.2) + safe_yaml (1.0.4) sidekiq (3.3.0) celluloid (>= 0.16.0) connection_pool (>= 2.0.0) @@ -327,6 +331,10 @@ GEM coercible (~> 1.0) descendants_tracker (~> 0.0, >= 0.0.3) equalizer (~> 0.0, >= 0.0.9) + webmock (1.22.3) + addressable (>= 2.3.6) + crack (>= 0.3.2) + hashdiff yard (0.8.7.6) PLATFORMS @@ -368,4 +376,8 @@ DEPENDENCIES travis-support! travis-yaml! unicorn + webmock yard-sinatra! + +BUNDLED WITH + 1.10.6 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ced5e7af..68c01136 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -8,6 +8,7 @@ require 'sinatra/test_helpers' require 'logger' require 'gh' require 'multi_json' +require 'webmock/rspec' require 'travis/api/app' require 'travis/testing' diff --git a/spec/v3/services/repository/disable_spec.rb b/spec/v3/services/repository/disable_spec.rb index fbf5f822..97439dd9 100644 --- a/spec/v3/services/repository/disable_spec.rb +++ b/spec/v3/services/repository/disable_spec.rb @@ -2,20 +2,10 @@ require 'spec_helper' describe Travis::API::V3::Services::Repository::Disable do let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } - # let(:sidekiq_payload) { JSON.load(Sidekiq::Client.last['args'].last.to_json) } - # let(:sidekiq_params) { Sidekiq::Client.last['args'].last.deep_symbolize_keys } before do repo.update_attributes!(active: true) Travis::Features.stubs(:owner_active?).returns(true) - @original_sidekiq = Sidekiq::Client - Sidekiq.send(:remove_const, :Client) # to avoid a warning - Sidekiq::Client = [] - end - - after do - Sidekiq.send(:remove_const, :Client) # to avoid a warning - Sidekiq::Client = @original_sidekiq end describe "not authenticated" do @@ -79,41 +69,30 @@ describe Travis::API::V3::Services::Repository::Disable do describe "existing repository, push access" do let(:params) {{}} - let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } - let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } + let(:headers) {{ 'Http-Authorization' => "token #{token}" }} + let(:uri) { "/v3/repo/#{repo.id}/disable" } + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, push: true, admin: true) } - # this is failing because it's actually going to github - before { post("/v3/repo/#{repo.id}/disable", params, headers) } + before { stub_request(:get, "https://api.github.com/repos/svenfuchs/minimal/hooks?per_page=100"). + with(:headers => {'Accept'=>'application/vnd.github.v3+json,application/vnd.github.beta+json;q=0.5,application/json;q=0.1', 'Accept-Charset'=>'utf-8', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'token github_oauth_token', 'Origin'=>'travis-ci.org', 'User-Agent'=>'Travis-API/3 Travis-CI/0.0.1 GH/0.14.0'}). + to_return(:status => 202, :body => "hello", :headers => {}) } + before { stub_request(:post, "http://v3/repo/1/disable"). + with(:headers => headers) } + before { post(uri) } example { expect(last_response.status).to be == 202 } example { expect(JSON.load(body).to_s).to include( "@type", - "job", + "cxxxxxxxxxx", "@href", "@representation", "minimal", - "cancel", + "disable", "id", - "state_change") + "xxxxxxxxxxx") } - example { expect(sidekiq_payload).to be == { - "id" => "#{job.id}", - "user_id"=> repo.owner_id, - "source" => "api"} - } - - example { expect(Sidekiq::Client.last['queue']).to be == 'job_cancellations' } - example { expect(Sidekiq::Client.last['class']).to be == 'Travis::Sidekiq::JobCancellation' } - - describe "setting id has no effect" do - let(:params) {{ id: 42 }} - example { expect(sidekiq_payload).to be == { - "id" => "#{job.id}", - "user_id"=> repo.owner_id, - "source" => "api"} - } - end end diff --git a/spec/v3/services/repository/unstar_spec.rb b/spec/v3/services/repository/unstar_spec.rb index 64975c34..d66768ad 100644 --- a/spec/v3/services/repository/unstar_spec.rb +++ b/spec/v3/services/repository/unstar_spec.rb @@ -2,11 +2,10 @@ require 'spec_helper' describe Travis::API::V3::Services::Repository::Unstar do let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } - let(:star) { Travis::API::V3::Models::Star.create(user_id: repo.owner_id, repository_id: repo.id) } - before do - Travis::Features.stubs(:owner_active?).returns(true) - end + # before do + # Travis::API::V3::Models::Star.create(user_id: repo.owner_id, repository_id: repo.id) + # end describe "not authenticated" do before { post("/v3/repo/#{repo.id}/unstar") } @@ -71,8 +70,10 @@ describe Travis::API::V3::Services::Repository::Unstar do let(:params) {{}} let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + let(:star) { Travis::API::V3::Models::Star.create(user_id: repo.owner_id, repository_id: repo.id) } before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, push: true) } before { post("/v3/repo/#{repo.id}/unstar", params, headers) } + after { star.delete } example { expect(last_response.status).to be == 200 } example { expect(JSON.load(body).to_s).to include( @@ -86,4 +87,27 @@ describe Travis::API::V3::Services::Repository::Unstar do } example { expect(Travis::API::V3::Models::Star.where(user_id: repo.owner_id, repository_id: repo.id)).to be == []} end + + + # TODO return an error when alreasy not on the star db + + describe "existing repository, push access, already starred" do + let(:params) {{}} + 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, push: true) } + before { post("/v3/repo/#{repo.id}/unstar", params, headers) } + + example { expect(last_response.status).to be == 403 } + example { expect(JSON.load(body).to_s).to include( + "@type", + "star", + "@href", + "@representation", + "minimal", + "false", + "id") + } + example { expect(Travis::API::V3::Models::Star.where(user_id: repo.owner_id, repository_id: repo.id)).to be == "idushifuhds"} + end end