0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-23 01:40:29 +01:00
discourse-custom-wizard/spec/components/custom_wizard/action_spec.rb

319 Zeilen
11 KiB
Ruby

# frozen_string_literal: true
require_relative '../../plugin_helper'
2020-10-20 01:15:03 +02:00
2020-04-11 08:22:12 +02:00
describe CustomWizard::Action do
2020-10-20 01:15:03 +02:00
fab!(:user) { Fabricate(:user, name: "Angus", username: 'angus', email: "angus@email.com", trust_level: TrustLevel[2]) }
fab!(:category) { Fabricate(:category, name: 'cat1', slug: 'cat-slug') }
fab!(:group) { Fabricate(:group) }
2021-03-11 07:30:15 +01:00
2021-09-07 14:06:13 +02:00
let(:wizard_template) { get_wizard_fixture("wizard") }
let(:open_composer) { get_wizard_fixture("actions/open_composer") }
let(:create_category) { get_wizard_fixture("actions/create_category") }
let(:create_group) { get_wizard_fixture("actions/create_group") }
let(:add_to_group) { get_wizard_fixture("actions/add_to_group") }
let(:send_message) { get_wizard_fixture("actions/send_message") }
let(:send_message_multi) { get_wizard_fixture("actions/send_message_multi") }
2021-10-05 11:07:20 +02:00
let(:api_test_endpoint) { get_wizard_fixture("endpoints/test_endpoint") }
2021-10-22 20:04:37 +02:00
let(:api_test_endpoint_body) { get_wizard_fixture("endpoints/test_endpoint_body") }
let(:api_test_no_authorization) { get_wizard_fixture("api/no_authorization") }
2021-09-07 14:06:13 +02:00
def update_template(template)
CustomWizard::Template.save(template, skip_jobs: true)
@template = CustomWizard::Template.find('super_mega_fun_wizard')
end
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
before do
Group.refresh_automatic_group!(:trust_level_2)
2021-09-07 14:06:13 +02:00
update_template(wizard_template)
2020-10-20 01:15:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
context 'creating a topic' do
it "works" do
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(
wizard.steps.first.id,
step_1_field_1: "Topic Title",
step_1_field_2: "topic body"
).update
wizard.create_updater(wizard.steps.second.id, {}).update
wizard.create_updater(wizard.steps.last.id,
step_3_field_3: category.id
).update
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
topic = Topic.where(
title: "Topic Title",
category_id: category.id
)
expect(topic.exists?).to eq(true)
expect(Post.where(
topic_id: topic.pluck(:id),
raw: "topic body"
).exists?).to eq(true)
end
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
it "fails silently without basic topic inputs" do
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(
wizard.steps.first.id,
step_1_field_2: "topic body"
).update
wizard.create_updater(wizard.steps.second.id, {}).update
updater = wizard.create_updater(wizard.steps.last.id, {})
updater.update
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
expect(updater.success?).to eq(true)
expect(UserHistory.where(
acting_user_id: user.id,
context: "super_mega_fun_wizard",
subject: "step_3"
).exists?).to eq(true)
expect(Post.where(
raw: "topic body"
).exists?).to eq(false)
end
it "adds custom fields" do
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(wizard.steps.first.id,
step_1_field_1: "Topic Title",
step_1_field_2: "topic body"
).update
wizard.create_updater(wizard.steps.second.id, {}).update
wizard.create_updater(wizard.steps.last.id,
step_3_field_3: category.id
).update
topic = Topic.where(
title: "Topic Title",
category_id: category.id
).first
topic_custom_field = TopicCustomField.where(
name: "topic_field",
value: "Topic custom field value",
topic_id: topic.id
)
topic_json_custom_field = TopicCustomField.where("
name = 'topic_json_field' AND
(value::json->>'key_1') = 'Key 1 value' AND
(value::json->>'key_2') = 'Key 2 value' AND
topic_id = #{topic.id}"
)
post_custom_field = PostCustomField.where(
name: "post_field",
value: "Post custom field value",
post_id: topic.first_post.id
)
expect(topic_custom_field.exists?).to eq(true)
expect(topic_json_custom_field.exists?).to eq(true)
expect(post_custom_field.exists?).to eq(true)
end
2020-04-11 08:22:12 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-11 08:22:12 +02:00
it 'updates a profile' do
2020-10-31 08:05:50 +01:00
wizard = CustomWizard::Builder.new(@template[:id], user).build
2020-10-20 01:15:03 +02:00
upload = Upload.create!(
url: '/images/image.png',
original_filename: 'image.png',
filesize: 100,
user_id: -1,
)
2020-10-31 08:05:50 +01:00
steps = wizard.steps
wizard.create_updater(steps[0].id, {}).update
wizard.create_updater(steps[1].id,
step_2_field_7: upload.as_json
2020-10-20 01:15:03 +02:00
).update
expect(user.profile_background_upload.id).to eq(upload.id)
2020-04-11 08:22:12 +02:00
end
2021-03-11 07:30:15 +01:00
context "open composer" do
it 'works' do
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
2021-03-11 07:30:15 +01:00
updater = wizard.create_updater(wizard.steps[1].id, {})
updater.update
2021-03-11 07:30:15 +01:00
expect(updater.result[:redirect_on_next]).to eq(
2021-09-07 14:06:13 +02:00
"/new-topic?title=Title%20of%20the%20composer%20topic&body=I%20am%20interpolating%20some%20user%20fields%20Angus%20angus%20angus%40email.com&tags=tag1"
)
end
2021-03-11 07:30:15 +01:00
it 'encodes special characters in the title and body' do
open_composer['title'][0]['output'] = "Title that's special $".dup
open_composer['post_template'] = "Body & more body & more body".dup
2021-03-11 07:30:15 +01:00
wizard = CustomWizard::Wizard.new(@template, user)
action = CustomWizard::Action.new(
wizard: wizard,
action: open_composer,
submission: wizard.current_submission
)
action.perform
2021-03-11 07:30:15 +01:00
expect(action.result.success?).to eq(true)
2021-03-11 07:30:15 +01:00
decoded_output = CGI.parse(URI.parse(action.result.output).query)
2021-03-11 07:30:15 +01:00
expect(decoded_output['title'][0]).to eq("Title that's special $")
expect(decoded_output['body'][0]).to eq("Body & more body & more body")
end
2020-04-11 08:22:12 +02:00
end
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
it 'watches categories' do
2020-10-31 08:05:50 +01:00
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
wizard.create_updater(wizard.steps[1].id, {}).update
2021-09-07 14:06:13 +02:00
2020-10-20 01:15:03 +02:00
expect(CategoryUser.where(
category_id: category.id,
user_id: user.id
).first.notification_level).to eq(0)
end
2021-03-11 07:30:15 +01:00
2020-04-11 08:22:12 +02:00
it 're-routes a user' do
2020-10-31 08:05:50 +01:00
wizard = CustomWizard::Builder.new(@template[:id], user).build
updater = wizard.create_updater(wizard.steps.last.id, {})
2020-10-20 01:15:03 +02:00
updater.update
expect(updater.result[:redirect_on_next]).to eq("https://google.com")
2020-04-11 08:22:12 +02:00
end
2021-09-07 14:06:13 +02:00
2021-09-24 11:58:42 +02:00
context "subscription actions" do
2021-09-07 14:06:13 +02:00
before do
2021-09-14 05:33:16 +02:00
enable_subscription
2021-09-07 14:06:13 +02:00
end
2021-09-07 14:11:50 +02:00
2021-09-07 14:06:13 +02:00
it '#send_message' do
wizard_template['actions'] << send_message
update_template(wizard_template)
User.create(username: 'angus1', email: "angus1@email.com")
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(wizard.steps[0].id, {}).update
wizard.create_updater(wizard.steps[1].id, {}).update
topic = Topic.where(
archetype: Archetype.private_message,
title: "Message title"
)
post = Post.where(
topic_id: topic.pluck(:id),
raw: "I will interpolate some wizard fields"
)
expect(topic.exists?).to eq(true)
expect(topic.first.topic_allowed_users.first.user.username).to eq('angus1')
expect(post.exists?).to eq(true)
end
it '#send_message allows using multiple targets' do
wizard_template['actions'] << send_message_multi
update_template(wizard_template)
User.create(username: 'angus1', email: "angus1@email.com")
User.create(username: 'faiz', email: "faiz@email.com")
Group.create(name: "cool_group")
Group.create(name: 'cool_group_1')
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(wizard.steps[0].id, {}).update
wizard.create_updater(wizard.steps[1].id, {}).update
topic = Topic.where(
archetype: Archetype.private_message,
title: "Multiple Recipients title"
)
post = Post.where(
topic_id: topic.pluck(:id),
raw: "I will interpolate some wizard fields"
)
expect(topic.exists?).to eq(true)
expect(topic.first.all_allowed_users.map(&:username)).to include('angus1', 'faiz')
expect(topic.first.allowed_groups.map(&:name)).to include('cool_group', 'cool_group_1')
expect(post.exists?).to eq(true)
end
it '#create_category' do
wizard_template['actions'] << create_category
update_template(wizard_template)
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
wizard.create_updater(wizard.steps[1].id, {}).update
expect(Category.where(id: wizard.current_submission.fields['action_8']).exists?).to eq(true)
end
it '#create_group' do
wizard_template['actions'] << create_group
update_template(wizard_template)
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
expect(Group.where(name: wizard.current_submission.fields['action_9']).exists?).to eq(true)
end
it '#add_to_group' do
wizard_template['actions'] << create_group
wizard_template['actions'] << add_to_group
update_template(wizard_template)
wizard = CustomWizard::Builder.new(@template[:id], user).build
step_id = wizard.steps[0].id
updater = wizard.create_updater(step_id, step_1_field_1: "Text input").update
group = Group.find_by(name: wizard.current_submission.fields['action_9'])
expect(group.users.first.username).to eq('angus')
end
2021-10-05 11:07:20 +02:00
2021-10-12 15:49:09 +02:00
it '#send_to_api successful' do
2021-10-05 11:07:20 +02:00
stub_request(:put, "https://myexternalapi.com/update").
2021-10-22 20:04:37 +02:00
with(
2021-10-05 11:07:20 +02:00
body: "some_body",
headers: {
2021-10-22 20:04:37 +02:00
'Host' => 'myexternalapi.com'
2021-10-05 11:07:20 +02:00
}).
2021-10-22 20:04:37 +02:00
to_return(status: 200, body: "success", headers: {})
2021-10-05 11:07:20 +02:00
new_api = CustomWizard::Api.new("my_api")
CustomWizard::Api.set("my_api", title: "Mocked external api")
CustomWizard::Api::Authorization.set("my_api", api_test_no_authorization)
CustomWizard::Api::Endpoint.new("my_api")
CustomWizard::Api::Endpoint.set("my_api", api_test_endpoint)
endpoint_id = CustomWizard::Api::Endpoint.list("my_api").first.id
result = CustomWizard::Api::Endpoint.request("my_api", endpoint_id, "some_body")
log_entry = CustomWizard::Api::LogEntry.list("my_api").first
2021-10-05 11:19:47 +02:00
2021-10-05 11:07:20 +02:00
expect(result).to eq('success')
expect(log_entry.status).to eq('SUCCESS')
end
2021-10-12 15:49:09 +02:00
it '#send_to_api failure' do
stub_request(:put, "https://myexternalapi.com/update").
2021-10-22 20:04:37 +02:00
with(
2021-10-12 15:49:09 +02:00
body: "some_body",
headers: {
2021-10-22 20:04:37 +02:00
'Host' => 'myexternalapi.com'
2021-10-12 15:49:09 +02:00
}).
2021-10-22 20:04:37 +02:00
to_return(status: 500, body: "failure", headers: {})
2021-10-12 15:49:09 +02:00
new_api = CustomWizard::Api.new("my_api")
CustomWizard::Api.set("my_api", title: "Mocked external api")
CustomWizard::Api::Authorization.set("my_api", api_test_no_authorization)
CustomWizard::Api::Endpoint.new("my_api")
CustomWizard::Api::Endpoint.set("my_api", api_test_endpoint)
endpoint_id = CustomWizard::Api::Endpoint.list("my_api").first.id
result = CustomWizard::Api::Endpoint.request("my_api", endpoint_id, "some_body")
log_entry = CustomWizard::Api::LogEntry.list("my_api").first
2021-10-22 20:04:37 +02:00
expect(result).to eq({ error: "API request failed" })
2021-10-27 15:02:21 +02:00
expect(log_entry.status).to eq('FAIL')
2021-10-12 15:49:09 +02:00
end
2021-09-07 14:06:13 +02:00
end
2020-04-11 08:22:12 +02:00
end