mirror of
https://github.com/discourse/discourse.git
synced 2025-01-02 07:28:33 +08:00
e926a07c83
Updates from 30 to 100 the maximum length of the name of an automation. Adds tests for validating the maximum length of the name of an automation.
199 lines
5.5 KiB
Ruby
199 lines
5.5 KiB
Ruby
# frozen_string_literal: true
|
||
|
||
describe DiscourseAutomation::Automation do
|
||
describe "#trigger!" do
|
||
context "when not enabled" do
|
||
fab!(:automation) { Fabricate(:automation, enabled: false) }
|
||
|
||
it "doesn’t do anything" do
|
||
list = capture_contexts { automation.trigger!("Howdy!") }
|
||
|
||
expect(list).to eq([])
|
||
end
|
||
end
|
||
|
||
context "when enabled" do
|
||
fab!(:automation) { Fabricate(:automation, enabled: true) }
|
||
|
||
it "runs the script" do
|
||
list = capture_contexts { automation.trigger!("Howdy!") }
|
||
|
||
expect(list).to eq(["Howdy!"])
|
||
end
|
||
end
|
||
end
|
||
|
||
describe "when a script is meant to be triggered in the background" do
|
||
fab!(:automation) do
|
||
Fabricate(:automation, enabled: true, script: "test-background-scriptable")
|
||
end
|
||
|
||
before do
|
||
DiscourseAutomation::Scriptable.add("test_background_scriptable") do
|
||
run_in_background
|
||
|
||
script do |context|
|
||
DiscourseAutomation::CapturedContext.add(context)
|
||
nil
|
||
end
|
||
end
|
||
end
|
||
|
||
it "runs a sidekiq job to trigger it" do
|
||
expect { automation.trigger!({ val: "Howdy!" }) }.to change {
|
||
Jobs::DiscourseAutomation::Trigger.jobs.size
|
||
}.by(1)
|
||
end
|
||
end
|
||
|
||
describe "#remove_id_from_custom_field" do
|
||
fab!(:automation)
|
||
|
||
it "expects a User/Topic/Post instance" do
|
||
expect {
|
||
automation.remove_id_from_custom_field(
|
||
Invite.new,
|
||
DiscourseAutomation::AUTOMATION_IDS_CUSTOM_FIELD,
|
||
)
|
||
}.to raise_error(RuntimeError)
|
||
end
|
||
end
|
||
|
||
describe "#add_id_to_custom_field" do
|
||
fab!(:automation)
|
||
|
||
it "expects a User/Topic/Post instance" do
|
||
expect {
|
||
automation.add_id_to_custom_field(
|
||
Invite.new,
|
||
DiscourseAutomation::AUTOMATION_IDS_CUSTOM_FIELD,
|
||
)
|
||
}.to raise_error(RuntimeError)
|
||
end
|
||
end
|
||
|
||
context "when automation’s script has a field with validor" do
|
||
before do
|
||
DiscourseAutomation::Scriptable.add("required_dogs") do
|
||
field :dog, component: :text, validator: ->(input) { "must have dog" if input != "dog" }
|
||
end
|
||
end
|
||
|
||
context "when validating automation" do
|
||
fab!(:automation) { Fabricate(:automation, enabled: false, script: "required_dogs") }
|
||
|
||
it "raises an error if invalid" do
|
||
expect {
|
||
automation.fields.create!(
|
||
name: "dog",
|
||
component: "text",
|
||
metadata: {
|
||
value: nil,
|
||
},
|
||
target: "script",
|
||
)
|
||
}.to raise_error(ActiveRecord::RecordInvalid, /must have dog/)
|
||
end
|
||
|
||
it "does nothing if valid" do
|
||
expect {
|
||
automation.fields.create!(
|
||
name: "dog",
|
||
component: "text",
|
||
metadata: {
|
||
value: "dog",
|
||
},
|
||
target: "script",
|
||
)
|
||
}.not_to raise_error
|
||
end
|
||
end
|
||
end
|
||
|
||
context "when automation’s script has a required field" do
|
||
before do
|
||
DiscourseAutomation::Scriptable.add("required_dogs") do
|
||
field :dog, component: :text, required: true
|
||
end
|
||
end
|
||
|
||
context "when field is not filled" do
|
||
fab!(:automation) { Fabricate(:automation, enabled: false, script: "required_dogs") }
|
||
|
||
context "when validating automation" do
|
||
it "raises an error" do
|
||
expect {
|
||
automation.fields.create!(
|
||
name: "dog",
|
||
component: "text",
|
||
metadata: {
|
||
value: nil,
|
||
},
|
||
target: "script",
|
||
)
|
||
}.to raise_error(ActiveRecord::RecordInvalid, /dog/)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
context "when automation’s trigger has a required field" do
|
||
before do
|
||
DiscourseAutomation::Triggerable.add("required_dogs") do
|
||
field :dog, component: :text, required: true
|
||
end
|
||
end
|
||
|
||
context "when field is not filled" do
|
||
fab!(:automation) { Fabricate(:automation, enabled: false, trigger: "required_dogs") }
|
||
|
||
context "when validating automation" do
|
||
it "raises an error" do
|
||
expect {
|
||
automation.fields.create!(
|
||
name: "dog",
|
||
component: "text",
|
||
metadata: {
|
||
value: nil,
|
||
},
|
||
target: "trigger",
|
||
)
|
||
}.to raise_error(ActiveRecord::RecordInvalid, /dog/)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
describe "after_destroy" do
|
||
fab!(:automation) { Fabricate(:automation, enabled: false) }
|
||
fab!(:automation2) { Fabricate(:automation, enabled: false) }
|
||
|
||
it "deletes user custom fields that indicate new users" do
|
||
user = Fabricate(:user)
|
||
user.custom_fields[automation.new_user_custom_field_name] = "1"
|
||
user.custom_fields[automation2.new_user_custom_field_name] = "1"
|
||
user.save_custom_fields
|
||
|
||
automation.destroy!
|
||
user.reload
|
||
|
||
expect(user.custom_fields).to eq({ automation2.new_user_custom_field_name => "1" })
|
||
end
|
||
end
|
||
|
||
context "when creating a new automation" do
|
||
it "validates the name length" do
|
||
automation = Fabricate.build(:automation, name: "a" * 101)
|
||
expect(automation).not_to be_valid
|
||
expect(automation.errors[:name]).to eq(["is too long (maximum is 100 characters)"])
|
||
|
||
automation = Fabricate.build(:automation, name: "b" * 4)
|
||
expect(automation).not_to be_valid
|
||
expect(automation.errors[:name]).to eq(["is too short (minimum is 5 characters)"])
|
||
|
||
automation = Fabricate.build(:automation, name: "c" * 50)
|
||
expect(automation).to be_valid
|
||
end
|
||
end
|
||
end
|