Browse Source

Fixed bug: Invalid new states should be handled by ActiveRecord and don't cause Ticket#reset_pending_time to fail.

Thorsten Eckel 7 years ago
parent
commit
92f227786f
2 changed files with 27 additions and 0 deletions
  1. 4 0
      app/models/ticket.rb
  2. 23 0
      spec/models/ticket_spec.rb

+ 4 - 0
app/models/ticket.rb

@@ -1094,6 +1094,10 @@ result
     # ignore if no state has changed
     return true if !changes['state_id']
 
+    # ignore if new state is blank and
+    # let handle ActiveRecord the error
+    return if state_id.blank?
+
     # check if new state isn't pending*
     current_state      = Ticket::State.lookup(id: state_id)
     current_state_type = Ticket::StateType.lookup(id: current_state.state_type_id)

+ 23 - 0
spec/models/ticket_spec.rb

@@ -203,4 +203,27 @@ RSpec.describe Ticket do
 
   end
 
+  context 'callbacks' do
+
+    describe '#reset_pending_time' do
+
+      it 'resets the pending time on state change' do
+        ticket = create(:ticket,
+                        state:        Ticket::State.lookup(name: 'pending reminder'),
+                        pending_time: Time.zone.now + 2.days)
+        expect(ticket.pending_time).not_to be nil
+
+        ticket.update_attribute(:state, Ticket::State.lookup(name: 'open'))
+        expect(ticket.pending_time).to be nil
+      end
+
+      it 'lets handle ActiveRecord nil as new value' do
+        ticket = create(:ticket)
+        expect do
+          ticket.update_attribute(:state, nil)
+        end.to raise_error(ActiveRecord::StatementInvalid)
+      end
+
+    end
+  end
 end