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(
|
2019-12-05 07:48:32 +01:00
|
|
|
"#{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
|
|
|
|
|
2019-12-05 07:48:32 +01:00
|
|
|
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
|
|
|
|
|
2019-12-05 07:48:32 +01:00
|
|
|
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
|
|
|
|
|
2019-12-05 07:48:32 +01:00
|
|
|
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
|
|
|
|
|
2019-12-05 07:48:32 +01:00
|
|
|
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-05 07:48:32 +01:00
|
|
|
|
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
|
2019-12-05 07:48:32 +01:00
|
|
|
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
|
|
|
|
|
2019-12-05 07:48:32 +01:00
|
|
|
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
|
|
|
)
|
2019-12-05 07:48:32 +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)
|
2019-12-05 07:48:32 +01:00
|
|
|
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'))
|
2019-12-05 07:48:32 +01:00
|
|
|
end
|
|
|
|
end
|
2019-12-04 12:13:51 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|