Skip to content

Commit

Permalink
[api] Introduce scope for assigned and unassigned reviews
Browse files Browse the repository at this point in the history
Use case of this is when e.g. maintenance group assigns a review to a user, the new review should not be displayed
in maintenance statistics. Only the original one is of interested for them.
  • Loading branch information
ChrisBr authored and evanrolfe committed Jan 26, 2017
1 parent 657ff5f commit 9526146
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 1 deletion.
9 changes: 9 additions & 0 deletions src/api/app/models/review.rb
Expand Up @@ -18,6 +18,15 @@ class NotFoundError < APIException

validate :check_initial, on: [:create]

HISTORY_ELEMENTS_ASSIGNED_SUB_QUERY = <<-SQL
SELECT COUNT(history_elements.id) FROM history_elements
WHERE history_elements.op_object_id = reviews.id
AND history_elements.type = 'HistoryElement::ReviewAssigned'
SQL

scope :assigned, -> { where("(#{HISTORY_ELEMENTS_ASSIGNED_SUB_QUERY}) > 0") }
scope :unassigned, -> { where("(#{HISTORY_ELEMENTS_ASSIGNED_SUB_QUERY}) = 0") }

before_validation(on: :create) do
if read_attribute(:state).nil?
self.state = :new
Expand Down
9 changes: 9 additions & 0 deletions src/api/spec/factories/history_elements.rb
@@ -0,0 +1,9 @@
FactoryGirl.define do
factory :history_element_review_assigned, class: 'HistoryElement::ReviewAssigned' do
type { 'HistoryElement::ReviewAssigned' }
end

factory :history_element_review_accepted, class: 'HistoryElement::ReviewAccepted' do
type { 'HistoryElement::ReviewAccepted' }
end
end
9 changes: 9 additions & 0 deletions src/api/spec/factories/review.rb
@@ -0,0 +1,9 @@
FactoryGirl.define do
factory :review do
state :new

factory :user_review do
by_user { create(:user) }
end
end
end
38 changes: 37 additions & 1 deletion src/api/spec/models/review_spec.rb
@@ -1,5 +1,41 @@
require 'rails_helper'

RSpec.shared_context 'some assigned reviews and some unassigned reviews' do
let!(:user) { create(:user) }

let!(:review_assigned1) { create(:review, by_user: user.login) }
let!(:review_assigned2) { create(:review, by_user: user.login) }
let!(:review_unassigned1) { create(:review, by_user: user.login) }
let!(:review_unassigned2) { create(:review, by_user: user.login) }

let!(:history_element1) do
create(:history_element_review_assigned, op_object_id: review_assigned1.id, user_id: user.id)
end
let!(:history_element2) do
create(:history_element_review_assigned, op_object_id: review_assigned2.id, user_id: user.id)
end
let!(:history_element3) do
create(:history_element_review_accepted, op_object_id: review_assigned2.id, user_id: user.id)
end
let!(:history_element4) do
create(:history_element_review_accepted, op_object_id: review_unassigned1.id, user_id: user.id)
end
end

RSpec.describe Review do
it { should belong_to(:bs_request).touch(true) }
end

describe '.assigned' do
include_context 'some assigned reviews and some unassigned reviews'

subject { Review.assigned }
it { is_expected.to match_array([review_assigned1, review_assigned2]) }
end

describe '.unassigned' do
include_context 'some assigned reviews and some unassigned reviews'

subject { Review.unassigned }
it { is_expected.to match_array([review_unassigned1, review_unassigned2]) }
end
end

0 comments on commit 9526146

Please sign in to comment.