spec/acceptance/realtime/presence_spec.rb in ably-0.7.0 vs spec/acceptance/realtime/presence_spec.rb in ably-0.7.1
- old
+ new
@@ -254,10 +254,20 @@
expect(message.data).to eql(data_payload)
stop_reactor
end
end
+ it 'updates the data to nil if :data argument is not provided (assumes nil value)' do
+ presence_client_one.enter(data: 'prior') do
+ presence_client_one.update
+ end
+ presence_client_one.subscribe(:update) do |message|
+ expect(message.data).to be_nil
+ stop_reactor
+ end
+ end
+
it 'returns a Deferrable' do
presence_client_one.enter do
expect(presence_client_one.update).to be_a(EventMachine::Deferrable)
stop_reactor
end
@@ -275,14 +285,15 @@
end
context '#leave' do
context ':data option' do
let(:data) { random_str }
+ let(:enter_data) { random_str }
context 'when set to a string' do
it 'emits the new data for the leave event' do
- presence_client_one.enter data: random_str do
+ presence_client_one.enter data: enter_data do
presence_client_one.leave data: data
end
presence_client_one.subscribe(:leave) do |presence_message|
expect(presence_message.data).to eql(data)
@@ -290,30 +301,30 @@
end
end
end
context 'when set to nil' do
- it 'emits nil data for the leave event' do
- presence_client_one.enter data: random_str do
+ it 'emits the previously defined value as a convenience' do
+ presence_client_one.enter data: enter_data do
presence_client_one.leave data: nil
end
presence_client_one.subscribe(:leave) do |presence_message|
- expect(presence_message.data).to be_nil
+ expect(presence_message.data).to eql(enter_data)
stop_reactor
end
end
end
context 'when not passed as an argument' do
- it 'emits the original data for the leave event' do
- presence_client_one.enter data: data do
+ it 'emits the previously defined value as a convenience' do
+ presence_client_one.enter data: enter_data do
presence_client_one.leave
end
presence_client_one.subscribe(:leave) do |presence_message|
- expect(presence_message.data).to eql(data)
+ expect(presence_message.data).to eql(enter_data)
stop_reactor
end
end
end
end
@@ -378,11 +389,11 @@
client_count.times do |client_id|
presence_client_one.enter_client("client:#{client_id}") do
presence_client_one.on(:entered) { raise 'Should not have entered' }
next unless client_id == client_count - 1
- EventMachine.add_timer(0.5) do
+ EventMachine.add_timer(1) do
expect(presence_client_one.state).to eq(:initialized)
stop_reactor
end
end
end
@@ -433,18 +444,30 @@
presence_anonymous_client.subscribe(:update) do |presence|
expect(presence.data).to eql(data)
clients << presence
next unless clients.count == 5
- EventMachine.add_timer(0.5) do
+ wait_until(proc { updated_callback_count == 5 }) do
expect(clients.map(&:client_id).uniq.count).to eql(5)
expect(updated_callback_count).to eql(5)
stop_reactor
end
end
end
+ it 'updates the data attribute to null for the member when :data option is not provided (assumed null)' do
+ presence_client_one.enter_client('client_1') do
+ presence_client_one.update_client('client_1')
+ end
+
+ presence_anonymous_client.subscribe(:update) do |presence|
+ expect(presence.client_id).to eql('client_1')
+ expect(presence.data).to be_nil
+ stop_reactor
+ end
+ end
+
it 'enters if not already entered' do
updated_callback_count = 0
client_count.times do |client_id|
presence_client_one.update_client("client:#{client_id}", data: data) do
@@ -455,11 +478,11 @@
presence_anonymous_client.subscribe(:enter) do |presence|
expect(presence.data).to eql(data)
clients << presence
next unless clients.count == 5
- EventMachine.add_timer(0.5) do
+ wait_until(proc { updated_callback_count == 5 }) do
expect(clients.map(&:client_id).uniq.count).to eql(5)
expect(updated_callback_count).to eql(5)
stop_reactor
end
end
@@ -496,11 +519,11 @@
presence_anonymous_client.subscribe(:leave) do |presence|
expect(presence.data).to eql(data)
clients << presence
next unless clients.count == 5
- EventMachine.add_timer(0.5) do
+ wait_until(proc { left_callback_count == 5 }) do
expect(clients.map(&:client_id).uniq.count).to eql(5)
expect(left_callback_count).to eql(5)
stop_reactor
end
end
@@ -518,11 +541,11 @@
presence_anonymous_client.subscribe(:leave) do |presence|
expect(presence.data).to be_nil
clients << presence
next unless clients.count == 5
- EventMachine.add_timer(1) do
+ wait_until(proc { left_callback_count == 5 }) do
expect(clients.map(&:client_id).uniq.count).to eql(5)
expect(left_callback_count).to eql(5)
stop_reactor
end
end
@@ -541,24 +564,24 @@
end
end
end
context 'with a nil value in :data option' do
- it 'emits the leave event with a nil value' do
+ it 'emits the leave event with the previous value as a convenience' do
presence_client_one.enter_client("client:unique", data: data) do
presence_client_one.leave_client("client:unique", data: nil)
end
presence_client_one.subscribe(:leave) do |presence_message|
- expect(presence_message.data).to be_nil
+ expect(presence_message.data).to eql(data)
stop_reactor
end
end
end
context 'with no :data option' do
- it 'emits the leave event with the previous data value' do
+ it 'emits the leave event with the previous value as a convenience' do
presence_client_one.enter_client("client:unique", data: data) do
presence_client_one.leave_client("client:unique")
end
presence_client_one.subscribe(:leave) do |presence_message|
@@ -610,11 +633,18 @@
end
end
end
it 'filters by connection_id option if provided' do
- when_all(presence_client_one.enter, presence_client_two.enter, and_wait: 0.5) do
+ presence_client_one.enter do
+ presence_client_two.enter
+ end
+
+ presence_client_one.subscribe(:enter) do |presence_message|
+ # wait until the client_two enter event has been sent to client_one
+ next unless presence_message.client_id == client_two.client_id
+
presence_client_one.get(connection_id: client_one.connection.id) do |members|
expect(members.count).to eq(1)
expect(members.first.connection_id).to eql(client_one.connection.id)
presence_client_one.get(connection_id: client_two.connection.id) do |members|
@@ -625,11 +655,18 @@
end
end
end
it 'filters by client_id option if provided' do
- when_all(presence_client_one.enter(client_id: 'one'), presence_client_two.enter(client_id: 'two')) do
+ presence_client_one.enter(client_id: 'one') do
+ presence_client_two.enter client_id: 'two'
+ end
+
+ presence_client_one.subscribe(:enter) do |presence_message|
+ # wait until the client_two enter event has been sent to client_one
+ next unless presence_message.client_id == 'two'
+
presence_client_one.get(client_id: 'one') do |members|
expect(members.count).to eq(1)
expect(members.first.client_id).to eql('one')
expect(members.first.connection_id).to eql(client_one.connection.id)
@@ -663,25 +700,40 @@
end
end
end
end
- it 'returns both members on both simultaneously connected clients' do
- when_all(presence_client_one.enter(data: data_payload), presence_client_two.enter) do
- EventMachine.add_timer(0.5) do
- presence_client_one.get do |client_one_members|
- presence_client_two.get do |client_two_members|
- expect(client_one_members.count).to eq(client_two_members.count)
+ context 'with lots of members on different clients' do
+ let(:members_per_client) { 10 }
+ let(:clients_entered) { Hash.new { |hash, key| hash[key] = 0 } }
+ let(:total_members) { members_per_client * 2 }
- member_client_one = client_one_members.find { |presence| presence.client_id == client_one.client_id }
- member_client_two = client_one_members.find { |presence| presence.client_id == client_two.client_id }
+ it 'returns a complete list of members on all clients' do
+ members_per_client.times do |index|
+ presence_client_one.enter_client("client_1:#{index}")
+ presence_client_two.enter_client("client_2:#{index}")
+ end
- expect(member_client_one).to be_a(Ably::Models::PresenceMessage)
- expect(member_client_one.data).to eql(data_payload)
- expect(member_client_two).to be_a(Ably::Models::PresenceMessage)
+ presence_client_one.subscribe(:enter) do
+ clients_entered[:client_one] += 1
+ end
- stop_reactor
+ presence_client_two.subscribe(:enter) do
+ clients_entered[:client_two] += 1
+ end
+
+ wait_until(proc { clients_entered[:client_one] + clients_entered[:client_two] == total_members * 2 }) do
+ presence_anonymous_client.get do |anonymous_members|
+ expect(anonymous_members.count).to eq(total_members)
+ expect(anonymous_members.map(&:client_id).uniq.count).to eq(total_members)
+
+ presence_client_one.get do |client_one_members|
+ presence_client_two.get do |client_two_members|
+ expect(client_one_members.count).to eq(total_members)
+ expect(client_one_members.count).to eq(client_two_members.count)
+ stop_reactor
+ end
end
end
end
end
end
@@ -718,10 +770,10 @@
presence_client_two.unsubscribe &subscribe_callback
presence_client_one.enter
presence_client_one.update
presence_client_one.leave do
- EventMachine.add_timer(0.5) do
+ EventMachine.add_timer(1) do
stop_reactor
end
end
end
end