summaryrefslogtreecommitdiff
path: root/spec/models/awareness_session_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/awareness_session_spec.rb')
-rw-r--r--spec/models/awareness_session_spec.rb111
1 files changed, 111 insertions, 0 deletions
diff --git a/spec/models/awareness_session_spec.rb b/spec/models/awareness_session_spec.rb
new file mode 100644
index 00000000000..f1369514610
--- /dev/null
+++ b/spec/models/awareness_session_spec.rb
@@ -0,0 +1,111 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe AwarenessSession do
+ subject { AwarenessSession.for(session_id) }
+
+ let(:user) { create(:user) }
+ let(:session_id) { 1 }
+
+ after do
+ redis_shared_state_cleanup!
+ end
+
+ describe "when a user joins a session" do
+ let(:presence_ttl) { 15.minutes }
+
+ it "changes number of session members" do
+ expect { subject.join(user) }.to change(subject, :size).by(1)
+ end
+
+ it "returns user as member of session with last_activity timestamp" do
+ freeze_time do
+ subject.join(user)
+
+ session_users = subject.users_with_last_activity
+ session_user, last_activity = session_users.first
+
+ expect(session_user.id).to be(user.id)
+ expect(last_activity).to be_eql(Time.now.utc)
+ end
+ end
+
+ it "reports user as present" do
+ freeze_time do
+ subject.join(user)
+
+ expect(subject.present?(user, threshold: presence_ttl)).to be true
+ end
+ end
+
+ it "reports user as away after a certain time on inactivity" do
+ subject.join(user)
+
+ travel_to((presence_ttl + 1.minute).from_now) do
+ expect(subject.away?(user, threshold: presence_ttl)).to be true
+ end
+ end
+
+ it "reports user as present still when there was some activity" do
+ subject.join(user)
+
+ travel_to((presence_ttl - 1.minute).from_now) do
+ subject.touch!(user)
+ end
+
+ travel_to((presence_ttl + 1.minute).from_now) do
+ expect(subject.present?(user, threshold: presence_ttl)).to be true
+ end
+ end
+
+ it "creates user and session awareness keys in store" do
+ subject.join(user)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ keys = redis.scan_each(match: "gitlab:awareness:*").to_a
+
+ expect(keys.size).to be(2)
+ end
+ end
+
+ it "sets a timeout for user and session key" do
+ subject.join(user)
+ subject_id = Digest::SHA256.hexdigest(session_id.to_s)[0, 15]
+
+ Gitlab::Redis::SharedState.with do |redis|
+ ttl_session = redis.ttl("gitlab:awareness:session:#{subject_id}:users")
+ ttl_user = redis.ttl("gitlab:awareness:user:#{user.id}:sessions")
+
+ expect(ttl_session).to be > 0
+ expect(ttl_user).to be > 0
+ end
+ end
+ end
+
+ describe "when a user leaves a session" do
+ it "changes number of session members" do
+ subject.join(user)
+
+ expect { subject.leave(user) }.to change(subject, :size).by(-1)
+ end
+
+ it "destroys the session when it was the last user" do
+ subject.join(user)
+
+ expect { subject.leave(user) }.to change(subject, :id).to(nil)
+ end
+ end
+
+ describe "when last user leaves a session" do
+ it "session and user keys are removed" do
+ subject.join(user)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ expect { subject.leave(user) }
+ .to change { redis.scan_each(match: "gitlab:awareness:*").to_a.size }
+ .to(0)
+ end
+ end
+ end
+end