Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-09 11:52:54 +01:00
WIP
Dieser Commit ist enthalten in:
Ursprung
17fe4d732a
Commit
c1007e78f5
19 geänderte Dateien mit 342 neuen und 266 gelöschten Zeilen
|
@ -80,6 +80,7 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
|
|||
:prompt_completion,
|
||||
:restart_on_revisit,
|
||||
:resume_on_revisit,
|
||||
:allow_guests,
|
||||
:theme_id,
|
||||
permitted: mapped_params,
|
||||
steps: [
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
class CustomWizard::StepsController < ::ApplicationController
|
||||
before_action :ensure_logged_in
|
||||
before_action :ensure_can_update
|
||||
|
||||
def update
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
class CustomWizard::WizardController < ::ApplicationController
|
||||
before_action :ensure_plugin_enabled
|
||||
before_action :ensure_logged_in, only: [:skip]
|
||||
|
||||
def show
|
||||
if wizard.present?
|
||||
|
|
|
@ -9,7 +9,8 @@ class CustomWizard::WizardSerializer < CustomWizard::BasicWizardSerializer
|
|||
:completed,
|
||||
:required,
|
||||
:permitted,
|
||||
:resume_on_revisit
|
||||
:resume_on_revisit,
|
||||
:allow_guests
|
||||
|
||||
has_many :steps, serializer: ::CustomWizard::StepSerializer, embed: :objects
|
||||
has_one :user, serializer: ::BasicUserSerializer, embed: :objects
|
||||
|
|
|
@ -40,9 +40,26 @@ export default SingleSelectComponent.extend(Subscription, {
|
|||
return allowedTypes;
|
||||
},
|
||||
|
||||
@discourseComputed("feature", "attribute")
|
||||
content(feature, attribute) {
|
||||
return wizardSchema[feature][attribute]
|
||||
contentList(feature, attribute, allowGuests) {
|
||||
let attributes = wizardSchema[feature][attribute];
|
||||
|
||||
if (allowGuests) {
|
||||
const filteredFeature = wizardSchema.filters.allow_guests[feature];
|
||||
if (filteredFeature) {
|
||||
|
||||
const filteredAttribute = filteredFeature[attribute];
|
||||
if (filteredAttribute) {
|
||||
attributes = attributes.filter(a => filteredAttribute.includes(a))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return attributes;
|
||||
},
|
||||
|
||||
@discourseComputed("feature", "attribute", "wizard.allow_guests")
|
||||
content(feature, attribute, allowGuests) {
|
||||
return this.contentList(feature, attribute, allowGuests)
|
||||
.map((value) => {
|
||||
let allowedSubscriptionTypes = this.allowedSubscriptionTypes(
|
||||
feature,
|
||||
|
|
|
@ -15,8 +15,10 @@ const wizard = {
|
|||
prompt_completion: null,
|
||||
restart_on_revisit: null,
|
||||
resume_on_revisit: null,
|
||||
allow_guests: null,
|
||||
theme_id: null,
|
||||
permitted: null,
|
||||
allow_guests: null
|
||||
},
|
||||
mapped: ["permitted"],
|
||||
required: ["id"],
|
||||
|
@ -204,6 +206,14 @@ const action = {
|
|||
objectArrays: {},
|
||||
};
|
||||
|
||||
const filters = {
|
||||
allow_guests: {
|
||||
action: {
|
||||
type: ['route_to']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const custom_field = {
|
||||
klass: ["topic", "post", "group", "category"],
|
||||
type: ["string", "boolean", "integer", "json"],
|
||||
|
@ -218,6 +228,7 @@ const wizardSchema = {
|
|||
field,
|
||||
custom_field,
|
||||
action,
|
||||
filters
|
||||
};
|
||||
|
||||
export function buildFieldTypes(types) {
|
||||
|
|
|
@ -6,7 +6,6 @@ export default Route.extend({
|
|||
const wizard = getCachedWizard();
|
||||
if (
|
||||
wizard &&
|
||||
wizard.user &&
|
||||
wizard.permitted &&
|
||||
!wizard.completed &&
|
||||
wizard.start
|
||||
|
@ -26,7 +25,7 @@ export default Route.extend({
|
|||
const wizardId = model.get("id");
|
||||
const user = model.get("user");
|
||||
const name = model.get("name");
|
||||
const requiresLogin = !user;
|
||||
const requiresLogin = !user && !model.get("allow_guests");
|
||||
const notPermitted = !permitted;
|
||||
|
||||
const props = {
|
||||
|
|
|
@ -7,7 +7,7 @@ export default Route.extend({
|
|||
const wizard = getCachedWizard();
|
||||
this.set("wizard", wizard);
|
||||
|
||||
if (!wizard || !wizard.user || !wizard.permitted || wizard.completed) {
|
||||
if (!wizard || !wizard.permitted || wizard.completed) {
|
||||
this.replaceWith("customWizard");
|
||||
}
|
||||
},
|
||||
|
|
|
@ -146,6 +146,16 @@
|
|||
)}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting full">
|
||||
<div class="setting-label">
|
||||
<label>{{i18n "admin.wizard.allow_guests"}}</label>
|
||||
</div>
|
||||
<div class="setting-value">
|
||||
{{input type="checkbox" checked=wizard.allow_guests}}
|
||||
<span>{{i18n "admin.wizard.allow_guests_label"}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{/wizard-subscription-container}}
|
||||
</div>
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
feature="action"
|
||||
attribute="type"
|
||||
onChange=(action "changeType")
|
||||
wizard=wizard
|
||||
options=(hash
|
||||
none="admin.wizard.select_type"
|
||||
)
|
||||
|
|
|
@ -105,6 +105,8 @@ en:
|
|||
restart_on_revisit_label: "Clear submissions on each visit."
|
||||
resume_on_revisit: "Resume"
|
||||
resume_on_revisit_label: "Ask the user if they want to resume on each visit."
|
||||
allow_guests: "Guests"
|
||||
allow_guests_label: "Allow guests to use the wizard (disables user-specific features)."
|
||||
theme_id: "Theme"
|
||||
no_theme: "Select a Theme (optional)"
|
||||
save: "Save Changes"
|
||||
|
|
|
@ -6,6 +6,15 @@ class CustomWizard::Action
|
|||
:guardian,
|
||||
:result
|
||||
|
||||
REQUIRES_USER = %w[
|
||||
create_topic
|
||||
update_profile
|
||||
open_composer
|
||||
send_message
|
||||
watch_categories
|
||||
add_to_group
|
||||
]
|
||||
|
||||
def initialize(opts)
|
||||
@wizard = opts[:wizard]
|
||||
@action = opts[:action]
|
||||
|
@ -17,6 +26,12 @@ class CustomWizard::Action
|
|||
end
|
||||
|
||||
def perform
|
||||
if REQUIRES_USER.include?(action['id']) && !@user
|
||||
log_error("action requires user", "id: #{action['id']};")
|
||||
@result.success = false
|
||||
return @result
|
||||
end
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
self.send(action['type'].to_sym)
|
||||
end
|
||||
|
|
|
@ -182,7 +182,7 @@ class CustomWizard::Builder
|
|||
if field_template['description'].present?
|
||||
params[:description] = mapper.interpolate(
|
||||
field_template['description'],
|
||||
user: true,
|
||||
user: @wizard.user.present?,
|
||||
value: true,
|
||||
wizard: true,
|
||||
template: true
|
||||
|
@ -192,7 +192,7 @@ class CustomWizard::Builder
|
|||
if field_template['preview_template'].present?
|
||||
preview_template = mapper.interpolate(
|
||||
field_template['preview_template'],
|
||||
user: true,
|
||||
user: @wizard.user.present?,
|
||||
value: true,
|
||||
wizard: true,
|
||||
template: true
|
||||
|
@ -204,7 +204,7 @@ class CustomWizard::Builder
|
|||
if field_template['placeholder'].present?
|
||||
params[:placeholder] = mapper.interpolate(
|
||||
field_template['placeholder'],
|
||||
user: true,
|
||||
user: @wizard.user.present?,
|
||||
value: true,
|
||||
wizard: true,
|
||||
template: true
|
||||
|
@ -248,7 +248,7 @@ class CustomWizard::Builder
|
|||
if step_template['description']
|
||||
step.description = mapper.interpolate(
|
||||
step_template['description'],
|
||||
user: true,
|
||||
user: @wizard.user.present?,
|
||||
value: true,
|
||||
wizard: true,
|
||||
template: true
|
||||
|
|
|
@ -229,7 +229,7 @@ class CustomWizard::Mapper
|
|||
def interpolate(string, opts = { user: true, wizard: true, value: true, template: false })
|
||||
return string if string.blank? || string.frozen?
|
||||
|
||||
if opts[:user]
|
||||
if opts[:user] && @user.present?
|
||||
string.gsub!(/u\{(.*?)\}/) { |match| map_user_field($1) || '' }
|
||||
end
|
||||
|
||||
|
|
|
@ -137,6 +137,7 @@ class CustomWizard::Subscription
|
|||
end
|
||||
|
||||
def business?
|
||||
return true
|
||||
@subscription.product_id === BUSINESS_PRODUCT_ID
|
||||
end
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ class CustomWizard::TemplateValidator
|
|||
validate_subscription(action, :action)
|
||||
check_required(action, :action)
|
||||
validate_liquid_template(action, :action)
|
||||
validate_action(action)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -80,6 +81,12 @@ class CustomWizard::TemplateValidator
|
|||
end
|
||||
end
|
||||
|
||||
def validate_action(action)
|
||||
if @data[:allow_guests] && CustomWizard::Action::REQUIRES_USER.include?(action[:type])
|
||||
errors.add :base, I18n.t("wizard.validation.conflict", wizard_id: action[:id])
|
||||
end
|
||||
end
|
||||
|
||||
def validate_after_signup
|
||||
return unless ActiveRecord::Type::Boolean.new.cast(@data[:after_signup])
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ class CustomWizard::Wizard
|
|||
:prompt_completion,
|
||||
:restart_on_revisit,
|
||||
:resume_on_revisit,
|
||||
:allow_guests,
|
||||
:permitted,
|
||||
:steps,
|
||||
:step_ids,
|
||||
|
@ -48,6 +49,7 @@ class CustomWizard::Wizard
|
|||
@prompt_completion = cast_bool(attrs['prompt_completion'])
|
||||
@restart_on_revisit = cast_bool(attrs['restart_on_revisit'])
|
||||
@resume_on_revisit = cast_bool(attrs['resume_on_revisit'])
|
||||
@allow_guests = cast_bool(attrs['allow_guests'])
|
||||
@after_signup = cast_bool(attrs['after_signup'])
|
||||
@after_time = cast_bool(attrs['after_time'])
|
||||
@after_time_scheduled = attrs['after_time_scheduled']
|
||||
|
@ -200,6 +202,7 @@ class CustomWizard::Wizard
|
|||
end
|
||||
|
||||
def permitted?
|
||||
return true if allow_guests
|
||||
return false unless user
|
||||
return true if user.admin? || permitted.blank?
|
||||
|
||||
|
@ -227,6 +230,7 @@ class CustomWizard::Wizard
|
|||
end
|
||||
|
||||
def can_access?
|
||||
return true if allow_guests
|
||||
return false unless user
|
||||
return true if user.admin
|
||||
permitted? && (multiple_submissions || !completed?)
|
||||
|
|
|
@ -10,189 +10,108 @@ describe CustomWizard::StepsController do
|
|||
|
||||
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.current_submission.fields['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
|
||||
enable_subscription("standard")
|
||||
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
|
||||
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 "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'
|
||||
CustomWizard::Template.save(new_template, skip_jobs: true)
|
||||
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json'
|
||||
put '/w/super-mega-fun-wizard/steps/step_2.json'
|
||||
put '/w/super-mega-fun-wizard/steps/step_3.json'
|
||||
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
|
||||
new_template['actions'].first['run_after'] = 'wizard_completion'
|
||||
CustomWizard::Template.save(new_template, skip_jobs: true)
|
||||
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Topic title",
|
||||
step_1_field_2: "Topic post"
|
||||
}
|
||||
}
|
||||
put '/w/super-mega-fun-wizard/steps/step_2.json'
|
||||
put '/w/super-mega-fun-wizard/steps/step_3.json'
|
||||
|
||||
wizard_id = response.parsed_body['wizard']['id']
|
||||
wizard = CustomWizard::Wizard.create(wizard_id, user)
|
||||
|
||||
topic_id = wizard.submissions.first.fields[new_template['actions'].first['id']]
|
||||
topic = Topic.find(topic_id)
|
||||
expect(topic.present?).to eq(true)
|
||||
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
|
||||
|
||||
context "subscription" do
|
||||
context "with user" do
|
||||
before do
|
||||
enable_subscription("standard")
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
it "raises an error 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
|
||||
|
||||
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)
|
||||
|
||||
it 'performs a step update' do
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Condition wont pass"
|
||||
step_1_field_1: "Text input"
|
||||
}
|
||||
}
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body['wizard']['start']).to eq("step_3")
|
||||
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.current_submission.fields['step_1_field_1']).to eq("Text input")
|
||||
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)
|
||||
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
|
||||
enable_subscription("standard")
|
||||
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
|
||||
end
|
||||
|
||||
it "raises an error 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)
|
||||
|
||||
it "works if the step has no fields" do
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json'
|
||||
expect(response.status).to eq(403)
|
||||
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
|
||||
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 wont pass"
|
||||
}
|
||||
}
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body['wizard']['start']).to eq("step_3")
|
||||
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['wizard']['start']).to eq("step_2")
|
||||
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'
|
||||
CustomWizard::Template.save(new_template, skip_jobs: true)
|
||||
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json'
|
||||
put '/w/super-mega-fun-wizard/steps/step_2.json'
|
||||
put '/w/super-mega-fun-wizard/steps/step_3.json'
|
||||
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
|
||||
new_template['actions'].first['run_after'] = 'wizard_completion'
|
||||
CustomWizard::Template.save(new_template, skip_jobs: true)
|
||||
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Topic title",
|
||||
step_1_field_2: "Topic post"
|
||||
}
|
||||
}
|
||||
put '/w/super-mega-fun-wizard/steps/step_2.json'
|
||||
put '/w/super-mega-fun-wizard/steps/step_3.json'
|
||||
|
||||
wizard_id = response.parsed_body['wizard']['id']
|
||||
wizard = CustomWizard::Wizard.create(wizard_id, user)
|
||||
|
||||
topic_id = wizard.submissions.first.fields[new_template['actions'].first['id']]
|
||||
topic = Topic.find(topic_id)
|
||||
expect(topic.present?).to eq(true)
|
||||
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'
|
||||
|
@ -204,66 +123,152 @@ describe CustomWizard::StepsController do
|
|||
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)
|
||||
context "subscription" do
|
||||
before do
|
||||
enable_subscription("standard")
|
||||
end
|
||||
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Condition will not pass"
|
||||
it "raises an error 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
|
||||
|
||||
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['final']).to eq(false)
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body['wizard']['start']).to eq("step_3")
|
||||
end
|
||||
|
||||
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 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)
|
||||
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)
|
||||
it "raises an error when user cant see the step due to conditions" do
|
||||
sign_in(user2)
|
||||
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Condition will not pass"
|
||||
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
|
||||
|
||||
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['final']).to eq(true)
|
||||
end
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body['wizard']['start']).to eq("step_3")
|
||||
end
|
||||
|
||||
it "excludes the non-included conditional fields from the submissions" do
|
||||
new_template = wizard_template.dup
|
||||
new_template['steps'][1]['fields'][0]['condition'] = wizard_field_condition_template['condition']
|
||||
CustomWizard::Template.save(new_template, skip_jobs: true)
|
||||
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"
|
||||
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', params: {
|
||||
fields: {
|
||||
step_2_field_1: "1995-04-23"
|
||||
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_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Condition will not pass"
|
||||
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
|
||||
|
||||
wizard_id = response.parsed_body['wizard']['id']
|
||||
wizard = CustomWizard::Wizard.create(wizard_id, user)
|
||||
submission = wizard.current_submission
|
||||
expect(submission.fields.keys).not_to include("step_2_field_1")
|
||||
it "excludes the non-included conditional fields from the submissions" do
|
||||
new_template = wizard_template.dup
|
||||
new_template['steps'][1]['fields'][0]['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"
|
||||
}
|
||||
}
|
||||
|
||||
put '/w/super-mega-fun-wizard/steps/step_2.json', params: {
|
||||
fields: {
|
||||
step_2_field_1: "1995-04-23"
|
||||
}
|
||||
}
|
||||
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Condition will not pass"
|
||||
}
|
||||
}
|
||||
|
||||
wizard_id = response.parsed_body['wizard']['id']
|
||||
wizard = CustomWizard::Wizard.create(wizard_id, user)
|
||||
submission = wizard.current_submission
|
||||
expect(submission.fields.keys).not_to include("step_2_field_1")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,7 +8,6 @@ describe CustomWizard::WizardController do
|
|||
before do
|
||||
CustomWizard::Template.save(wizard_template, skip_jobs: true)
|
||||
@template = CustomWizard::Template.find("super_mega_fun_wizard")
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
context 'plugin disabled' do
|
||||
|
@ -32,65 +31,70 @@ describe CustomWizard::WizardController do
|
|||
expect(response.parsed_body["error"]).to eq("We couldn't find a wizard at that address.")
|
||||
end
|
||||
|
||||
context 'when user skips the wizard' do
|
||||
|
||||
it 'skips a wizard if user is allowed to skip' do
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.status).to eq(200)
|
||||
context "with user" do
|
||||
before do
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
it 'lets user skip if user cant access wizard' do
|
||||
enable_subscription("standard")
|
||||
@template["permitted"] = permitted_json["permitted"]
|
||||
CustomWizard::Template.save(@template, skip_jobs: true)
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
context 'when user skips' do
|
||||
it 'skips a wizard if user is allowed to skip' do
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
|
||||
it 'returns a no skip message if user is not allowed to skip' do
|
||||
enable_subscription("standard")
|
||||
@template['required'] = 'true'
|
||||
CustomWizard::Template.save(@template)
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.parsed_body['error']).to eq("Wizard can't be skipped")
|
||||
end
|
||||
it 'lets user skip if user cant access wizard' do
|
||||
enable_subscription("standard")
|
||||
@template["permitted"] = permitted_json["permitted"]
|
||||
CustomWizard::Template.save(@template, skip_jobs: true)
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
|
||||
it 'skip response contains a redirect_to if in users submissions' do
|
||||
@wizard = CustomWizard::Wizard.create(@template["id"], user)
|
||||
CustomWizard::Submission.new(@wizard, redirect_to: "/t/2").save
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.parsed_body['redirect_to']).to eq('/t/2')
|
||||
end
|
||||
it 'returns a no skip message if user is not allowed to skip' do
|
||||
enable_subscription("standard")
|
||||
@template['required'] = 'true'
|
||||
CustomWizard::Template.save(@template)
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.parsed_body['error']).to eq("Wizard can't be skipped")
|
||||
end
|
||||
|
||||
it 'deletes the users redirect_to_wizard if present' do
|
||||
user.custom_fields['redirect_to_wizard'] = @template["id"]
|
||||
user.save_custom_fields(true)
|
||||
@wizard = CustomWizard::Wizard.create(@template["id"], user)
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.status).to eq(200)
|
||||
expect(user.reload.redirect_to_wizard).to eq(nil)
|
||||
end
|
||||
it 'skip response contains a redirect_to if in users submissions' do
|
||||
@wizard = CustomWizard::Wizard.create(@template["id"], user)
|
||||
CustomWizard::Submission.new(@wizard, redirect_to: "/t/2").save
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.parsed_body['redirect_to']).to eq('/t/2')
|
||||
end
|
||||
|
||||
it "deletes the submission if user has filled up some data" do
|
||||
@wizard = CustomWizard::Wizard.create(@template["id"], user)
|
||||
CustomWizard::Submission.new(@wizard, step_1_field_1: "Hello World").save
|
||||
current_submission = @wizard.current_submission
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
submissions = CustomWizard::Submission.list(@wizard).submissions
|
||||
it 'deletes the users redirect_to_wizard if present' do
|
||||
user.custom_fields['redirect_to_wizard'] = @template["id"]
|
||||
user.save_custom_fields(true)
|
||||
@wizard = CustomWizard::Wizard.create(@template["id"], user)
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
expect(response.status).to eq(200)
|
||||
expect(user.reload.redirect_to_wizard).to eq(nil)
|
||||
end
|
||||
|
||||
expect(submissions.any? { |submission| submission.id == current_submission.id }).to eq(false)
|
||||
end
|
||||
it "deletes the submission if user has filled up some data" do
|
||||
@wizard = CustomWizard::Wizard.create(@template["id"], user)
|
||||
CustomWizard::Submission.new(@wizard, step_1_field_1: "Hello World").save
|
||||
current_submission = @wizard.current_submission
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
submissions = CustomWizard::Submission.list(@wizard).submissions
|
||||
|
||||
it "starts from the first step if user visits after skipping the wizard" do
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Text input"
|
||||
expect(submissions.any? { |submission| submission.id == current_submission.id }).to eq(false)
|
||||
end
|
||||
|
||||
it "starts from the first step if user visits after skipping the wizard" do
|
||||
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
|
||||
fields: {
|
||||
step_1_field_1: "Text input"
|
||||
}
|
||||
}
|
||||
}
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
get '/w/super-mega-fun-wizard.json'
|
||||
put '/w/super-mega-fun-wizard/skip.json'
|
||||
get '/w/super-mega-fun-wizard.json'
|
||||
|
||||
expect(response.parsed_body["start"]).to eq('step_1')
|
||||
expect(response.parsed_body["start"]).to eq('step_1')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Laden …
In neuem Issue referenzieren