Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-25 10:40:28 +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
252 Zeilen
8,1 KiB
Ruby
252 Zeilen
8,1 KiB
Ruby
# frozen_string_literal: true
|
|
require_relative '../../plugin_helper'
|
|
|
|
describe CustomWizard::StepsController do
|
|
fab!(:user) {
|
|
Fabricate(
|
|
:user,
|
|
username: 'angus',
|
|
email: "angus@email.com",
|
|
trust_level: TrustLevel[3]
|
|
)
|
|
}
|
|
|
|
fab!(:user2) {
|
|
Fabricate(
|
|
:user,
|
|
username: 'bob',
|
|
email: "bob@email.com",
|
|
trust_level: TrustLevel[2]
|
|
)
|
|
}
|
|
|
|
let(:wizard_template) {
|
|
JSON.parse(
|
|
File.open(
|
|
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
|
|
).read
|
|
)
|
|
}
|
|
|
|
let(:wizard_field_condition_template) {
|
|
JSON.parse(
|
|
File.open(
|
|
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/condition/wizard_field_condition.json"
|
|
).read
|
|
)
|
|
}
|
|
|
|
let(:user_condition_template) {
|
|
JSON.parse(
|
|
File.open(
|
|
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/condition/user_condition.json"
|
|
).read
|
|
)
|
|
}
|
|
|
|
let(:permitted_json) {
|
|
JSON.parse(
|
|
File.open(
|
|
"#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard/permitted.json"
|
|
).read
|
|
)
|
|
}
|
|
|
|
before do
|
|
CustomWizard::Template.save(wizard_template, skip_jobs: true)
|
|
sign_in(user)
|
|
end
|
|
|
|
it 'performs a step update' do
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
|
fields: {
|
|
step_1_field_1: "Text input"
|
|
}
|
|
}
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['wizard']['start']).to eq("step_2")
|
|
|
|
wizard_id = response.parsed_body['wizard']['id']
|
|
wizard = CustomWizard::Wizard.create(wizard_id, user)
|
|
expect(wizard.submissions.last['step_1_field_1']).to eq("Text input")
|
|
end
|
|
|
|
context "raises an error" do
|
|
it "when the wizard doesnt exist" do
|
|
put '/w/not-super-mega-fun-wizard/steps/step_1.json'
|
|
expect(response.status).to eq(400)
|
|
end
|
|
|
|
it "when the user cant access the wizard" do
|
|
new_template = wizard_template.dup
|
|
new_template["permitted"] = permitted_json["permitted"]
|
|
CustomWizard::Template.save(new_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json'
|
|
expect(response.status).to eq(403)
|
|
end
|
|
|
|
it "when the step doesnt exist" do
|
|
put '/w/super-mega-fun-wizard/steps/step_10.json'
|
|
expect(response.status).to eq(400)
|
|
end
|
|
|
|
it "when user cant see the step due to conditions" do
|
|
sign_in(user2)
|
|
|
|
new_wizard_template = wizard_template.dup
|
|
new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
|
|
CustomWizard::Template.save(new_wizard_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json'
|
|
expect(response.status).to eq(403)
|
|
end
|
|
end
|
|
|
|
it "works if the step has no fields" do
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json'
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['wizard']['start']).to eq("step_2")
|
|
end
|
|
|
|
it "returns an updated wizard when condition passes" do
|
|
new_template = wizard_template.dup
|
|
new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
|
|
CustomWizard::Template.save(new_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
|
fields: {
|
|
step_1_field_1: "Condition will pass"
|
|
}
|
|
}
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['wizard']['start']).to eq("step_2")
|
|
end
|
|
|
|
it "returns an updated wizard when condition doesnt pass" do
|
|
new_template = wizard_template.dup
|
|
new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
|
|
CustomWizard::Template.save(new_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
|
fields: {
|
|
step_1_field_1: "Condition wont pass"
|
|
}
|
|
}
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['wizard']['start']).to eq("step_3")
|
|
end
|
|
|
|
it "runs completion actions if user has completed wizard" do
|
|
new_template = wizard_template.dup
|
|
|
|
## route_to action
|
|
new_template['actions'].last['run_after'] = 'wizard_completion'
|
|
new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
|
|
new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
|
|
CustomWizard::Template.save(new_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
|
fields: {
|
|
step_1_field_1: "Condition wont pass"
|
|
}
|
|
}
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['redirect_on_complete']).to eq("https://google.com")
|
|
end
|
|
|
|
it "saves results of completion actions if user has completed wizard" do
|
|
new_template = wizard_template.dup
|
|
|
|
## Create group action
|
|
new_template['actions'].first['run_after'] = 'wizard_completion'
|
|
new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
|
|
CustomWizard::Template.save(new_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
|
fields: {
|
|
step_1_field_1: "My cool group"
|
|
}
|
|
}
|
|
expect(response.status).to eq(200)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_3.json'
|
|
expect(response.status).to eq(200)
|
|
|
|
wizard_id = response.parsed_body['wizard']['id']
|
|
wizard = CustomWizard::Wizard.create(wizard_id, user)
|
|
group_name = wizard.submissions.last['action_9']
|
|
group = Group.find_by(name: group_name)
|
|
expect(group.full_name).to eq("My cool group")
|
|
end
|
|
|
|
it "returns a final step without conditions" do
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json'
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(false)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_2.json'
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(false)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_3.json'
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(true)
|
|
end
|
|
|
|
it "returns the correct final step when the conditional final step and last step are the same" do
|
|
new_template = wizard_template.dup
|
|
new_template['steps'][0]['condition'] = user_condition_template['condition']
|
|
new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
|
|
CustomWizard::Template.save(new_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
|
fields: {
|
|
step_1_field_1: "Condition will pass"
|
|
}
|
|
}
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(false)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_2.json'
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(false)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_3.json'
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(true)
|
|
end
|
|
|
|
it "returns the correct final step when the conditional final step and last step are different" do
|
|
new_template = wizard_template.dup
|
|
new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
|
|
CustomWizard::Template.save(new_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
|
fields: {
|
|
step_1_field_1: "Condition will not pass"
|
|
}
|
|
}
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(false)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_2.json'
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(true)
|
|
end
|
|
|
|
it "returns the correct final step when the conditional final step is determined in the same action" do
|
|
new_template = wizard_template.dup
|
|
new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
|
|
new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
|
|
CustomWizard::Template.save(new_template, skip_jobs: true)
|
|
|
|
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
|
fields: {
|
|
step_1_field_1: "Condition will not pass"
|
|
}
|
|
}
|
|
expect(response.status).to eq(200)
|
|
expect(response.parsed_body['final']).to eq(true)
|
|
end
|
|
end
|