From 28073413eb7a40e72fe98545d9aff590a080b243 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 20 Nov 2017 14:24:59 +0000 Subject: [PATCH] FIX: Presence bug (#5329) * Add failing test case * FIX: new activity was not triggering cleanup --- plugins/discourse-presence/plugin.rb | 12 +++++------ .../spec/requests/presence_controller_spec.rb | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/plugins/discourse-presence/plugin.rb b/plugins/discourse-presence/plugin.rb index 1383b5d245a..07a34a07a08 100644 --- a/plugins/discourse-presence/plugin.rb +++ b/plugins/discourse-presence/plugin.rb @@ -122,9 +122,9 @@ after_initialize do if topic guardian.ensure_can_see!(topic) - any_changes = false - any_changes ||= Presence::PresenceManager.remove(type, id, current_user.id) - any_changes ||= Presence::PresenceManager.cleanup(type, id) + removed = Presence::PresenceManager.remove(type, id, current_user.id) + any_removed = Presence::PresenceManager.cleanup(type, id) + any_changes = removed || any_removed users = Presence::PresenceManager.publish(type, id) if any_changes end @@ -144,9 +144,9 @@ after_initialize do if topic guardian.ensure_can_see!(topic) - any_changes = false - any_changes ||= Presence::PresenceManager.add(type, id, current_user.id) - any_changes ||= Presence::PresenceManager.cleanup(type, id) + added = Presence::PresenceManager.add(type, id, current_user.id) + any_removed = Presence::PresenceManager.cleanup(type, id) + any_changes = added || any_removed users = Presence::PresenceManager.publish(type, id) if any_changes diff --git a/plugins/discourse-presence/spec/requests/presence_controller_spec.rb b/plugins/discourse-presence/spec/requests/presence_controller_spec.rb index 2e667e0c028..0d431567aa7 100644 --- a/plugins/discourse-presence/spec/requests/presence_controller_spec.rb +++ b/plugins/discourse-presence/spec/requests/presence_controller_spec.rb @@ -12,6 +12,8 @@ describe ::Presence::PresencesController do let(:post1) { Fabricate(:post) } let(:post2) { Fabricate(:post) } + let(:manager) { ::Presence::PresenceManager } + after do $redis.del("presence:topic:#{post1.topic.id}") $redis.del("presence:topic:#{post2.topic.id}") @@ -116,6 +118,24 @@ describe ::Presence::PresencesController do expect(messages.count).to eq(3) end + it 'cleans up old users when requested' do + freeze_time Time.zone.now do + manager.add('topic', post1.topic.id, user2.id) + end + + # Anything older than 20 seconds should be cleaned up + freeze_time 30.seconds.from_now do + post '/presence/publish.json', params: { + current: { compose_state: 'open', action: 'reply', topic_id: post1.topic.id }, response_needed: true + } + + data = JSON.parse(response.body) + + expect(data['users'].length).to eq(1) + end + + end + describe 'when post has been deleted' do it 'should return an empty response' do post1.destroy!