diff --git a/app/models/info_request.rb b/app/models/info_request.rb
index 054b9f57ef8..5a3c7947c84 100644
--- a/app/models/info_request.rb
+++ b/app/models/info_request.rb
@@ -757,7 +757,7 @@ def must_be_internal_or_external
end
end
- def internally_reviewed?
+ def internal_review_requested?
outgoing_messages.where(what_doing: 'internal_review').any?
end
@@ -1043,10 +1043,7 @@ def calculate_status(cached_value_ok=false)
end
def base_calculate_status
- if awaiting_description
- return 'internal_review' if internally_reviewed?
- return 'waiting_classification'
- end
+ return 'waiting_classification' if awaiting_description
return described_state unless described_state == "waiting_response"
# Compare by date, so only overdue on next day, not if 1 second late
return 'waiting_response_very_overdue' if
diff --git a/app/models/info_request/state/calculator.rb b/app/models/info_request/state/calculator.rb
index b4109f120de..f64d995bd08 100644
--- a/app/models/info_request/state/calculator.rb
+++ b/app/models/info_request/state/calculator.rb
@@ -93,7 +93,10 @@ def transitions(opts = {})
other: {}
}
end
- opts.merge!(in_internal_review: state == 'internal_review')
+ opts.merge!(
+ in_internal_review: state == 'internal_review',
+ internal_review_requested: @info_request.internal_review_requested?
+ )
build_transitions_hash(opts)
end
@@ -132,7 +135,11 @@ def pending_states(opts)
if opts.fetch(:in_internal_review, false)
states = %w[internal_review gone_postal]
else
- states = %w[
+ states = []
+ if opts.fetch(:internal_review_requested, false)
+ states += ['internal_review']
+ end
+ states += %w[
waiting_response
waiting_clarification
gone_postal
@@ -141,7 +148,7 @@ def pending_states(opts)
states += ['internal_review']
end
end
- states
+ states.uniq
end
def complete_states(_opts = {})
diff --git a/app/models/info_request/state/transitions.rb b/app/models/info_request/state/transitions.rb
index 149719910ad..b884222b843 100644
--- a/app/models/info_request/state/transitions.rb
+++ b/app/models/info_request/state/transitions.rb
@@ -86,7 +86,8 @@ def self.owner_gone_postal_transition_label(_opts = {})
end
def self.owner_internal_review_transition_label(opts = {})
- if opts.fetch(:in_internal_review, false)
+ if opts.fetch(:in_internal_review, false) ||
+ opts.fetch(:internal_review_requested, false)
_("I'm still waiting for the internal review")
else
_("I'm waiting for an internal review response")
@@ -139,7 +140,8 @@ def self.other_user_gone_postal_transition_label(_opts = {})
end
def self.other_user_internal_review_transition_label(opts = {})
- if opts.fetch(:in_internal_review, false)
+ if opts.fetch(:in_internal_review, false) ||
+ opts.fetch(:internal_review_requested, false)
_("Still awaiting an internal review")
else
# To match what would happen if this method didn't exist, because
diff --git a/spec/models/info_request/state/calculator_spec.rb b/spec/models/info_request/state/calculator_spec.rb
index db80d486693..8c14dec394d 100644
--- a/spec/models/info_request/state/calculator_spec.rb
+++ b/spec/models/info_request/state/calculator_spec.rb
@@ -195,7 +195,11 @@
end
end
- shared_examples 'internal_review' do
+ context "when the request is in internal_review" do
+ before :each do
+ info_request.set_described_state("internal_review")
+ end
+
context "and the user is the owner" do
it "returns only two pending states" do
transitions = calculator.transitions(
@@ -233,23 +237,56 @@
end
end
- context "when the request is in internal_review" do
- before :each do
- info_request.set_described_state("internal_review")
- end
-
- include_examples 'internal_review'
- end
-
- context "when the request was in internal_review" do
+ context "when the request received a response after being in internal_review" do
let(:info_request) do
FactoryBot.create(
:info_request, :with_internal_review_request,
- awaiting_description: true, described_state: 'waiting_response'
+ described_state: 'waiting_response'
)
end
- include_examples 'internal_review'
+ before do
+ mail = Mail.new
+ mail.to info_request.incoming_email
+ mail.body 'Internal review reply'
+ info_request.receive(mail, mail.to_s)
+ end
+
+ context "and the user is the owner" do
+ it "returns only two pending states" do
+ transitions = calculator.transitions(
+ is_owning_user: true,
+ user_asked_to_update_status: false)
+ expected = %w[internal_review waiting_response waiting_clarification gone_postal]
+ expect(transitions[:pending].keys).to eq(expected)
+ end
+
+ it "returns a different label for the internal_review status" do
+ transitions = calculator.transitions(
+ is_owning_user: true,
+ user_asked_to_update_status: false)
+ expected = "I'm still waiting for the internal review"
+ expect(transitions[:pending]["internal_review"]).to eq expected
+ end
+ end
+
+ context "and the user is some other user" do
+ it "returns only two pending states" do
+ transitions = calculator.transitions(
+ is_owning_user: false,
+ user_asked_to_update_status: false)
+ expected = %w[internal_review waiting_response waiting_clarification gone_postal]
+ expect(transitions[:pending].keys).to eq(expected)
+ end
+
+ it "returns a different label for the internal_review status" do
+ transitions = calculator.transitions(
+ is_owning_user: false,
+ user_asked_to_update_status: false)
+ expected = "Still awaiting an internal review"
+ expect(transitions[:pending]["internal_review"]).to eq expected
+ end
+ end
end
context "when the request is in an 'other' state" do
diff --git a/spec/models/info_request_spec.rb b/spec/models/info_request_spec.rb
index 21b7c0b9298..c02e21504aa 100644
--- a/spec/models/info_request_spec.rb
+++ b/spec/models/info_request_spec.rb
@@ -1631,8 +1631,8 @@
end
end
- describe '#internally_reviewed?' do
- subject { info_request.internally_reviewed? }
+ describe '#internal_review_requested?' do
+ subject { info_request.internal_review_requested? }
context 'when internal review has been sent' do
let(:info_request) do