From 930b9172950b9eaf2ad4a985d677983c7501f40e Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 9 Aug 2023 22:37:28 +0200 Subject: [PATCH] DEV: fixes flakey spec from auto-join-channel-batch (#23044) The specs were relying a lot on mock and stubs. I suspect that under certain circumstances it didn't play well with fabricators and we ended up with the stub of another spec causing this kind of error: ``` 1) Chat::AutoJoinChannelBatch.call when arguments are valid when channel is found when more than one membership is created publishes an event Failure/Error: subject(:result) { described_class.call(params) } Mocha::ExpectationError: unexpected invocation: Chat::Publisher.publish_new_channel(#, #) unsatisfied expectations: - expected exactly once, invoked never: Chat::Publisher.publish_new_channel(#, [#, #]) satisfied expectations: - allowed any number of times, invoked once: Chat::Action::CreateMembershipsForAutoJoin.call(has_entries({:channel => #, :contract => instance_of(Chat::AutoJoinChannelBatch::Contract)})) - allowed any number of times, invoked never: Chat::ChannelMembershipManager.new(#) - allowed any number of times, invoked never: #.recalculate_user_count(any_parameters) # ./plugins/chat/app/services/chat/auto_join_channel_batch.rb:65:in `publish_new_channel' # ./plugins/chat/app/services/service/base.rb:118:in `instance_exec' # ./plugins/chat/app/services/service/base.rb:118:in `call' # ./plugins/chat/app/services/service/base.rb:368:in `block in run!' # ./plugins/chat/app/services/service/base.rb:368:in `each' # ./plugins/chat/app/services/service/base.rb:368:in `run!' # ./plugins/chat/app/services/service/base.rb:361:in `run' # ./plugins/chat/app/services/service/base.rb:229:in `call' # ./plugins/chat/spec/services/chat/auto_join_channel_batch_spec.rb:50:in `block (3 levels) in
' # ./plugins/chat/spec/services/chat/auto_join_channel_batch_spec.rb:110:in `block (6 levels) in
' # ./spec/rails_helper.rb:412:in `block (2 levels) in ' ``` The spec is now simplified and shouldn't have this issue anymore. --- .../chat/auto_join_channel_batch_spec.rb | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/plugins/chat/spec/services/chat/auto_join_channel_batch_spec.rb b/plugins/chat/spec/services/chat/auto_join_channel_batch_spec.rb index 69a42cdef46..fdc77b0e8c6 100644 --- a/plugins/chat/spec/services/chat/auto_join_channel_batch_spec.rb +++ b/plugins/chat/spec/services/chat/auto_join_channel_batch_spec.rb @@ -52,8 +52,9 @@ describe Chat::AutoJoinChannelBatch do fab!(:channel) { Fabricate(:chat_channel, auto_join_users: true) } let(:channel_id) { channel.id } - let(:start_user_id) { 0 } - let(:end_user_id) { 10 } + let(:user_ids) { [Fabricate(:user).id] } + let(:start_user_id) { user_ids.first } + let(:end_user_id) { user_ids.last } let(:params) do { channel_id: channel_id, start_user_id: start_user_id, end_user_id: end_user_id } end @@ -84,44 +85,35 @@ describe Chat::AutoJoinChannelBatch do end context "when channel is found" do - fab!(:users) { Fabricate.times(2, :user) } - - let(:manager) { mock.responds_like_instance_of(Chat::ChannelMembershipManager) } - - before do - Chat::Action::CreateMembershipsForAutoJoin - .stubs(:call) - .with(has_entries(channel: channel, contract: instance_of(described_class::Contract))) - .returns(user_ids) - Chat::ChannelMembershipManager.stubs(:new).with(channel).returns(manager) - manager.stubs(:recalculate_user_count) - end - context "when more than one membership is created" do - let(:user_ids) { users.map(&:id) } + let(:user_ids) { Fabricate.times(2, :user).map(&:id) } it "does not recalculate user count" do - manager.expects(:recalculate_user_count).never + ::Chat::ChannelMembershipManager.any_instance.expects(:recalculate_user_count).never result end - it "publishes an event" do - Chat::Publisher.expects(:publish_new_channel).with(channel, users) - result + it "publishes an event for each user" do + messages = + MessageBus.track_publish(::Chat::Publisher::NEW_CHANNEL_MESSAGE_BUS_CHANNEL) do + result + end + expect(messages.length).to eq(2) end end context "when only one membership is created" do - let(:user_ids) { [users.first.id] } - it "recalculates user count" do - manager.expects(:recalculate_user_count) + ::Chat::ChannelMembershipManager.any_instance.expects(:recalculate_user_count).once result end it "publishes an event" do - Chat::Publisher.expects(:publish_new_channel).with(channel, [users.first]) - result + messages = + MessageBus.track_publish(::Chat::Publisher::NEW_CHANNEL_MESSAGE_BUS_CHANNEL) do + result + end + expect(messages.length).to eq(1) end end end