discourse/plugins/automation/spec/models/automation_spec.rb
Osama Sayegh 3d4faf3272
FEATURE: Merge discourse-automation (#26432)
Automation (previously known as discourse-automation) is now a core plugin.
2024-04-03 18:20:43 +03:00

169 lines
4.5 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# frozen_string_literal: true
require_relative "../discourse_automation_helper"
describe DiscourseAutomation::Automation do
describe "#trigger!" do
context "when not enabled" do
fab!(:automation) { Fabricate(:automation, enabled: false) }
it "doesnt 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::DiscourseAutomationTrigger.jobs.size
}.by(1)
end
it "also runs the script properly" do
Jobs.run_immediately!
post = Fabricate(:post)
user = post.user
list = capture_contexts { automation.trigger!({ post: post, user: user, test: :test }) }
expect(list[0]["post"].id).to eq(post.id)
expect(list[0]["user"].id).to eq(user.id)
expect(list[0]["test"]).to eq(:test)
end
end
describe "#detach_custom_field" do
fab!(:automation)
it "expects a User/Topic/Post instance" do
expect { automation.detach_custom_field(Invite.new) }.to raise_error(RuntimeError)
end
end
describe "#attach_custom_field" do
fab!(:automation)
it "expects a User/Topic/Post instance" do
expect { automation.attach_custom_field(Invite.new) }.to raise_error(RuntimeError)
end
end
context "when automations 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 automations 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 automations 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
end