# frozen_string_literal: true require "rails_helper" require_relative "../support/assign_allowed_group" require_relative "../fabricators/assign_hook_fabricator.rb" describe "integration tests" do before { SiteSetting.assign_enabled = true } it "preloads data in topic list" do admin = Fabricate(:admin) post = create_post list = TopicList.new("latest", admin, [post.topic]) TopicList.preload([post.topic], list) # should not explode for now end describe "for a private message" do let(:post) { Fabricate(:private_message_post) } let(:pm) { post.topic } let(:user) { pm.allowed_users.first } let(:user2) { pm.allowed_users.last } let(:channel) { "/private-messages/assigned" } fab!(:group) { Fabricate(:group, assignable_level: Group::ALIAS_LEVELS[:everyone]) } include_context "with group that is allowed to assign" before do add_to_assign_allowed_group(user) add_to_assign_allowed_group(user2) group.add(user) group.add(user2) end def assert_publish_topic_state(topic, user: nil, group: nil) messages = MessageBus.track_publish { yield } message = messages.find { |m| m.channel == channel } expect(message.data[:topic_id]).to eq(topic.id) expect(message.user_ids).to eq([user.id]) if user expect(message.group_ids).to eq([group.id]) if group end it "publishes the right message on archive and move to inbox" do assigner = Assigner.new(pm, user) assigner.assign(user) assert_publish_topic_state(pm, user: user) do UserArchivedMessage.archive!(user.id, pm.reload) end assert_publish_topic_state(pm, user: user) do UserArchivedMessage.move_to_inbox!(user.id, pm.reload) end end it "publishes the right message on archive and move to inbox for groups" do assigner = Assigner.new(pm, user) assigner.assign(group) assert_publish_topic_state(pm, group: group) do GroupArchivedMessage.archive!(group.id, pm.reload) end assert_publish_topic_state(pm, group: group) do GroupArchivedMessage.move_to_inbox!(group.id, pm.reload) end end it "unassign and assign user if unassign_on_group_archive" do SiteSetting.unassign_on_group_archive = true assigner = Assigner.new(pm, user) assigner.assign(user) GroupArchivedMessage.archive!(group.id, pm.reload) expect(pm.assignment.active).to be false GroupArchivedMessage.move_to_inbox!(group.id, pm.reload) expect(pm.assignment.active).to be true expect(pm.assignment.assigned_to).to eq(user) end it "unassign and assign group if unassign_on_group_archive" do SiteSetting.unassign_on_group_archive = true assigner = Assigner.new(pm, user) assigner.assign(group) GroupArchivedMessage.archive!(group.id, pm.reload) expect(pm.assignment.active).to be false GroupArchivedMessage.move_to_inbox!(group.id, pm.reload) expect(pm.assignment.active).to be true expect(pm.assignment.assigned_to).to eq(group) end end describe "on assign_topic event" do let(:post) { Fabricate(:post) } let(:topic) { post.topic } let(:admin) { Fabricate(:admin) } let(:user1) { Fabricate(:user) } let(:user2) { Fabricate(:user) } include_context "with group that is allowed to assign" before do add_to_assign_allowed_group(user1) add_to_assign_allowed_group(user2) end it "assigns topic" do expect do DiscourseEvent.trigger(:assign_topic, topic, user1, admin) end.to change { Assignment.where(topic: topic).pick(:assigned_to_id) }.from(nil).to(user1.id) expect do DiscourseEvent.trigger(:assign_topic, topic, user2, admin) end.to_not change { Assignment.where(topic: topic).pick(:assigned_to_id) }.from(user1.id) expect do DiscourseEvent.trigger(:assign_topic, topic, user2, admin, true) end.to change { Assignment.where(topic: topic).pick(:assigned_to_id) }.from(user1.id).to(user2.id) end it "triggers a webhook for assigned and unassigned" do Fabricate(:assign_web_hook) DiscourseEvent.trigger(:assign_topic, topic, user2, admin, true) job_args = Jobs::EmitWebHookEvent.jobs[0]["args"].first expect(job_args["event_name"]).to eq("assigned") payload = JSON.parse(job_args["payload"]) expect(payload["topic_id"]).to eq(topic.id) expect(payload["assigned_to_id"]).to eq(user2.id) DiscourseEvent.trigger(:unassign_topic, topic, admin) job_args = Jobs::EmitWebHookEvent.jobs[1]["args"].first expect(job_args["event_name"]).to eq("unassigned") payload = JSON.parse(job_args["payload"]) expect(payload["topic_id"]).to eq(topic.id) expect(payload["unassigned_to_id"]).to eq(user2.id) end end context "when already assigned" do fab!(:post) { Fabricate(:post) } fab!(:post_2) { Fabricate(:post, topic: post.topic) } let(:topic) { post.topic } fab!(:user) { Fabricate(:user) } include_context "with group that is allowed to assign" it "does not allow to assign topic if post is already assigned" do add_to_assign_allowed_group(user) assigner = Assigner.new(post, user) response = assigner.assign(user) expect(response[:success]).to be true assigner = Assigner.new(post_2, user) response = assigner.assign(user) expect(response[:success]).to be true assigner = Assigner.new(topic, user) response = assigner.assign(user) expect(response[:success]).to be false expect(response[:reason]).to eq(:already_assigned) end end describe "move post" do fab!(:old_topic) { Fabricate(:topic) } fab!(:post) { Fabricate(:post, topic: old_topic) } fab!(:user) { Fabricate(:user) } fab!(:assignment) do Assignment.create!( target_id: post.id, target_type: "Post", topic_id: old_topic.id, assigned_by_user: user, assigned_to: user, ) end let(:new_topic) { Fabricate(:topic) } it "assignment becomes topic assignment when new topic" do post.update!(topic: new_topic) DiscourseEvent.trigger(:post_moved, post, old_topic.id) assignment.reload expect(assignment.topic_id).to eq(new_topic.id) expect(assignment.target_type).to eq("Topic") expect(assignment.target_id).to eq(new_topic.id) end it "assigment is still post assignment when not first post" do post.update!(topic: new_topic, post_number: "3") DiscourseEvent.trigger(:post_moved, post, old_topic.id) assignment.reload expect(assignment.topic_id).to eq(new_topic.id) expect(assignment.target_type).to eq("Post") expect(assignment.target_id).to eq(post.id) end end end