discourse-assign/spec/lib/discourse_assign/create_notification_spec.rb

155 lines
4.7 KiB
Ruby

# frozen_string_literal: true
require "rails_helper"
RSpec.describe DiscourseAssign::CreateNotification do
describe ".call" do
subject(:create_notification) do
described_class.call(assignment: assignment, user: user, mark_as_read: mark_as_read)
end
let(:assignment) { Fabricate(:topic_assignment, topic: post.topic, assigned_to: assigned_to) }
let(:post) { Fabricate(:post) }
let(:mark_as_read) { false }
let(:alerter) { stub_everything("alerter").responds_like_instance_of(PostAlerter) }
before { PostAlerter.stubs(:new).returns(alerter) }
context "when assigned to a single user" do
let(:assigned_to) { Fabricate(:user) }
let(:user) { assigned_to }
it "publishes topic tracking state" do
Assigner.expects(:publish_topic_tracking_state).with(assignment.topic, user.id)
create_notification
end
context "when topic is not found" do
before { assignment.topic = nil }
it "does not publish topic tracking state" do
Assigner.expects(:publish_topic_tracking_state).never
create_notification
end
it "does not create a notification alert" do
alerter.expects(:create_notification_alert).never
create_notification
end
end
context "when `mark_as_read` is false" do
let(:excerpt) do
I18n.t(
"discourse_assign.topic_assigned_excerpt",
title: post.topic.title,
group: user.name,
locale: user.effective_locale,
)
end
it "creates a notification alert" do
alerter.expects(:create_notification_alert).with(
user: user,
post: post,
username: assignment.assigned_by_user.username,
notification_type: Notification.types[:assigned],
excerpt: excerpt,
)
create_notification
end
end
context "when `mark_as_read` is true" do
let(:mark_as_read) { true }
it "does not create a notification alert" do
alerter.expects(:create_notification_alert).never
create_notification
end
end
it "creates a notification" do
expect { create_notification }.to change { Notification.count }.by(1)
expect(Notification.assigned.last).to have_attributes(
created_at: assignment.created_at,
updated_at: assignment.updated_at,
user: user,
topic: post.topic,
post_number: post.post_number,
high_priority: true,
read: mark_as_read,
data_hash: {
message: "discourse_assign.assign_notification",
display_username: assignment.assigned_by_user.username,
topic_title: post.topic.title,
assignment_id: assignment.id,
},
)
end
end
context "when assigned to a group" do
let(:assigned_to) { Fabricate(:group) }
let(:user) { Fabricate(:user) }
before { assigned_to.users << user }
it "publishes topic tracking state" do
Assigner.expects(:publish_topic_tracking_state).with(assignment.topic, user.id)
create_notification
end
context "when `mark_as_read` is false" do
let(:excerpt) do
I18n.t(
"discourse_assign.topic_group_assigned_excerpt",
title: post.topic.title,
group: assigned_to.name,
locale: user.effective_locale,
)
end
it "creates a notification alert" do
alerter.expects(:create_notification_alert).with(
user: user,
post: post,
username: assignment.assigned_by_user.username,
notification_type: Notification.types[:assigned],
excerpt: excerpt,
)
create_notification
end
end
context "when `mark_as_read` is true" do
let(:mark_as_read) { true }
it "does not create a notification alert" do
alerter.expects(:create_notification_alert).never
create_notification
end
end
it "creates a notification" do
expect { create_notification }.to change { Notification.count }.by(1)
expect(Notification.assigned.last).to have_attributes(
created_at: assignment.created_at,
updated_at: assignment.updated_at,
user: user,
topic: post.topic,
post_number: post.post_number,
high_priority: true,
read: mark_as_read,
data_hash: {
message: "discourse_assign.assign_group_notification",
display_username: assigned_to.name,
topic_title: post.topic.title,
assignment_id: assignment.id,
},
)
end
end
end
end