Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-10 04:12:53 +01:00
ceef3f4bc9
* Re structure builder logic to allow for step conditionality Concerns - Performance. Look at whether the additional build in the steps controller can be reduced - Does not work if applied to the last step. - Certain conditions will not work with the first step(?) - How should this be scoped to known functionality? * Add indexes and conditions to steps and fields * Complete and add spec * Complete backend * Complete step conditionality and field indexing * Fix failing spec * Update coverage * Apply rubocop * Apply prettier * Apply prettier to wizard js * Fix schema issues created in merge * Remove setting label for force_final * Improve client wizard cache naming * Improve steps controller and spec conditionality * Improve final step attribute naming * Fix failing spec * Linting * Add one more final step test * Linting * Fix eslint issues * Apply prettier * Linting, syntax, merge and copy cleanups * Update wizard-admin.scss * Fix template linting * Rubocop fixes
287 Zeilen
8,4 KiB
Ruby
287 Zeilen
8,4 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)
|
|
|
|
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
|