Browse Source

Do not change last_contact timestamp if only “notify” has changed (somebody else has changed the tab and on your tab only the notify attribute has changed).

Martin Edenhofer 8 years ago
parent
commit
e1d7609948
2 changed files with 164 additions and 0 deletions
  1. 10 0
      app/models/taskbar.rb
  2. 154 0
      spec/models/taskbar_spec.rb

+ 10 - 0
app/models/taskbar.rb

@@ -33,6 +33,16 @@ class Taskbar < ApplicationModel
 
   def update_last_contact
     return true if local_update
+    return true if changes.empty?
+    if changes['notify']
+      count = 0
+      changes.each { |attribute, _value|
+        next if attribute == 'updated_at'
+        next if attribute == 'created_at'
+        count += 1
+      }
+      return true if count <= 1
+    end
     self.last_contact = Time.zone.now
   end
 

+ 154 - 0
spec/models/taskbar_spec.rb

@@ -30,6 +30,58 @@ RSpec.describe Taskbar do
       expect(taskbar.state.empty?).to eq(true)
     end
 
+    it 'check last_contact' do
+      UserInfo.current_user_id = 1
+
+      last_contact1 = taskbar.last_contact
+
+      travel 2.minutes
+      taskbar.notify = false
+      taskbar.state = { a: 1 }
+      taskbar.save!
+      expect(taskbar.last_contact.to_s).not_to eq(last_contact1.to_s)
+
+      last_contact2 = taskbar.last_contact
+      travel 2.minutes
+      taskbar.notify = true
+      taskbar.save!
+      expect(taskbar.last_contact.to_s).not_to eq(last_contact1.to_s)
+      expect(taskbar.last_contact.to_s).to eq(last_contact2.to_s)
+
+      travel 2.minutes
+      taskbar.notify = true
+      taskbar.save!
+
+      expect(taskbar.last_contact.to_s).not_to eq(last_contact1.to_s)
+      expect(taskbar.last_contact.to_s).to eq(last_contact2.to_s)
+
+      travel 2.minutes
+      taskbar.notify = false
+      taskbar.state = { a: 1 }
+      taskbar.save!
+
+      expect(taskbar.last_contact.to_s).not_to eq(last_contact1.to_s)
+      expect(taskbar.last_contact.to_s).to eq(last_contact2.to_s)
+
+      travel 2.minutes
+      taskbar.notify = true
+      taskbar.state = { a: 1 }
+      taskbar.save!
+
+      expect(taskbar.last_contact.to_s).not_to eq(last_contact1.to_s)
+      expect(taskbar.last_contact.to_s).to eq(last_contact2.to_s)
+
+      travel 2.minutes
+      taskbar.notify = true
+      taskbar.state = { a: 2 }
+      taskbar.save!
+
+      expect(taskbar.last_contact.to_s).not_to eq(last_contact1.to_s)
+      expect(taskbar.last_contact.to_s).not_to eq(last_contact2.to_s)
+
+      travel_back
+    end
+
     UserInfo.current_user_id = nil
   end
 
@@ -262,6 +314,108 @@ RSpec.describe Taskbar do
       expect(taskbar4.preferences[:tasks][2][:user_id]).to eq(3)
       expect(taskbar4.preferences[:tasks][2][:changed]).to eq(false)
 
+      taskbar1_last_contact = taskbar1.last_contact.to_s
+      taskbar2_last_contact = taskbar2.last_contact.to_s
+      taskbar3_last_contact = taskbar3.last_contact.to_s
+      taskbar4_last_contact = taskbar4.last_contact.to_s
+      travel 2.minutes
+
+      UserInfo.current_user_id = 2
+      taskbar2.state = { article: { body: 'some body' }, ticket: {} }
+      taskbar2.notify = true
+      taskbar2.save!
+
+      taskbar1.reload
+      expect(taskbar1.preferences[:tasks].count).to eq(3)
+      expect(taskbar1.preferences[:tasks][0][:user_id]).to eq(1)
+      expect(taskbar1.preferences[:tasks][0][:changed]).to eq(true)
+      expect(taskbar1.preferences[:tasks][0][:last_contact].to_s).to eq(taskbar1_last_contact)
+      expect(taskbar1.preferences[:tasks][1][:user_id]).to eq(2)
+      expect(taskbar1.preferences[:tasks][1][:changed]).to eq(true)
+      expect(taskbar1.preferences[:tasks][1][:last_contact].to_s).to eq(taskbar2_last_contact)
+      expect(taskbar1.preferences[:tasks][2][:user_id]).to eq(3)
+      expect(taskbar1.preferences[:tasks][2][:changed]).to eq(false)
+      expect(taskbar1.preferences[:tasks][2][:last_contact].to_s).to eq(taskbar4_last_contact)
+
+      taskbar2.reload
+      expect(taskbar2.preferences[:tasks].count).to eq(3)
+      expect(taskbar2.preferences[:tasks][0][:user_id]).to eq(1)
+      expect(taskbar2.preferences[:tasks][0][:changed]).to eq(true)
+      expect(taskbar2.preferences[:tasks][0][:last_contact].to_s).to eq(taskbar1_last_contact)
+      expect(taskbar2.preferences[:tasks][1][:user_id]).to eq(2)
+      expect(taskbar2.preferences[:tasks][1][:changed]).to eq(true)
+      expect(taskbar2.preferences[:tasks][1][:last_contact].to_s).to eq(taskbar2_last_contact)
+      expect(taskbar2.preferences[:tasks][2][:user_id]).to eq(3)
+      expect(taskbar2.preferences[:tasks][2][:changed]).to eq(false)
+      expect(taskbar2.preferences[:tasks][2][:last_contact].to_s).to eq(taskbar4_last_contact)
+
+      taskbar3.reload
+      expect(taskbar3.preferences[:tasks].count).to eq(1)
+      expect(taskbar3.preferences[:tasks][0][:user_id]).to eq(2)
+      expect(taskbar3.preferences[:tasks][0][:changed]).to eq(false)
+      expect(taskbar3.preferences[:tasks][0][:last_contact].to_s).to eq(taskbar3_last_contact)
+
+      taskbar4.reload
+      expect(taskbar4.preferences[:tasks].count).to eq(3)
+      expect(taskbar4.preferences[:tasks][0][:user_id]).to eq(1)
+      expect(taskbar4.preferences[:tasks][0][:changed]).to eq(true)
+      expect(taskbar4.preferences[:tasks][0][:last_contact].to_s).to eq(taskbar1_last_contact)
+      expect(taskbar4.preferences[:tasks][1][:user_id]).to eq(2)
+      expect(taskbar4.preferences[:tasks][1][:changed]).to eq(true)
+      expect(taskbar4.preferences[:tasks][1][:last_contact].to_s).to eq(taskbar2_last_contact)
+      expect(taskbar4.preferences[:tasks][2][:user_id]).to eq(3)
+      expect(taskbar4.preferences[:tasks][2][:changed]).to eq(false)
+      expect(taskbar4.preferences[:tasks][2][:last_contact].to_s).to eq(taskbar4_last_contact)
+
+      UserInfo.current_user_id = 2
+      taskbar2.state = { article: { body: 'some body 222' }, ticket: {} }
+      taskbar2.notify = true
+      taskbar2.save!
+
+      taskbar1.reload
+      expect(taskbar1.preferences[:tasks].count).to eq(3)
+      expect(taskbar1.preferences[:tasks][0][:user_id]).to eq(1)
+      expect(taskbar1.preferences[:tasks][0][:changed]).to eq(true)
+      expect(taskbar1.preferences[:tasks][0][:last_contact].to_s).to eq(taskbar1_last_contact)
+      expect(taskbar1.preferences[:tasks][1][:user_id]).to eq(2)
+      expect(taskbar1.preferences[:tasks][1][:changed]).to eq(true)
+      expect(taskbar1.preferences[:tasks][1][:last_contact].to_s).not_to eq(taskbar2_last_contact)
+      expect(taskbar1.preferences[:tasks][2][:user_id]).to eq(3)
+      expect(taskbar1.preferences[:tasks][2][:changed]).to eq(false)
+      expect(taskbar1.preferences[:tasks][2][:last_contact].to_s).to eq(taskbar4_last_contact)
+
+      taskbar2.reload
+      expect(taskbar2.preferences[:tasks].count).to eq(3)
+      expect(taskbar2.preferences[:tasks][0][:user_id]).to eq(1)
+      expect(taskbar2.preferences[:tasks][0][:changed]).to eq(true)
+      expect(taskbar2.preferences[:tasks][0][:last_contact].to_s).to eq(taskbar1_last_contact)
+      expect(taskbar2.preferences[:tasks][1][:user_id]).to eq(2)
+      expect(taskbar2.preferences[:tasks][1][:changed]).to eq(true)
+      expect(taskbar2.preferences[:tasks][1][:last_contact].to_s).not_to eq(taskbar2_last_contact)
+      expect(taskbar2.preferences[:tasks][2][:user_id]).to eq(3)
+      expect(taskbar2.preferences[:tasks][2][:changed]).to eq(false)
+      expect(taskbar2.preferences[:tasks][2][:last_contact].to_s).to eq(taskbar4_last_contact)
+
+      taskbar3.reload
+      expect(taskbar3.preferences[:tasks].count).to eq(1)
+      expect(taskbar3.preferences[:tasks][0][:user_id]).to eq(2)
+      expect(taskbar3.preferences[:tasks][0][:changed]).to eq(false)
+      expect(taskbar3.preferences[:tasks][0][:last_contact].to_s).to eq(taskbar3_last_contact)
+
+      taskbar4.reload
+      expect(taskbar4.preferences[:tasks].count).to eq(3)
+      expect(taskbar4.preferences[:tasks][0][:user_id]).to eq(1)
+      expect(taskbar4.preferences[:tasks][0][:changed]).to eq(true)
+      expect(taskbar4.preferences[:tasks][0][:last_contact].to_s).to eq(taskbar1_last_contact)
+      expect(taskbar4.preferences[:tasks][1][:user_id]).to eq(2)
+      expect(taskbar4.preferences[:tasks][1][:changed]).to eq(true)
+      expect(taskbar4.preferences[:tasks][1][:last_contact].to_s).not_to eq(taskbar2_last_contact)
+      expect(taskbar4.preferences[:tasks][2][:user_id]).to eq(3)
+      expect(taskbar4.preferences[:tasks][2][:changed]).to eq(false)
+      expect(taskbar4.preferences[:tasks][2][:last_contact].to_s).to eq(taskbar4_last_contact)
+
+      travel_back
+
       UserInfo.current_user_id = nil
     end
   end