0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-09-19 23:31:11 +02:00
discourse-custom-wizard/spec/components/custom_wizard/builder_spec.rb

197 Zeilen
6,8 KiB
Ruby

2019-12-04 12:13:51 +01:00
# frozen_string_literal: true
require 'rails_helper'
describe CustomWizard::Builder do
2020-10-20 01:15:03 +02:00
fab!(:user) { Fabricate(:user, username: 'angus', email: "angus@email.com", trust_level: TrustLevel[2]) }
fab!(:new_user) { Fabricate(:user, trust_level: 0) }
2019-12-12 00:20:10 +01:00
fab!(:category1) { Fabricate(:category, name: 'cat1') }
fab!(:category2) { Fabricate(:category, name: 'cat2') }
2019-12-09 06:51:42 +01:00
fab!(:group) { Fabricate(:group) }
2019-12-04 12:13:51 +01:00
2020-10-20 01:15:03 +02:00
before do
Group.refresh_automatic_group!(:trust_level_2)
template = JSON.parse(File.open(
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
2019-12-06 10:05:19 +01:00
).read)
2020-10-20 01:15:03 +02:00
CustomWizard::Wizard.add_wizard(template)
@wizard = CustomWizard::Wizard.create('super_mega_fun_wizard', user)
2019-12-09 06:51:42 +01:00
end
context 'disabled' do
before do
SiteSetting.custom_wizard_enabled = false
end
2020-10-20 01:15:03 +02:00
it "returns nil" do
expect(CustomWizard::Builder.new(@wizard.id, user).build).to eq(nil)
2019-12-09 06:51:42 +01:00
end
2019-12-04 12:13:51 +01:00
end
context 'enabled' do
before do
SiteSetting.custom_wizard_enabled = true
2019-12-04 12:13:51 +01:00
end
2019-12-06 10:05:19 +01:00
it "returns steps" do
2020-10-20 01:15:03 +02:00
expect(
CustomWizard::Builder.new(@wizard.id, user).build.steps.length
).to eq(2)
2019-12-04 12:13:51 +01:00
end
2020-04-11 08:22:12 +02:00
it 'returns no steps if multiple submissions are disabled and user has completed' do
2020-10-20 01:15:03 +02:00
wizard_template = CustomWizard::Wizard.find(@wizard.id)
wizard_template[:multiple_submissions] = false
CustomWizard::Wizard.save(wizard_template)
2019-12-06 10:05:19 +01:00
history_params = {
action: UserHistory.actions[:custom_wizard_step],
acting_user_id: user.id,
2020-10-20 01:15:03 +02:00
context: @wizard.id
2019-12-06 10:05:19 +01:00
}
2020-10-20 01:15:03 +02:00
@wizard.steps.each do |step|
UserHistory.create!(history_params.merge(subject: step.id))
end
2019-12-06 10:05:19 +01:00
2020-10-20 01:15:03 +02:00
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build
expect(
CustomWizard::Builder.new(@wizard.id, user).build.steps.length
).to eq(0)
2019-12-04 12:13:51 +01:00
end
2020-04-11 08:22:12 +02:00
it 'returns no steps if user is not permitted' do
2020-10-20 01:15:03 +02:00
expect(
CustomWizard::Builder.new(@wizard.id, new_user).build.steps.length
).to eq(0)
2019-12-04 12:13:51 +01:00
end
2020-04-11 08:22:12 +02:00
it 'returns steps if user is permitted' do
2020-10-20 01:15:03 +02:00
expect(
CustomWizard::Builder.new(@wizard.id, user).build.steps.length
).to eq(3)
2019-12-06 10:05:19 +01:00
end
2019-12-04 12:13:51 +01:00
2019-12-06 10:05:19 +01:00
it 'returns a wizard with prefilled data if user has partially completed it' do
2020-10-20 01:15:03 +02:00
expect(
CustomWizard::Builder.new(@wizard.id, user)
.build
.steps[0].fields[0].value
).to eq('I am prefilled')
2019-12-04 12:13:51 +01:00
end
it 'returns a wizard with no prefilled data if options include reset' do
2020-10-20 01:15:03 +02:00
PluginStore.set("super_mega_fun_wizard_submissions", user.id, {
text: 'Input into text',
})
expect(
CustomWizard::Builder.new(@wizard.id, user)
.build(reset: true)
.steps[0].fields[0].value
).to eq(nil)
2019-12-04 12:13:51 +01:00
end
context 'building steps' do
2019-12-06 10:05:19 +01:00
it 'returns step metadata' do
2020-10-20 01:15:03 +02:00
expect(
CustomWizard::Builder.new(@wizard.id, user)
.build(reset: true)
.steps[0]
).to eq('Super Mega Fun Wizard')
2019-12-04 12:13:51 +01:00
end
it 'saves permitted params' do
2020-10-20 01:15:03 +02:00
@wizard.steps[0].permitted_params = permitted_params
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build({}, param_key: 'param_value')
submissions = PluginStore.get("super_mega_fun_wizard_submissions", user.id)
expect(submissions[0]['submission_param_key']).to eq('param_value')
2019-12-04 12:13:51 +01:00
end
2019-12-09 02:43:30 +01:00
it 'is not permitted if required data is not present' do
2020-10-20 01:15:03 +02:00
@wizard.steps[0].required_data = required_data
expect(
CustomWizard::Builder.new(@wizard.id, user).build.steps[0].permitted
).to eq(false)
2019-12-04 12:13:51 +01:00
end
2019-12-09 02:43:30 +01:00
it 'it shows required data message if required data has message' do
2020-10-20 01:15:03 +02:00
@wizard.steps[0].required_data = required_data
@wizard.steps[0].required_data_message = "Data is required"
PluginStore.set("super_mega_fun_wizard_submissions", user.id,
text: 'Input into text',
)
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build
expect(built_wizard.steps[0].permitted).to eq(false)
expect(built_wizard.steps[0].permitted_message).to eq("Data is required")
2019-12-04 12:13:51 +01:00
end
2019-12-09 02:43:30 +01:00
it 'is permitted if required data is present' do
2020-10-20 01:15:03 +02:00
@wizard.steps[0].required_data = required_data
PluginStore.set('super_mega_fun_wizard_submissions', user.id,
text: "Input into text"
)
expect(
CustomWizard::Builder.new(@wizard.id, user).build.steps[0].permitted
).to eq(true)
2019-12-04 12:13:51 +01:00
end
2019-12-09 02:43:30 +01:00
it 'returns field metadata' do
2020-10-20 01:15:03 +02:00
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build
expect(built_wizard.steps[0].fields[0].label).to eq("<p>Name</p>")
expect(built_wizard.steps[0].fields[0].type).to eq("text")
2019-12-04 12:13:51 +01:00
end
2019-12-09 02:43:30 +01:00
it 'returns fields' do
2020-10-20 01:15:03 +02:00
@wizard.steps[0].fields[1] = checkbox_field
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build
expect(built_wizard.steps[0].fields.length).to eq(2)
2019-12-04 12:13:51 +01:00
end
end
context 'on update' do
2019-12-09 06:51:42 +01:00
it 'saves submissions' do
2020-10-20 01:15:03 +02:00
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build
built_wizard.create_updater(built_wizard.steps[0].id,
step_1_field_1: 'Text input'
).update
expect(
PluginStore.get("super_mega_fun_wizard_submissions", user.id)
.first['step_1_field_1']
).to eq('Text input')
2019-12-09 06:51:42 +01:00
end
context 'validation' do
2019-12-09 02:43:30 +01:00
it 'applies min length' do
2020-10-20 01:15:03 +02:00
@wizard.steps[0].fields[0].min_length = 10
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build
updater = built_wizard.create_updater(built_wizard.steps[0].id,
step_1_field_1: 'Te'
).update
expect(updater.errors.messages[:text].first).to eq(
I18n.t('wizard.field.too_short', label: 'Text', min: 3)
2019-12-09 02:43:30 +01:00
)
end
it 'standardises boolean entries' do
2020-10-20 01:15:03 +02:00
@wizard.steps[0].fields[0] = checkbox_field
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build
updater = built_wizard.create_updater(built_wizard.steps[1].id,
step_2_field_5: 'false'
).update
expect(
PluginStore.get("super_mega_fun_wizard_submissions", user.id)
.first['step_2_field_5']
).to eq(false)
end
it 'requires required fields' do
2020-10-20 01:15:03 +02:00
@wizard.steps[0].fields[0]['required'] = true
built_wizard = CustomWizard::Builder.new(@wizard.id, user).build
updater = built_wizard.create_updater(built_wizard.steps.second.id).update
expect(
updater.errors.messages[:step_1_field_1].first
).to eq(I18n.t('wizard.field.required', label: 'Text'))
end
end
2019-12-04 12:13:51 +01:00
end
end
end