DEV: allows stop/resume streaming on a message (#25774)

```ruby
ChatSDK::Message.start_stream(message_id: 1, guardian: guardian)
ChatSDK::Message.stream(raw: "foo", message_id: 1, guardian: guardian)
ChatSDK::Message.stream(raw: "bar", message_id: 1, guardian: guardian)
ChatSDK::Message.stop_stream(message_id: 1, guardian: guardian)
```

Generally speaking only admins or owners of the message can interact with a message.  Also note, Streaming to an existing message with a different user won't change the initial user of the message.
This commit is contained in:
Joffrey JAFFEUX
2024-02-26 14:16:29 +01:00
committed by GitHub
parent 794ef67268
commit 41790f7739
8 changed files with 195 additions and 36 deletions

View File

@ -47,9 +47,9 @@ describe ChatSDK::Message do
context "when membership is enforced" do
it "works" do
SiteSetting.chat_allowed_groups = [Group::AUTO_GROUPS[:everyone]]
params[:enforce_membership] = true
params[:guardian] = Fabricate(:user).guardian
SiteSetting.chat_allowed_groups = [Group::AUTO_GROUPS[:everyone]]
message = described_class.create(**params)
@ -87,7 +87,7 @@ describe ChatSDK::Message do
edit =
MessageBus
.track_publish("/chat/#{channel_1.id}") { helper.stream(raw: "test") }
.track_publish("/chat/#{channel_1.id}") { helper.stream(raw: " test") }
.find { |m| m.data["type"] == "edit" }
expect(edit.data["chat_message"]["message"]).to eq("something test")
@ -97,4 +97,88 @@ describe ChatSDK::Message do
expect(created_message.message).to eq("something test")
end
end
describe ".stop_stream" do
fab!(:message_1) { Fabricate(:chat_message, message: "first") }
before do
SiteSetting.chat_allowed_groups = [Group::AUTO_GROUPS[:everyone]]
message_1.update!(streaming: true)
end
it "stop streaming message" do
described_class.stop_stream(message_id: message_1.id, guardian: message_1.user.guardian)
expect(message_1.reload.streaming).to eq(false)
end
context "when user can't stop streaming" do
it "fails" do
user = Fabricate(:user)
message_1.chat_channel.add(user)
expect {
described_class.stop_stream(message_id: message_1.id, guardian: user.guardian)
}.to raise_error("User with id: `#{user.id}` can't stop streaming this message")
end
end
context "when user can't join channel" do
fab!(:message_1) do
Fabricate(:chat_message, chat_channel: Fabricate(:private_category_channel))
end
it "fails" do
user = Fabricate(:user)
expect {
described_class.stop_stream(message_id: message_1.id, guardian: user.guardian)
}.to raise_error("User with id: `#{user.id}` can't join this channel")
end
end
end
describe ".start_stream" do
fab!(:message_1) { Fabricate(:chat_message, message: "first") }
it "enables streaming" do
initial_message = message_1.message
edit =
MessageBus
.track_publish("/chat/#{message_1.chat_channel.id}") do
described_class.start_stream(
message_id: message_1.id,
guardian: message_1.user.guardian,
)
end
.find { |m| m.data["type"] == "edit" }
expect(edit.data["chat_message"]["message"]).to eq("first")
expect(message_1.reload.streaming).to eq(true)
end
end
describe ".stream" do
fab!(:message_1) { Fabricate(:chat_message, message: "first") }
before { message_1.update!(streaming: true) }
it "streams" do
initial_message = message_1.message
edit =
MessageBus
.track_publish("/chat/#{message_1.chat_channel.id}") do
described_class.stream(
raw: " test",
message_id: message_1.id,
guardian: message_1.user.guardian,
)
end
.find { |m| m.data["type"] == "edit" }
expect(edit.data["chat_message"]["message"]).to eq("first test")
expect(message_1.reload.streaming).to eq(true)
end
end
end