From afb6fe286b8b4aac4731692703fdf23e57165ce9 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 26 Nov 2015 18:17:19 +0100 Subject: [PATCH] v3: SQL "NOT IN ()" never matches --- Gemfile.lock | 3 --- lib/travis/api/v3/queries/repositories.rb | 2 +- .../repositories/for_current_user_spec.rb | 19 ++++++++++++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8ae03428..31c70b7b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -369,6 +369,3 @@ DEPENDENCIES travis-yaml! unicorn yard-sinatra! - -BUNDLED WITH - 1.10.6 diff --git a/lib/travis/api/v3/queries/repositories.rb b/lib/travis/api/v3/queries/repositories.rb index a0cf722b..6197a0c1 100644 --- a/lib/travis/api/v3/queries/repositories.rb +++ b/lib/travis/api/v3/queries/repositories.rb @@ -24,7 +24,7 @@ module Travis::API::V3 if user and not starred.nil? if bool(starred) list = list.joins(:stars).where(stars: { user_id: user.id }) - else + elsif user.starred_repository_ids.any? list = list.where("repositories.id NOT IN (?)", user.starred_repository_ids) end end diff --git a/spec/v3/services/repositories/for_current_user_spec.rb b/spec/v3/services/repositories/for_current_user_spec.rb index 8dbf6ba9..6bdd1367 100644 --- a/spec/v3/services/repositories/for_current_user_spec.rb +++ b/spec/v3/services/repositories/for_current_user_spec.rb @@ -87,10 +87,10 @@ describe Travis::API::V3::Services::Repositories::ForCurrentUser do end describe "filter: starred=true" do - before { Travis::API::V3::Models::Star.create(user: repo.owner, repository: repo) } - before { get("/v3/repos", {"starred" => "true"}, headers) } - after { repo.owner.stars.each(&:destroy) } - example { expect(last_response) .to be_ok } + before { Travis::API::V3::Models::Star.create(user: repo.owner, repository: repo) } + before { get("/v3/repos", {"starred" => "true"}, headers) } + after { repo.owner.stars.each(&:destroy) } + example { expect(last_response) .to be_ok } example { expect(JSON.load(body)['@href']) .to be == "/v3/repos?starred=true" } example { expect(JSON.load(body)['repositories']) .to be == [{ "@type" => "repository", @@ -128,6 +128,15 @@ describe Travis::API::V3::Services::Repositories::ForCurrentUser do before { get("/v3/repos", {"starred" => "false"}, headers) } example { expect(last_response) .to be_ok } example { expect(JSON.load(body)['@href']) .to be == "/v3/repos?starred=false" } - example { expect(JSON.load(body)['repositories']) .to be == ["all the unstarred repos"] } + example { expect(JSON.load(body)['repositories']) .not_to be_empty } + end + + describe "filter: starred=false but no unstarred repos" do + before { Travis::API::V3::Models::Star.create(user: repo.owner, repository: repo) } + after { repo.owner.stars.each(&:destroy) } + before { get("/v3/repos", {"starred" => "false"}, headers) } + example { expect(last_response) .to be_ok } + example { expect(JSON.load(body)['@href']) .to be == "/v3/repos?starred=false" } + example { expect(JSON.load(body)['repositories']) .to be_empty } end end