0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-25 10:40:28 +01:00
Dieser Commit ist enthalten in:
Angus McLeod 2022-12-24 09:42:09 +01:00
Ursprung 17fe4d732a
Commit c1007e78f5
19 geänderte Dateien mit 342 neuen und 266 gelöschten Zeilen

Datei anzeigen

@ -80,6 +80,7 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
:prompt_completion, :prompt_completion,
:restart_on_revisit, :restart_on_revisit,
:resume_on_revisit, :resume_on_revisit,
:allow_guests,
:theme_id, :theme_id,
permitted: mapped_params, permitted: mapped_params,
steps: [ steps: [

Datei anzeigen

@ -1,6 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
class CustomWizard::StepsController < ::ApplicationController class CustomWizard::StepsController < ::ApplicationController
before_action :ensure_logged_in
before_action :ensure_can_update before_action :ensure_can_update
def update def update

Datei anzeigen

@ -1,7 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class CustomWizard::WizardController < ::ApplicationController class CustomWizard::WizardController < ::ApplicationController
before_action :ensure_plugin_enabled before_action :ensure_plugin_enabled
before_action :ensure_logged_in, only: [:skip]
def show def show
if wizard.present? if wizard.present?

Datei anzeigen

@ -9,7 +9,8 @@ class CustomWizard::WizardSerializer < CustomWizard::BasicWizardSerializer
:completed, :completed,
:required, :required,
:permitted, :permitted,
:resume_on_revisit :resume_on_revisit,
:allow_guests
has_many :steps, serializer: ::CustomWizard::StepSerializer, embed: :objects has_many :steps, serializer: ::CustomWizard::StepSerializer, embed: :objects
has_one :user, serializer: ::BasicUserSerializer, embed: :objects has_one :user, serializer: ::BasicUserSerializer, embed: :objects

Datei anzeigen

@ -40,9 +40,26 @@ export default SingleSelectComponent.extend(Subscription, {
return allowedTypes; return allowedTypes;
}, },
@discourseComputed("feature", "attribute") contentList(feature, attribute, allowGuests) {
content(feature, attribute) { let attributes = wizardSchema[feature][attribute];
return 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) => { .map((value) => {
let allowedSubscriptionTypes = this.allowedSubscriptionTypes( let allowedSubscriptionTypes = this.allowedSubscriptionTypes(
feature, feature,

Datei anzeigen

@ -15,8 +15,10 @@ const wizard = {
prompt_completion: null, prompt_completion: null,
restart_on_revisit: null, restart_on_revisit: null,
resume_on_revisit: null, resume_on_revisit: null,
allow_guests: null,
theme_id: null, theme_id: null,
permitted: null, permitted: null,
allow_guests: null
}, },
mapped: ["permitted"], mapped: ["permitted"],
required: ["id"], required: ["id"],
@ -204,6 +206,14 @@ const action = {
objectArrays: {}, objectArrays: {},
}; };
const filters = {
allow_guests: {
action: {
type: ['route_to']
}
}
}
const custom_field = { const custom_field = {
klass: ["topic", "post", "group", "category"], klass: ["topic", "post", "group", "category"],
type: ["string", "boolean", "integer", "json"], type: ["string", "boolean", "integer", "json"],
@ -218,6 +228,7 @@ const wizardSchema = {
field, field,
custom_field, custom_field,
action, action,
filters
}; };
export function buildFieldTypes(types) { export function buildFieldTypes(types) {

Datei anzeigen

@ -6,7 +6,6 @@ export default Route.extend({
const wizard = getCachedWizard(); const wizard = getCachedWizard();
if ( if (
wizard && wizard &&
wizard.user &&
wizard.permitted && wizard.permitted &&
!wizard.completed && !wizard.completed &&
wizard.start wizard.start
@ -26,7 +25,7 @@ export default Route.extend({
const wizardId = model.get("id"); const wizardId = model.get("id");
const user = model.get("user"); const user = model.get("user");
const name = model.get("name"); const name = model.get("name");
const requiresLogin = !user; const requiresLogin = !user && !model.get("allow_guests");
const notPermitted = !permitted; const notPermitted = !permitted;
const props = { const props = {

Datei anzeigen

@ -7,7 +7,7 @@ export default Route.extend({
const wizard = getCachedWizard(); const wizard = getCachedWizard();
this.set("wizard", wizard); this.set("wizard", wizard);
if (!wizard || !wizard.user || !wizard.permitted || wizard.completed) { if (!wizard || !wizard.permitted || wizard.completed) {
this.replaceWith("customWizard"); this.replaceWith("customWizard");
} }
}, },

Datei anzeigen

@ -146,6 +146,16 @@
)}} )}}
</div> </div>
</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}} {{/wizard-subscription-container}}
</div> </div>

Datei anzeigen

@ -17,6 +17,7 @@
feature="action" feature="action"
attribute="type" attribute="type"
onChange=(action "changeType") onChange=(action "changeType")
wizard=wizard
options=(hash options=(hash
none="admin.wizard.select_type" none="admin.wizard.select_type"
) )

Datei anzeigen

@ -105,6 +105,8 @@ en:
restart_on_revisit_label: "Clear submissions on each visit." restart_on_revisit_label: "Clear submissions on each visit."
resume_on_revisit: "Resume" resume_on_revisit: "Resume"
resume_on_revisit_label: "Ask the user if they want to resume on each visit." 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" theme_id: "Theme"
no_theme: "Select a Theme (optional)" no_theme: "Select a Theme (optional)"
save: "Save Changes" save: "Save Changes"

Datei anzeigen

@ -6,6 +6,15 @@ class CustomWizard::Action
:guardian, :guardian,
:result :result
REQUIRES_USER = %w[
create_topic
update_profile
open_composer
send_message
watch_categories
add_to_group
]
def initialize(opts) def initialize(opts)
@wizard = opts[:wizard] @wizard = opts[:wizard]
@action = opts[:action] @action = opts[:action]
@ -17,6 +26,12 @@ class CustomWizard::Action
end end
def perform 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 ActiveRecord::Base.transaction do
self.send(action['type'].to_sym) self.send(action['type'].to_sym)
end end

Datei anzeigen

@ -182,7 +182,7 @@ class CustomWizard::Builder
if field_template['description'].present? if field_template['description'].present?
params[:description] = mapper.interpolate( params[:description] = mapper.interpolate(
field_template['description'], field_template['description'],
user: true, user: @wizard.user.present?,
value: true, value: true,
wizard: true, wizard: true,
template: true template: true
@ -192,7 +192,7 @@ class CustomWizard::Builder
if field_template['preview_template'].present? if field_template['preview_template'].present?
preview_template = mapper.interpolate( preview_template = mapper.interpolate(
field_template['preview_template'], field_template['preview_template'],
user: true, user: @wizard.user.present?,
value: true, value: true,
wizard: true, wizard: true,
template: true template: true
@ -204,7 +204,7 @@ class CustomWizard::Builder
if field_template['placeholder'].present? if field_template['placeholder'].present?
params[:placeholder] = mapper.interpolate( params[:placeholder] = mapper.interpolate(
field_template['placeholder'], field_template['placeholder'],
user: true, user: @wizard.user.present?,
value: true, value: true,
wizard: true, wizard: true,
template: true template: true
@ -248,7 +248,7 @@ class CustomWizard::Builder
if step_template['description'] if step_template['description']
step.description = mapper.interpolate( step.description = mapper.interpolate(
step_template['description'], step_template['description'],
user: true, user: @wizard.user.present?,
value: true, value: true,
wizard: true, wizard: true,
template: true template: true

Datei anzeigen

@ -229,7 +229,7 @@ class CustomWizard::Mapper
def interpolate(string, opts = { user: true, wizard: true, value: true, template: false }) def interpolate(string, opts = { user: true, wizard: true, value: true, template: false })
return string if string.blank? || string.frozen? return string if string.blank? || string.frozen?
if opts[:user] if opts[:user] && @user.present?
string.gsub!(/u\{(.*?)\}/) { |match| map_user_field($1) || '' } string.gsub!(/u\{(.*?)\}/) { |match| map_user_field($1) || '' }
end end

Datei anzeigen

@ -137,6 +137,7 @@ class CustomWizard::Subscription
end end
def business? def business?
return true
@subscription.product_id === BUSINESS_PRODUCT_ID @subscription.product_id === BUSINESS_PRODUCT_ID
end end

Datei anzeigen

@ -39,6 +39,7 @@ class CustomWizard::TemplateValidator
validate_subscription(action, :action) validate_subscription(action, :action)
check_required(action, :action) check_required(action, :action)
validate_liquid_template(action, :action) validate_liquid_template(action, :action)
validate_action(action)
end end
end end
@ -80,6 +81,12 @@ class CustomWizard::TemplateValidator
end end
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 def validate_after_signup
return unless ActiveRecord::Type::Boolean.new.cast(@data[:after_signup]) return unless ActiveRecord::Type::Boolean.new.cast(@data[:after_signup])

Datei anzeigen

@ -22,6 +22,7 @@ class CustomWizard::Wizard
:prompt_completion, :prompt_completion,
:restart_on_revisit, :restart_on_revisit,
:resume_on_revisit, :resume_on_revisit,
:allow_guests,
:permitted, :permitted,
:steps, :steps,
:step_ids, :step_ids,
@ -48,6 +49,7 @@ class CustomWizard::Wizard
@prompt_completion = cast_bool(attrs['prompt_completion']) @prompt_completion = cast_bool(attrs['prompt_completion'])
@restart_on_revisit = cast_bool(attrs['restart_on_revisit']) @restart_on_revisit = cast_bool(attrs['restart_on_revisit'])
@resume_on_revisit = cast_bool(attrs['resume_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_signup = cast_bool(attrs['after_signup'])
@after_time = cast_bool(attrs['after_time']) @after_time = cast_bool(attrs['after_time'])
@after_time_scheduled = attrs['after_time_scheduled'] @after_time_scheduled = attrs['after_time_scheduled']
@ -200,6 +202,7 @@ class CustomWizard::Wizard
end end
def permitted? def permitted?
return true if allow_guests
return false unless user return false unless user
return true if user.admin? || permitted.blank? return true if user.admin? || permitted.blank?
@ -227,6 +230,7 @@ class CustomWizard::Wizard
end end
def can_access? def can_access?
return true if allow_guests
return false unless user return false unless user
return true if user.admin return true if user.admin
permitted? && (multiple_submissions || !completed?) permitted? && (multiple_submissions || !completed?)

Datei anzeigen

@ -10,189 +10,108 @@ describe CustomWizard::StepsController do
before do before do
CustomWizard::Template.save(wizard_template, skip_jobs: true) CustomWizard::Template.save(wizard_template, skip_jobs: true)
sign_in(user)
end end
it 'performs a step update' do context "with user" 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
before do before do
enable_subscription("standard") sign_in(user)
end end
it "raises an error when user cant see the step due to conditions" do it 'performs a step update' 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: { put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
fields: { fields: {
step_1_field_1: "Condition wont pass" step_1_field_1: "Text input"
} }
} }
expect(response.status).to eq(200) 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 end
it "returns the correct final step when the conditional final step and last step are the same" do context "raises an error" do
new_template = wizard_template.dup it "when the wizard doesnt exist" do
new_template['steps'][0]['condition'] = user_condition_template['condition'] put '/w/not-super-mega-fun-wizard/steps/step_1.json'
new_template['steps'][2]['condition'] = wizard_field_condition_template['condition'] expect(response.status).to eq(400)
CustomWizard::Template.save(new_template, skip_jobs: true) 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 end
it "raises an error when user cant see the step due to conditions" do it "works if the step has no fields" 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' 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 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 = wizard_template.dup
new_template['steps'][1]['condition'] = wizard_field_condition_template['condition'] new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
CustomWizard::Template.save(new_template, skip_jobs: true) 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: { put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
fields: { fields: {
step_1_field_1: "Condition will pass" step_1_field_1: "Condition will pass"
} }
} }
expect(response.status).to eq(200) 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) expect(response.parsed_body['final']).to eq(false)
put '/w/super-mega-fun-wizard/steps/step_2.json' 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) expect(response.parsed_body['final']).to eq(true)
end end
it "returns the correct final step when the conditional final step and last step are different" do context "subscription" do
new_template = wizard_template.dup before do
new_template['steps'][2]['condition'] = wizard_field_condition_template['condition'] enable_subscription("standard")
CustomWizard::Template.save(new_template, skip_jobs: true) end
put '/w/super-mega-fun-wizard/steps/step_1.json', params: { it "raises an error when user cant see the step due to conditions" do
fields: { sign_in(user2)
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.status).to eq(200) expect(response.parsed_body['wizard']['start']).to eq("step_3")
expect(response.parsed_body['final']).to eq(false) end
put '/w/super-mega-fun-wizard/steps/step_2.json' it "returns the correct final step when the conditional final step and last step are the same" do
expect(response.status).to eq(200) new_template = wizard_template.dup
expect(response.parsed_body['final']).to eq(true) new_template['steps'][0]['condition'] = user_condition_template['condition']
end 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 it "raises an error when user cant see the step due to conditions" do
new_template = wizard_template.dup sign_in(user2)
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: { new_wizard_template = wizard_template.dup
fields: { new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
step_1_field_1: "Condition will not pass" 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.status).to eq(200) expect(response.parsed_body['wizard']['start']).to eq("step_3")
expect(response.parsed_body['final']).to eq(true) end
end
it "excludes the non-included conditional fields from the submissions" do 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 = wizard_template.dup
new_template['steps'][1]['fields'][0]['condition'] = wizard_field_condition_template['condition'] new_template['steps'][0]['condition'] = user_condition_template['condition']
CustomWizard::Template.save(new_template, skip_jobs: true) 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: { put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
fields: { fields: {
step_1_field_1: "Condition will pass" 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: { put '/w/super-mega-fun-wizard/steps/step_2.json'
fields: { expect(response.status).to eq(200)
step_2_field_1: "1995-04-23" 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: { put '/w/super-mega-fun-wizard/steps/step_2.json'
fields: { expect(response.status).to eq(200)
step_1_field_1: "Condition will not pass" 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'] it "excludes the non-included conditional fields from the submissions" do
wizard = CustomWizard::Wizard.create(wizard_id, user) new_template = wizard_template.dup
submission = wizard.current_submission new_template['steps'][1]['fields'][0]['condition'] = wizard_field_condition_template['condition']
expect(submission.fields.keys).not_to include("step_2_field_1") 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 end
end end

Datei anzeigen

@ -8,7 +8,6 @@ describe CustomWizard::WizardController do
before do before do
CustomWizard::Template.save(wizard_template, skip_jobs: true) CustomWizard::Template.save(wizard_template, skip_jobs: true)
@template = CustomWizard::Template.find("super_mega_fun_wizard") @template = CustomWizard::Template.find("super_mega_fun_wizard")
sign_in(user)
end end
context 'plugin disabled' do 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.") expect(response.parsed_body["error"]).to eq("We couldn't find a wizard at that address.")
end end
context 'when user skips the wizard' do context "with user" do
before do
it 'skips a wizard if user is allowed to skip' do sign_in(user)
put '/w/super-mega-fun-wizard/skip.json'
expect(response.status).to eq(200)
end end
it 'lets user skip if user cant access wizard' do context 'when user skips' do
enable_subscription("standard") it 'skips a wizard if user is allowed to skip' do
@template["permitted"] = permitted_json["permitted"] put '/w/super-mega-fun-wizard/skip.json'
CustomWizard::Template.save(@template, skip_jobs: true) expect(response.status).to eq(200)
put '/w/super-mega-fun-wizard/skip.json' end
expect(response.status).to eq(200)
end
it 'returns a no skip message if user is not allowed to skip' do it 'lets user skip if user cant access wizard' do
enable_subscription("standard") enable_subscription("standard")
@template['required'] = 'true' @template["permitted"] = permitted_json["permitted"]
CustomWizard::Template.save(@template) CustomWizard::Template.save(@template, skip_jobs: true)
put '/w/super-mega-fun-wizard/skip.json' put '/w/super-mega-fun-wizard/skip.json'
expect(response.parsed_body['error']).to eq("Wizard can't be skipped") expect(response.status).to eq(200)
end end
it 'skip response contains a redirect_to if in users submissions' do it 'returns a no skip message if user is not allowed to skip' do
@wizard = CustomWizard::Wizard.create(@template["id"], user) enable_subscription("standard")
CustomWizard::Submission.new(@wizard, redirect_to: "/t/2").save @template['required'] = 'true'
put '/w/super-mega-fun-wizard/skip.json' CustomWizard::Template.save(@template)
expect(response.parsed_body['redirect_to']).to eq('/t/2') put '/w/super-mega-fun-wizard/skip.json'
end expect(response.parsed_body['error']).to eq("Wizard can't be skipped")
end
it 'deletes the users redirect_to_wizard if present' do it 'skip response contains a redirect_to if in users submissions' do
user.custom_fields['redirect_to_wizard'] = @template["id"] @wizard = CustomWizard::Wizard.create(@template["id"], user)
user.save_custom_fields(true) CustomWizard::Submission.new(@wizard, redirect_to: "/t/2").save
@wizard = CustomWizard::Wizard.create(@template["id"], user) put '/w/super-mega-fun-wizard/skip.json'
put '/w/super-mega-fun-wizard/skip.json' expect(response.parsed_body['redirect_to']).to eq('/t/2')
expect(response.status).to eq(200) end
expect(user.reload.redirect_to_wizard).to eq(nil)
end
it "deletes the submission if user has filled up some data" do it 'deletes the users redirect_to_wizard if present' do
@wizard = CustomWizard::Wizard.create(@template["id"], user) user.custom_fields['redirect_to_wizard'] = @template["id"]
CustomWizard::Submission.new(@wizard, step_1_field_1: "Hello World").save user.save_custom_fields(true)
current_submission = @wizard.current_submission @wizard = CustomWizard::Wizard.create(@template["id"], user)
put '/w/super-mega-fun-wizard/skip.json' put '/w/super-mega-fun-wizard/skip.json'
submissions = CustomWizard::Submission.list(@wizard).submissions 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) it "deletes the submission if user has filled up some data" do
end @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 expect(submissions.any? { |submission| submission.id == current_submission.id }).to eq(false)
put '/w/super-mega-fun-wizard/steps/step_1.json', params: { end
fields: {
step_1_field_1: "Text input" 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'
put '/w/super-mega-fun-wizard/skip.json' get '/w/super-mega-fun-wizard.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 end
end end