mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 17:26:29 +08:00
FEATURE: Add 'Create topic' automation script (#26552)
This commit adds a new automation script for creating topics. It's very similar to the existing 'create a post' automation, except that it posts new topics in a specific category and with optional tags. Internal topic: t/125829.
This commit is contained in:
171
plugins/automation/spec/scripts/topic_spec.rb
Normal file
171
plugins/automation/spec/scripts/topic_spec.rb
Normal file
@ -0,0 +1,171 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative "../discourse_automation_helper"
|
||||
|
||||
describe "Topic" do
|
||||
let!(:raw) { "this is me testing a new topic by automation" }
|
||||
let!(:title) { "This is a new topic created by automation" }
|
||||
fab!(:category) { Fabricate(:category) }
|
||||
fab!(:tag1) { Fabricate(:tag) }
|
||||
fab!(:tag2) { Fabricate(:tag) }
|
||||
|
||||
before { SiteSetting.discourse_automation_enabled = true }
|
||||
|
||||
context "when using point_in_time trigger" do
|
||||
fab!(:automation) do
|
||||
Fabricate(
|
||||
:automation,
|
||||
script: DiscourseAutomation::Scripts::TOPIC,
|
||||
trigger: DiscourseAutomation::Triggers::POINT_IN_TIME,
|
||||
)
|
||||
end
|
||||
|
||||
before do
|
||||
automation.upsert_field!(
|
||||
"execute_at",
|
||||
"date_time",
|
||||
{ value: 3.hours.from_now },
|
||||
target: "trigger",
|
||||
)
|
||||
automation.upsert_field!("title", "text", { value: title }, target: "script")
|
||||
automation.upsert_field!("body", "post", { value: raw }, target: "script")
|
||||
automation.upsert_field!(
|
||||
"category",
|
||||
"category",
|
||||
{ value: category.id.to_s },
|
||||
target: "script",
|
||||
)
|
||||
end
|
||||
|
||||
it "creates expected topic" do
|
||||
freeze_time 6.hours.from_now do
|
||||
expect {
|
||||
Jobs::DiscourseAutomationTracker.new.execute
|
||||
|
||||
topic = Topic.last
|
||||
expect(topic.category.id).to eq(category.id)
|
||||
expect(topic.title).to eq(title)
|
||||
expect(topic.posts.first.raw).to eq(raw)
|
||||
}.to change { Topic.count }.by(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "when using recurring trigger" do
|
||||
fab!(:automation) do
|
||||
Fabricate(
|
||||
:automation,
|
||||
script: DiscourseAutomation::Scripts::TOPIC,
|
||||
trigger: DiscourseAutomation::Triggers::RECURRING,
|
||||
)
|
||||
end
|
||||
|
||||
before do
|
||||
automation.upsert_field!("title", "text", { value: title }, target: "script")
|
||||
automation.upsert_field!("body", "post", { value: raw }, target: "script")
|
||||
automation.upsert_field!(
|
||||
"category",
|
||||
"category",
|
||||
{ value: category.id.to_s },
|
||||
target: "script",
|
||||
)
|
||||
end
|
||||
|
||||
it "creates expected topic" do
|
||||
expect {
|
||||
automation.trigger!
|
||||
|
||||
topic = Topic.last
|
||||
expect(topic.category.id).to eq(category.id)
|
||||
expect(topic.title).to eq(title)
|
||||
expect(topic.posts.first.raw).to eq(raw)
|
||||
}.to change { Topic.count }.by(1)
|
||||
end
|
||||
end
|
||||
|
||||
context "when using user_updated trigger" do
|
||||
fab!(:user_field_1) { Fabricate(:user_field, name: "custom field 1") }
|
||||
fab!(:user_field_2) { Fabricate(:user_field, name: "custom field 2") }
|
||||
|
||||
fab!(:user) do
|
||||
user = Fabricate(:user, trust_level: TrustLevel[0])
|
||||
user.set_user_field(user_field_1.id, "Answer custom 1")
|
||||
user.set_user_field(user_field_2.id, "Answer custom 2")
|
||||
user.user_profile.location = "Japan"
|
||||
user.user_profile.save
|
||||
user.save
|
||||
user
|
||||
end
|
||||
|
||||
fab!(:automation) do
|
||||
automation =
|
||||
Fabricate(
|
||||
:automation,
|
||||
script: DiscourseAutomation::Scripts::TOPIC,
|
||||
trigger: DiscourseAutomation::Triggers::USER_UPDATED,
|
||||
)
|
||||
automation.upsert_field!(
|
||||
"custom_fields",
|
||||
"custom_fields",
|
||||
{ value: ["custom field 1", "custom field 2"] },
|
||||
target: "trigger",
|
||||
)
|
||||
automation.upsert_field!(
|
||||
"user_profile",
|
||||
"user_profile",
|
||||
{ value: ["location"] },
|
||||
target: "trigger",
|
||||
)
|
||||
automation
|
||||
end
|
||||
let!(:user_raw_post) do
|
||||
"This is a raw test post for user custom field 1: {{custom_field_1}}, custom field 2: {{custom_field_2}} and location: {{location}}"
|
||||
end
|
||||
let!(:placeholder_applied_user_raw_post) do
|
||||
"This is a raw test post for user custom field 1: #{user.custom_fields["user_field_#{user_field_1.id}"]}, custom field 2: #{user.custom_fields["user_field_#{user_field_2.id}"]} and location: #{user.user_profile.location}"
|
||||
end
|
||||
|
||||
before do
|
||||
automation.upsert_field!(
|
||||
"title",
|
||||
"text",
|
||||
{ value: "{{custom_field_1}} {{location}} this is a title" },
|
||||
target: "script",
|
||||
)
|
||||
automation.upsert_field!("body", "post", { value: user_raw_post }, target: "script")
|
||||
automation.upsert_field!(
|
||||
"category",
|
||||
"category",
|
||||
{ value: category.id.to_s },
|
||||
target: "script",
|
||||
)
|
||||
automation.upsert_field!("tags", "tags", { value: %w[feedback automation] }, target: "script")
|
||||
end
|
||||
|
||||
it "creates a topic correctly" do
|
||||
expect {
|
||||
UserUpdater.new(user, user).update(location: "Japan")
|
||||
|
||||
topic = Topic.last
|
||||
expect(topic.category.id).to eq(category.id)
|
||||
expect(topic.title).to eq(
|
||||
"#{user.custom_fields["user_field_#{user_field_1.id}"]} #{user.user_profile.location} this is a title",
|
||||
)
|
||||
expect(topic.posts.first.raw).to eq(placeholder_applied_user_raw_post)
|
||||
expect(topic.tags.pluck(:name)).to contain_exactly("feedback", "automation")
|
||||
}.to change { Topic.count }.by(1)
|
||||
end
|
||||
|
||||
context "when creator is one of accepted context" do
|
||||
before do
|
||||
automation.upsert_field!("creator", "user", { value: "updated_user" }, target: "script")
|
||||
end
|
||||
|
||||
it "sets the creator to the topic creator" do
|
||||
expect { UserUpdater.new(user, user).update(location: "Japan") }.to change {
|
||||
Topic.where(user_id: user.id).count
|
||||
}.by(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user