discourse/plugins/automation/spec/triggers/user_updated_spec.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

260 lines
9.1 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
describe "UserUpdated" do
before { SiteSetting.discourse_automation_enabled = true }
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.save
user
end
fab!(:automation) do
automation = Fabricate(:automation, 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: %w[location bio_raw] },
target: "trigger",
)
automation
end
context "when custom_fields and user_profile are blank" do
let(:automation) do
Fabricate(
:automation,
trigger: DiscourseAutomation::Triggers::USER_UPDATED,
).tap do |automation|
automation.upsert_field!("custom_fields", "custom_fields", { value: [] }, target: "trigger")
automation.upsert_field!("user_profile", "user_profile", { value: [] }, target: "trigger")
end
end
it "adds an error to the automation" do
expect(automation.save).to eq(false)
errors = automation.errors.full_messages
expect(errors).to include(
I18n.t("discourse_automation.triggerables.errors.custom_fields_or_user_profile_required"),
)
end
end
it "has the correct data" do
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
output = output.first
expect(output["kind"]).to eq(DiscourseAutomation::Triggers::USER_UPDATED)
expect(output["user"]).to eq(user)
expect(output["user_data"].count).to eq(2)
expect(output["user_data"][:custom_fields][user_field_1.name]).to eq(
user.custom_fields["user_field_#{user_field_1.id}"],
)
expect(output["user_data"][:profile_data]["location"]).to eq("Japan")
end
context "when once_per_user is set" do
before do
automation.upsert_field!("once_per_user", "boolean", { value: true }, target: "trigger")
end
it "doesnt trigger if automation already triggered" do
UserUpdater.new(user, user).update(location: "Korea", bio_raw: "good")
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output).to eq([])
end
it "triggers once when automation has never triggered" do
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output.first["kind"]).to eq("user_updated")
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output).to eq([])
end
end
context "when once_per_user is not set" do
it "triggers every time" do
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output.first["kind"]).to eq("user_updated")
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output.first["kind"]).to eq("user_updated")
end
end
context "when not all fields are set" do
it "doesnt trigger" do
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output.first["kind"]).to eq("user_updated")
end
end
context "when all fields are set" do
it "triggers" do
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output.first["kind"]).to eq("user_updated")
end
end
context "when new_users_only is set" do
before do
automation.upsert_field!("new_users_only", "boolean", { value: true }, target: "trigger")
end
it "triggers for new users" do
user = nil
output =
capture_contexts do
user = Fabricate(:user)
user.set_user_field(user_field_1.id, "Answer new custom 1")
user.set_user_field(user_field_2.id, "Answer new custom 2")
UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine")
end
expect(output.size).to eq(1)
expect(output.first["kind"]).to eq("user_updated")
expect(output.first["user"].id).to eq(user.id)
expect(output.first["user_data"][:custom_fields]).to eq(
{ "custom field 1" => "Answer new custom 1", "custom field 2" => "Answer new custom 2" },
)
expect(output.first["user_data"][:profile_data]["location"]).to eq("Japan")
expect(output.first["user_data"][:profile_data]["bio_raw"]).to eq("fine")
output =
capture_contexts do
UserUpdater.new(user, user).update(location: "Japan22", bio_raw: "finegood")
end
expect(output.size).to eq(1)
expect(output.first["kind"]).to eq("user_updated")
expect(output.first["user"].id).to eq(user.id)
expect(output.first["user_data"][:profile_data]["location"]).to eq("Japan22")
expect(output.first["user_data"][:profile_data]["bio_raw"]).to eq("finegood")
end
it "doesn't trigger for existing users" do
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output).to eq([])
end
context "when once_per_user is set" do
before do
automation.upsert_field!("once_per_user", "boolean", { value: true }, target: "trigger")
end
it "triggers only once for a new user" do
user = nil
output =
capture_contexts do
user = Fabricate(:user)
user.set_user_field(user_field_1.id, "Answer new custom 1")
user.set_user_field(user_field_2.id, "Answer new custom 2")
UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine")
end
expect(output.size).to eq(1)
expect(output.first["kind"]).to eq("user_updated")
expect(output.first["user"].id).to eq(user.id)
expect(output.first["user_data"][:custom_fields]).to eq(
{ "custom field 1" => "Answer new custom 1", "custom field 2" => "Answer new custom 2" },
)
expect(output.first["user_data"][:profile_data]["location"]).to eq("Japan")
expect(output.first["user_data"][:profile_data]["bio_raw"]).to eq("fine")
output =
capture_contexts do
UserUpdater.new(user, user).update(location: "Japan22", bio_raw: "finegood")
end
expect(output).to eq([])
end
it "doesn't trigger for an existing user" do
output =
capture_contexts do
UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine")
end
expect(output).to eq([])
end
end
end
context "when new_users_only is not set" do
before do
automation.upsert_field!("new_users_only", "boolean", { value: false }, target: "trigger")
end
it "triggers for new users" do
user = nil
output =
capture_contexts do
user = Fabricate(:user)
user.set_user_field(user_field_1.id, "Answer new custom 1")
user.set_user_field(user_field_2.id, "Answer new custom 2")
UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine")
end
expect(output.size).to eq(1)
expect(output.first["kind"]).to eq("user_updated")
expect(output.first["user"].id).to eq(user.id)
expect(output.first["user_data"][:custom_fields]).to eq(
{ "custom field 1" => "Answer new custom 1", "custom field 2" => "Answer new custom 2" },
)
expect(output.first["user_data"][:profile_data]["location"]).to eq("Japan")
expect(output.first["user_data"][:profile_data]["bio_raw"]).to eq("fine")
end
it "triggers for existing users" do
output =
capture_contexts { UserUpdater.new(user, user).update(location: "Japan", bio_raw: "fine") }
expect(output.size).to eq(1)
expect(output.first["kind"]).to eq("user_updated")
expect(output.first["user"].id).to eq(user.id)
expect(output.first["user_data"][:custom_fields]).to eq(
{ "custom field 1" => "Answer custom 1", "custom field 2" => "Answer custom 2" },
)
expect(output.first["user_data"][:profile_data]["location"]).to eq("Japan")
expect(output.first["user_data"][:profile_data]["bio_raw"]).to eq("fine")
output =
capture_contexts do
UserUpdater.new(user, user).update(location: "Japan22", bio_raw: "finegood")
end
expect(output.size).to eq(1)
expect(output.first["kind"]).to eq("user_updated")
expect(output.first["user"].id).to eq(user.id)
expect(output.first["user_data"][:profile_data]["location"]).to eq("Japan22")
expect(output.first["user_data"][:profile_data]["bio_raw"]).to eq("finegood")
end
end
end