Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-12-01 21:11:10 +01:00
dc7e43b6d7
The can_access? check will fail if the wizard does not allow multiple submissions. This means that on the second build of the wizard on the final step of a single submission wizard, the wizard instance will have no steps, and an error will be thrown when logic assumes it does.
289 Zeilen
8,5 KiB
Ruby
289 Zeilen
8,5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative '../../plugin_helper'
|
|
|
|
describe CustomWizard::Wizard do
|
|
fab!(:user) { Fabricate(:user) }
|
|
fab!(:trusted_user) { Fabricate(:user, trust_level: TrustLevel[3]) }
|
|
fab!(:admin_user) { Fabricate(:user, admin: true) }
|
|
|
|
let(:template_json) {
|
|
JSON.parse(
|
|
File.open(
|
|
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
|
|
).read
|
|
)
|
|
}
|
|
|
|
let(:permitted_json) {
|
|
JSON.parse(
|
|
File.open(
|
|
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard/permitted.json"
|
|
).read
|
|
)
|
|
}
|
|
|
|
before do
|
|
Group.refresh_automatic_group!(:trust_level_3)
|
|
@permitted_template = template_json.dup
|
|
@permitted_template["permitted"] = permitted_json["permitted"]
|
|
@wizard = CustomWizard::Wizard.new(template_json, user)
|
|
end
|
|
|
|
def append_steps
|
|
template_json['steps'].each do |step_template|
|
|
@wizard.append_step(step_template['id'])
|
|
end
|
|
@wizard.update_step_order!
|
|
end
|
|
|
|
def progress_step(step_id, acting_user: user, wizard: @wizard)
|
|
UserHistory.create(
|
|
action: UserHistory.actions[:custom_wizard_step],
|
|
acting_user_id: acting_user.id,
|
|
context: wizard.id,
|
|
subject: step_id
|
|
)
|
|
@wizard.update_step_order!
|
|
end
|
|
|
|
it "appends steps" do
|
|
append_steps
|
|
expect(@wizard.steps.length).to eq(3)
|
|
end
|
|
|
|
it "appends steps with indexes" do
|
|
append_steps
|
|
expect(@wizard.steps.first.index).to eq(0)
|
|
expect(@wizard.steps.last.index).to eq(2)
|
|
end
|
|
|
|
it "appends steps with custom indexes" do
|
|
template_json['steps'][0]['index'] = 2
|
|
template_json['steps'][1]['index'] = 1
|
|
template_json['steps'][2]['index'] = 0
|
|
|
|
template_json['steps'].each do |step_template|
|
|
@wizard.append_step(step_template['id']) do |step|
|
|
step.index = step_template['index'] if step_template['index']
|
|
end
|
|
end
|
|
|
|
expect(@wizard.steps.first.index).to eq(2)
|
|
expect(@wizard.steps.last.index).to eq(0)
|
|
|
|
@wizard.update_step_order!
|
|
|
|
expect(@wizard.steps.first.id).to eq("step_3")
|
|
expect(@wizard.steps.last.id).to eq("step_1")
|
|
|
|
expect(@wizard.steps.first.next.id).to eq("step_2")
|
|
expect(@wizard.steps.last.next).to eq(nil)
|
|
end
|
|
|
|
it "determines the user's current step" do
|
|
append_steps
|
|
expect(@wizard.start).to eq('step_1')
|
|
progress_step('step_1')
|
|
expect(@wizard.start).to eq('step_2')
|
|
end
|
|
|
|
it "creates a step updater" do
|
|
expect(
|
|
@wizard.create_updater('step_1', step_1_field_1: "Text input")
|
|
.class
|
|
).to eq(CustomWizard::StepUpdater)
|
|
end
|
|
|
|
it "determines whether a wizard is unfinished" do
|
|
append_steps
|
|
expect(@wizard.unfinished?).to eq(true)
|
|
progress_step("step_1")
|
|
expect(@wizard.unfinished?).to eq(true)
|
|
progress_step("step_2")
|
|
expect(@wizard.unfinished?).to eq(true)
|
|
progress_step("step_3")
|
|
expect(@wizard.unfinished?).to eq(false)
|
|
end
|
|
|
|
it "determines whether a wizard has been completed by a user" do
|
|
append_steps
|
|
expect(@wizard.completed?).to eq(false)
|
|
progress_step("step_1")
|
|
progress_step("step_2")
|
|
progress_step("step_3")
|
|
expect(@wizard.completed?).to eq(true)
|
|
end
|
|
|
|
it "is not completed if steps submitted before after time" do
|
|
append_steps
|
|
|
|
progress_step("step_1")
|
|
progress_step("step_2")
|
|
progress_step("step_3")
|
|
|
|
template_json['after_time'] = true
|
|
template_json['after_time_scheduled'] = Time.now + 3.hours
|
|
|
|
wizard = CustomWizard::Wizard.new(template_json, user)
|
|
expect(wizard.completed?).to eq(false)
|
|
end
|
|
|
|
it "permits admins" do
|
|
expect(
|
|
CustomWizard::Wizard.new(@permitted_template, admin_user).permitted?
|
|
).to eq(true)
|
|
end
|
|
|
|
it "permits permitted users" do
|
|
expect(
|
|
CustomWizard::Wizard.new(@permitted_template, trusted_user).permitted?
|
|
).to eq(true)
|
|
end
|
|
|
|
it "permits everyone if everyone is permitted" do
|
|
@permitted_template['permitted'][0]['output'] = Group::AUTO_GROUPS[:everyone]
|
|
expect(
|
|
CustomWizard::Wizard.new(@permitted_template, user).permitted?
|
|
).to eq(true)
|
|
end
|
|
|
|
it "does not permit unpermitted users" do
|
|
expect(
|
|
CustomWizard::Wizard.new(@permitted_template, user).permitted?
|
|
).to eq(false)
|
|
end
|
|
|
|
it "does not let an unpermitted user access a wizard" do
|
|
expect(
|
|
CustomWizard::Wizard.new(@permitted_template, user).can_access?
|
|
).to eq(false)
|
|
end
|
|
|
|
it "lets a permitted user access an incomplete wizard" do
|
|
expect(
|
|
CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
|
|
).to eq(true)
|
|
end
|
|
|
|
it "lets a permitted user access a complete wizard with multiple submissions" do
|
|
append_steps
|
|
|
|
progress_step("step_1", acting_user: trusted_user)
|
|
progress_step("step_2", acting_user: trusted_user)
|
|
progress_step("step_3", acting_user: trusted_user)
|
|
|
|
@permitted_template["multiple_submissions"] = true
|
|
|
|
expect(
|
|
CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
|
|
).to eq(true)
|
|
end
|
|
|
|
it "does not let an unpermitted user access a complete wizard without multiple submissions" do
|
|
append_steps
|
|
|
|
progress_step("step_1", acting_user: trusted_user)
|
|
progress_step("step_2", acting_user: trusted_user)
|
|
progress_step("step_3", acting_user: trusted_user)
|
|
|
|
@permitted_template['multiple_submissions'] = false
|
|
|
|
expect(
|
|
CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
|
|
).to eq(false)
|
|
end
|
|
|
|
it "lists the site groups" do
|
|
expect(@wizard.groups.length).to eq(8)
|
|
end
|
|
|
|
it "lists the site categories" do
|
|
expect(@wizard.categories.length).to eq(1)
|
|
end
|
|
|
|
context "submissions" do
|
|
before do
|
|
@wizard.set_submissions(step_1_field_1: 'I am a user submission')
|
|
end
|
|
|
|
it "sets the user's submission" do
|
|
expect(
|
|
PluginStore.get("#{template_json['id']}_submissions", user.id)
|
|
.first['step_1_field_1']
|
|
).to eq('I am a user submission')
|
|
end
|
|
|
|
it "lists the user's submissions" do
|
|
expect(@wizard.submissions.length).to eq(1)
|
|
end
|
|
|
|
it "returns the user's current submission" do
|
|
expect(@wizard.current_submission['step_1_field_1']).to eq('I am a user submission')
|
|
end
|
|
end
|
|
|
|
it "provides class methods to set and list submissions" do
|
|
CustomWizard::Wizard.set_submissions(template_json['id'], user,
|
|
step_1_field_1: 'I am a user submission'
|
|
)
|
|
expect(
|
|
CustomWizard::Wizard.submissions(template_json['id'], user)
|
|
.first['step_1_field_1']
|
|
).to eq('I am a user submission')
|
|
end
|
|
|
|
context "class methods" do
|
|
before do
|
|
CustomWizard::Template.save(@permitted_template, skip_jobs: true)
|
|
|
|
template_json_2 = template_json.dup
|
|
template_json_2["id"] = 'super_mega_fun_wizard_2'
|
|
template_json_2["prompt_completion"] = true
|
|
CustomWizard::Template.save(template_json_2, skip_jobs: true)
|
|
|
|
template_json_3 = template_json.dup
|
|
template_json_3["id"] = 'super_mega_fun_wizard_3'
|
|
template_json_3["after_signup"] = true
|
|
template_json_3["prompt_completion"] = true
|
|
CustomWizard::Template.save(template_json_3, skip_jobs: true)
|
|
end
|
|
|
|
it "lists wizards the user can see" do
|
|
expect(CustomWizard::Wizard.list(user).length).to eq(2)
|
|
expect(CustomWizard::Wizard.list(trusted_user).length).to eq(3)
|
|
end
|
|
|
|
it "returns the first after signup wizard" do
|
|
expect(CustomWizard::Wizard.after_signup(user).id).to eq('super_mega_fun_wizard_3')
|
|
end
|
|
|
|
it "lists prompt completion wizards" do
|
|
expect(CustomWizard::Wizard.prompt_completion(user).length).to eq(2)
|
|
end
|
|
|
|
it "prompt completion does not include wizards user has completed" do
|
|
wizard_2 = CustomWizard::Wizard.new(CustomWizard::Template.find('super_mega_fun_wizard_2'), user)
|
|
progress_step("step_1", wizard: wizard_2)
|
|
progress_step("step_2", wizard: wizard_2)
|
|
progress_step("step_3", wizard: wizard_2)
|
|
expect(CustomWizard::Wizard.prompt_completion(user).length).to eq(1)
|
|
end
|
|
end
|
|
|
|
it "sets wizard redirects if user is permitted" do
|
|
CustomWizard::Template.save(@permitted_template, skip_jobs: true)
|
|
CustomWizard::Wizard.set_wizard_redirect('super_mega_fun_wizard', trusted_user)
|
|
expect(
|
|
trusted_user.custom_fields['redirect_to_wizard']
|
|
).to eq("super_mega_fun_wizard")
|
|
end
|
|
|
|
it "does not set a wizard redirect if user is not permitted" do
|
|
CustomWizard::Template.save(@permitted_template, skip_jobs: true)
|
|
CustomWizard::Wizard.set_wizard_redirect('super_mega_fun_wizard', user)
|
|
expect(
|
|
trusted_user.custom_fields['redirect_to_wizard']
|
|
).to eq(nil)
|
|
end
|
|
end
|